django(django框架了解,http协议)
Django框架
学习目的:
完成web应用的编写
django的作用:
0.业务逻辑分发(路由分发)
1.业务逻辑实现:
业务逻辑根据分发来完成具体的事,再根据具体事的需求,和页面或数据库交互,返回处理后的结果
2.页面模板的渲染
3.数据库的交互
b/s架构
brower浏览器:不用自己写
server服务端:需要使用支持wsgi的server,也不用自己写
Python的web框架
a.socket b.页面路由 c.模块渲染
1.Django a 用的wsgiref b 自己写 c自己写,
优点:功能全面
2.Flask a用的第三方,b自己写的,c自己写的,
优点:小而轻
3.Tornado a 自己写 b 自己写 c自己写
优点:支持高并发
http协议
hyperText Transport Protocol超文本传输协议
1.基于TCP/IP协议基础上的应用层协议,底层实现仍为socket
2.基于请求-响应模式:通信一定是从客户端开始,服务端接收到客户端一定会做出对应响应
3.无状态:协议不对任何一次通信状态和任何数据做保存
4.无连接:一次连接只完成一次请求-响应,请求-响应完毕后会立即断开连接
http工作原理(事务)
一次http操作称之为一个事务,工作过程可分为四步:
1.客户端与服务端建立连接
2.客户端发生一个http协议指定格式的请求
3.服务器端接收到请求后,响应一个http协议指定格式的响应
4.客户端将服务器的响应显示展现给用户
http指定格式的请求和响应
请求:
1.请求行
请求行以一个方法符号开头,以空格分开,后面跟着请求的URL和协议的版本。
POST (请求方式)/login(请求路径)/ HTTP/1.1(请求协议)\r\n
2.请求头
请求头包括本机信息、浏览器信息等等,当然,也包括URL中?后面的参数
3.请求体
需要发送的数据
GET:请求体放在请求路径后拼接
POST:以数据包方式单独发送
request.method
响应
1.响应行
2.响应头
3.响应体
响应行是必须的,其他可选
HTTP/1.1 200 OK\r\n
\r\n
LOGIN success
响应行,响应头,响应体之间以\r\n分隔
响应头各行之间也需要以\r\n区分结束
使用TCP/IP协议的套接字给网页响应时
需要遵循http协议
正确的响应
响应头决定响应体返回什么样的方式数据
browser.send(b"HTTP/1.1 200 OK\r\n")#响应行必须有
browser.send(b'Content-type:text/html\r\n')#响应头,服务于响应体(了解)
browser.send(b"\r\n")#响应行,响应头,响应体之间需要\r\n
browser.send(b'hello world')
browser.close()#无连接,1次请求-响应后断开连接]
wsgi的server
from wsgiref import simple_server
#请求的数据被解析在env字典中
#res规定http的响应结果
#返回的是装有二进制数据的列表
#请求路径:env["PATH_INFO"]
#请求方法:env["REQUEST_METHOD"]
#res("200 OK",[("Content-type,'text/html'")])
def app(env,res):
res("200 OK",[("Content-type","text/html")])
return []
server = simple_server.make_server('127.0.0.1',8803,app)
#服务常启
server.serve_forever()
数据的获取
1.get请求
数据在env的query_string字段中
res = env(QUERY_STRING)#是二进制数据...
2.post请求
数据长度content_length
数据存放的io流 wsgi.input
lenth = int(env["CONTENT_LENGTH"])
res = env["wsgi.input"].read(lenth)
使用jinja2渲染动态网页
1.from jinja2 import Template
2.读取文件
with open("login.html","rt")as f:
msg = f.read()
3.渲染数据得到模板tem
tem = Template(msg)
4.模块替换数据
msg = tem.render(result=res)
return msg.encode("utf-8")
result 在 html 中的表示{{result}}
使用模块的好处:(可以传字典)
tem.render(result = res,my_dic = dic)
html
{{my_dic}}
{% for k in my_dic %}
<div>{{k}}:{{my_dic[k]}}
</div>
{% endfor %}