python-day74--知识总体总结
1. 课程介绍
- 数据类型
- 函数
- 面向对象三大特性:继承,封装,多态
- socket:本质传输字节;所有网络通信都基于socket
- 数据库设计:单表、FK、M2M (自己作业:自己领域设计表,相亲网站)
- 会用:html/css/js/bootstrap
2. Http知识
基于Socket --所有网络通信都基于socket
浏览器(格式一):
Web服务器(格式一):
MySQL客户端(格式二):
MySQL服务端(格式二):
无论是哪种传输格式,本质都是发送的字符串:
socket = socket.socket()
socket.connect((ip,端口))
socket.sendall(b'87ljas9802jlksjdf098jlksdf09')
在python2,和python3中字符串的区别:
-在python2中字符串是以bytes类型存在的,可以直接传输,在字符串前面加 u 才表示 unicode 类型
-在python3中字符串是以unicode类型存在,所有在传输时必须转化成bytes类型
浏览器发送GET请求数据格式:
请求首行; // 请求方式 请求路径 协议和版本,例如:GET /index.html HTTP/1.1 请求头信息; // 请求头名称:请求头内容,即为key:value格式,例如:Host:localhost 空行; // 用来与请求体分隔开 请求体。 // GET没有请求体,只有POST有请求体。
socket = socket.socket()
socket.connect((ip,端口))
socket.sendall(b'GET /index/?name=xxx&age=11 http1.1\r\nAccept:text/html\r\nAccept-Encoding:gzip, deflate\r\nCookie:UM_distinctid=15d274\r\n\r\n')
获取数据:request.GET.get('name')
、 浏览器发送POST请求数据格式:
请求首行; // 请求方式 请求路径 协议和版本,例如:GET /index.html HTTP/1.1 请求头信息; // 请求头名称:请求头内容,即为key:value格式,例如:Host:localhost 空行; // 用来与请求体分隔开 请求体。 // 请求体。
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')
在这里注意:
1- POST请求中在url路径后仍然可以携带数据,同样是用request.GET.get('name')获取
2- POST请求数据是以 a1=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"
扩展:
Http Header里的Content-Type一般有这三种:
application/x-www-form-urlencoded:数据被编码为名称/值对。这是标准的编码格式。 multipart/form-data: 数据被编码为一条消息,页上的每个控件对应消息中的一个部分。 text/plain: 数据以纯文本形式(text/json/xml/html)进行编码,其中不含任何控件或格式字符。postman软件里标的是RAW。
form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。
当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串追加到url后面,用?分割,加载这个新的url。
当action为post时候,浏览器把form数据封装到http body中,然后发送到server。 如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。 但是如果有type=file的话,就要用到multipart/form-data了。
当action为post且Content-Type类型是multipart/form-data,浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。
Django加工POST请求的数据:如果判断不能够解析,那么就直接放在request.body ,故取数据就需要到request.body中
{a1:123,a2:567}
request.POST 空
request.body b"{a1:123,a2:567}"
Http协议
- 请求头和请求体分割:\r\n\r\n - 请求体之间:\r\n - GET无请求体 - 无状态,短连接(无连接):socket请求响应断开 但是在 HTTP/1.1进行调整,客户端收到数据后会过一段时间再断开连接(避免在短时间内重复连接服务端,对服务端造成压力) - 请求头代表的意义 - user-agent:来源 - referer: 防盗链 - content-type:请求体是什么格式?
3. Django请求生命周期
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__方法
生命周期:
注意:
渲染工作在Django中执行完成后,字符串返回给浏览器。
但是:js,css额外再发一次请求仅获取静态文件,但是这次即使有模板语法也不会替换了
4. Django所有知识点:
知识点:
1. 路由规则
- /index/ func - /\d+/ func() - /?P<name(\d+)>/ func() - include - 反向生成URL: - {%url ""%} - reverse('a1',args=(1,))
2. 视图函数:
请求相关: request: method GET.get/.getlist POST COOKIES session user body request.FILES
响应相关:
render
HttpResponse
redirect
3. 模板语言
if for 索引: . 执行:不加括号自动执行函数 自定义标签、过滤器 : filter和simple_tag
4. ORM操作
创建表:
类
字段:INT,CHA,FK,M2M
操作表:(CURD)
13操作 - 补充: filter values vlaues_list all/values/values_list三者区别
only方法:
models.UserInfo.objects.all() - [obj(id,name,pwd,email),obj(id,name,pwd,email),]
data_list = models.UserInfo.objects.all().only('name','email') - [obj(id,name,email),obj(id,name,email),] # pwd字段未取值
for item in data_list:
item.id - 直接得到值
item.name -直接得到值
item.pwd - 同样可以得到值,但是效率低,因为是重新向数据库发送请求
defer方法:
data_list = models.UserInfo.objects.all().defer('name','email') - [obj(id,pwd),obj(id,pwd),obj(id,pwd),] #不取某些字段的值
for item in data_list:
item.id
item.pwd
双下划线查询
正向和反向
5.同学们整理知识点:
- 路由对应关系: - 模板继承 - 模板标记标签:for,if, - 返回: - HttpResponse - render - redirect - 启动 - Model类的创建,继承Model - migrate - 模板自定义函数:filter,sample_tag - cookie和Session - 基本配置文件: - 模板 - 静态文件 - MySQL 和proejct同名的目录的__init__ - Model中自定义方法:__str__ - Model操作: 创建: create save bulk_create 13中操作: filter(nage='xx") filter(**{age:18}) values('id') values(*['id','name']) values_list last first all distict exclude get update(age=11) update(**{age:11}) delete() - 多对多查询(查询) - URL别名,目的:反向生成URL /detail/(\d+)/ name = a1 from django.url import reverse url = reverse('a1',args=[6,]) - 分页 - 分组和聚合