一.Http知识:
1.基于socket
浏览器(格式一)
web服务器(格式一)
MYSQL客户端(格式二)
MYSQL服务端(格式三)
本质:
socket=socket.socket
socket.connect((ip,端口))
socket.sendall(b'scasa41sa4sd')
2.浏览器发送GET请求数据格式
socket=socket.socket
socket.connect((ip,端口))
socket.sendall(b'GET/index/?name=xxx&age=21 http1.1\r\nAccept:text/html\r\nAccept-Encoding:gzip'
deflate\r\nCookie:UM_distinctid=15d274\r\n\r\n')
request.GET.get('name')
3.浏览器发送POST请求数据格式:
socket = socket.socket()
socket.connect((ip,端口))
socket.sendall(b'POST /index/?name=xxx&age=11 http1.1\r\nAccept:text/html\r\nAccept-Encoding:gzip, deflate\r\nCookie:UM_distinctid=15d274\r\n\r\na1=123&a2=666&a3=xx')
Django加工POST请求的数据,
判断用户是否传递的是Django可以向request.POST中解析的数据?读取请求头Content-Type: application/x-www-form-urlencoded,那么就去解析request.body中的值,放置到request.POST中
a1=123&a2=666&a3=xx
request.POST.get('name')
request.body b"a1=123&a2=666&a3=xx"
Django加工POST请求的数据:{a1:123,a2:567}
request.POST 空
request.body b"{a1:123,a2:567}"
4.Http协议
- 请求头和请求体分割:\r\n\r\n
- 请求体之间:\r\n
- GET无请求体
- 无状态,短连接:socket请求响应断开
- 请求头代表的意义
- user-agent:来源
- referer: 防盗链
- content-type:请求体是什么格式?
二、Django的生命周期
1.wsgiref:
函数版本:
from wsgiref.simple_server import make_server
def run_server(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ]
if __name__ == '__main__':
httpd = make_server('127.0.0.1', 8000, run_server) # 请求一旦到来:run_server(..)
httpd.serve_forever()
类版本:
from wsgiref.simple_server import make_server
class WsgiHandler(object):
def __call__(self,environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ]
if __name__ == '__main__':
obj =WsgiHandler()
httpd = make_server('127.0.0.1', 8000, obj) # 请求一旦到来:obj(..)
httpd.serve_forever()
# 类() -> __init__
# 类()() -> __call__
生命周期:
---wsgi,中间件,路由,视图(数据,模板)
uwsgi,wsgi什么区别?
wsgi, web服务网关接口,协议
uwsgi实现协议
wsgiref实现协议
视图:
接收请求
返回内容
注意:
渲染工作在Django中执行完成后,字符串返回给浏览器。
但是:js,css额外再发一次请求仅获取静态文件