首先是建立数据表
一对一
一对多
多对多
1 自己开发Web框架
开发Web框架涉及的内容
互联网的通信都是基于sock进行通信的
HTTP:无状态、短连接
TCP:不断开
WEB应用(网站):
HTTP协议:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| 发送: POST /index HTTP/1.1 Host: 127.0.0.1:8080 Connection: keep-alive Cache-Control: max-age=0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36 HTTPS: 1 Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-CN,zh;q=0.8 Cookie: csrftoken=hNmu2JOtntGMN0hSRSPmMQk2newEb3o8zb6pXW5Cc3m54IaA5VlTkUvqWsFezpni p=123 响应: 200 OK Cache-Control:public, max-age=15 Connection:keep-alive Content-Encoding:gzip Content-Type:text/html; charset=utf-8 Date:Wed, 14 Jun 2017 01:21:17 GMT Expires:Wed, 14 Jun 2017 01:21:33 GMT Last-Modified:Wed, 14 Jun 2017 01:21:03 GMT Transfer-Encoding:chunked Vary:Accept-Encoding X-Frame-Options:SAMEORIGIN X-UA-Compatible:IE=10 用户在页面看到的内容“字符串”(看到页面效果,由于浏览器解析)
|
浏览器(socket客户端)
2. www.cnblogs.com (42.121.252.58,80)
sk.socket()
sk.connect((42.121.252.58,80))
sk.send('我想要xx')
5. 接收
6. 连接断开
博客园(socket服务端)
1. 监听ip和端口(42.121.252.58,80)
while True:
用户 = 等待用户连接
3. 收到'我想要xx'
4. 响应:“好”
用户断开
下面的代码构成了一个简单的web框架:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import socket sock = socket.socket() sock.bind(('127.0.0.1',8080)) sock.listen(5) while True: conn,addr = sock.accept() data = conn.recv(8096) conn.send(b"HTTP/1.1 200 OK\r\n\r\n") conn.send(b'123123') conn.close()
|
2 Django 框架配置
2.1 新建Django工程
2.1.1 在cmd中建立工程
django-admin startproject 工程名
Python3 manage.py runserver

2.2 设置HTML模板路径
新建HTML的模板存放的文件templates,之后在setting配置文件中添加templates的路径:
‘DIRS’: [os.path.join(BASE_DIR,’templates’)],
2.3 配置静态文件路径
静态文件包括css文件,js文件,图片等
新建静态文件static(可以是别的名字),在setting文件中添加
1 2 3 4
| STATIC_URL = '/static/' STATICFILES_DIRS =( os.path.join(BASE_DIR,'static'), )
|
注意:
- 拼接路径,最后用逗号,否则会报错
- 这里的static代表前缀,在HTML文件中引入css文件的时候在前面添加,
1
| <link rel="stylesheet" href="/static/comments.css"> 这里的static是前缀
|
2.4注释一句
这里先把setting中下面的一句话注释
1 2 3 4 5 6 7 8 9
| MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
|
2.5 django工程目录
1 2 3 4 5 6 7 8 9 10
| mysite | - mysite ===============对整个程序进行配置 | - __init__.py | - settings.py ============配置文件 | - url.py ==============URL对应关系 | - wsgi.py ============遵循WSGI规范,上线一般使用uwsgi+nginx | - manage.py ============管理Django程序 : python manage.py : python manage.py startapp xxx : python manage.py makemigrations : python manage.py migrate
|
3 Django 路由系统
路由系统是对URL进行的配置,urls.py文件中进行操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| from django.shortcuts import HttpResponse,render def login(request): return HttpResponse('hello') def index(request): return render(request,'index.html') urlpatterns = [ url(r'^login/', login), url(r'^index/', index), ]
|
4 模板标记
HTML文件在django中是作为模板使用的,因为涉及数据的交互,所以是动态的,通常是把内容添加到HTML中。在HTML中是通过特殊符号进行占位的,称为模板标记。
模板的原理是:http是传输的过程中国是通过响应头和相应体进行通信的。中间是两个换行符,传输的是字节,模板是通过字符拼接的,形成完整的响应体
在django中是通过 双括号 对模板进行添加的
添加的方式:
- 通过字典的方式
- 通过列表取,索引用. 的方法
- 通过for循环取
能够和HTML结合起来使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| <body> <h1>index</h1> <p>{{ name }}</p> <p>{{ users.0 }}</p> <p>{{ users.1 }}</p> <p>{{ user_dict.k1 }}</p> <p>{{ user_dict.k2 }}</p> <p>循环</p> <ul> {% for item in users %} <li>{{ item }}</li> {% endfor %} </ul> <table border="1px"> {% for row in user_list_dict %} <tr> <td>{{ row.id }}</td> <td>{{ row.name }}</td> <td>{{ row.email }}</td> <td> <a href="">编辑</a> |<a href="/del/?nid={{ row.id }}">删除</a> </td> </tr> {% endfor %} </table> </body>
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| def index(request): return render(request, 'index.html', { 'name':'abc', 'users':['aaa','bbb'], 'user_dict':{'k1':'v1','k2':'v2'}, 'user_list_dict':[ {'id':1,'name':'aaa','email':'aaa@aaa.com'}, {'id':2,'name':'bbb','email':'bbb@bbb.com'}, {'id':3,'name':'ccc','email':'ccc@ccc.com'}, ] })
|
return redirect(‘/index/‘) # 重定向才行 上面不行
使用render跳转不行
参考内容:
http://www.cnblogs.com/yin-jingyu/archive/2011/08/01/2123548.html
https://my.oschina.net/asktao/blog/894367
http://www.cnblogs.com/wupeiqi/articles/5237704.html