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 Accept:text/html Accept-Encoding:gzip, deflate Cookie:UM_distinctid=15d274 ')
        
       

        获取数据: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 Accept:text/html Accept-Encoding:gzip, deflate Cookie:UM_distinctid=15d274 a1=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协议

 - 请求头和请求体分割:


        - 请求体之间:

        - 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,])
        
        - 分页
        - 分组和聚合 
原文地址:https://www.cnblogs.com/liuwei0824/p/7778779.html