1.http概述
当前版本:1.1
http协议是一个客户端和服务端请求应答的标准TCP,如浏览器作为客户端发送请求到服务器指定端口 ,服务器将内容返回给服务器
2.协议格式
http定义了客户端与服务端数据交互的协议
request客户端向服务端发送请求报文 ,包括请求行(请求方法 空格 url 空格 协议版本 回车符换行符) ,请求头(key:value 回车符换行符 key:value 回车符换行符*2),请求数据
####一个request请求(get没有请求数据,携带在url上)
b'GET /favicon.ico HTTP/1.1 Host: 127.0.0.1:8888 Connection: keep-alive Sec-Fetch-Mode: no-cors User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36 Accept: image/webp,image/apng,image/*,*/*;q=0.8 Sec-Fetch-Site: same-origin Referer: http://127.0.0.1:8888/ Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 '
response服务端响应客户端数据 ,包括状态行(协议版本 空格 状态码 空格 状态码描述 回车符换行符),响应头(key:value 回车符换行符:value 回车符换行符*2),响应数据
HTTP/1.1 200 OK Content-Length: 643 Content-Type: text/plain; charset=UTF-8 Date: Thu, 15 Aug 2019 06:01:10 GMT
统一资源定位符:协议 地址 端口 路径 参数
请求头中一般有浏览器信息,cookie
响应头中一般有编码,时间
3.创建最简单的http服务端
import socket ser1 =socket.socket() ser1.bind(('127.0.0.1',8888)) ser1.listen(5) while 1: conn.addr = ser1.accept() data = conn.recv(1024) print(data) #请求request数据
conn.send(b'HTTP/1.1 200 OK Content-Type: text/html;charset=UTF-8 ') #响应数据http协议
conn.send('<h1>hello world</h1>'.encode('utf-8')) #数据
conn.close()
ser1.close()
4.动态页面与静态页面
动态页面就是与后端交互获取数据展示页面 ,静态页面就是展示页面不能交互
5.服务器程序与应用程序
web程序的三大块:1.负责socket连接请求 2.根据不同地址路径返回不同内容 3.返回动态页面
服务器程序完成了socket的连接的部分 ,但是它不关心业务逻辑代码处理连接请求
应用程序完成了业务逻辑相关代码 django框架完成这部分,返回什么页面 ,不考虑如何与客户端连接
问题:服务器程序与应用程序之间如何交互规则 ,wsgi服务器网关接口(生产的uwsgi ,django默认使用了wsgiref))
https://blog.csdn.net/qq_38038143/article/details/80291234 nginx+uwsgi+django
6.python的其他框架
django完成了业务逻辑代码+动态页面返回
flask完成了业务逻辑代码
tornado完成了服务器程序+业务逻辑代码+返回动态页面
7.软件设计架构模式
1)MVC框架
controller+model+view
控制器:业务逻辑 ,访问地址 ,执行函数
模型: 数据库模型避免sql
视图: 展示的动态页面
2)MTV框架
django根据mvc重新设计了一下model+templates+view
模型: orm数据库对象关系模型
模板: 负责展示给用户的页面
视图: 负责业务逻辑
额外的: url路由分发器
二者比较:
mvc可以说是广义 ,控制器对应mtv的视图函数与路由 ,视图对应模板 ,模型一直
8.django中的request与reponse对象
request请求对象是视图函数中的必要参数 ,对象封装了本次请求的http协议中的所有相关信息
request.method #请求类型, 在cbv中dispatch方法会将该类型与已知列表匹配 ,反射获取我们自定义的方法执行
request.GET.get('关键字') #从GET请求中获取参数 ,可以获取url中?后面的参数
request.GET.urlencode() #获取GET请求上的参数 ,并进行编码
request.POST.get('关键字') #从POST请求中获取表单中的内容值 ,表单中提交的内容可以根据这个方法获取
request.path_info #获取请求路径信息 ,不包含地址端口 ,?后的参数
request.body #请求体 ,仅post请求有 ,有明文的请求数据
request.scheme #本次请求协议 http https
request.encoding #获取提交数据的编码方式
request.COOKIES #获取COOKIES
request.session #获取session信息
request.FILES #用于上传文件 ,需要放入form表单中 且enctype="multipart/form-data"
response响应的几种方式
HttpResponse('字符串') #可以直接返回html标签 或字符串
render(request ,'模板文件名' ,{'参数1':1,'参数2':2}) #返回模板页面 ,还可以返回request对象和参数给模板文件名
redirect(重定向) #重定向到其他url
JsonResponse(data,safe=False) #将数据转为json类型返回 ,如果数据是字典可以不加safe=False
9.文件上传简例
####urls.py url(r'^file/', views.file.as_view(), name='file'), ####views.py class file(View): def post(self, request): upfile = request.FILES.get('upfile') with open('testfile.txt', mode='w', encoding='utf-8') as f1: for i in upfile.chunks(): f1.write(i.decode('utf-8')) return HttpResponse('上传完成') ####html模板 <form action="{% url 'file' %}" enctype="multipart/form-data" method="post"> <input type="file" name="upfile"> <button type="submit">上传</button> </form>