django 五 知识点总结 一

1.- restful 规范(10)
    - django rest framework框架(10)
    - 跨域
        - 为什么会有跨域?
        - 绕过浏览器同源策略就可以跨域。
            - jsonp
                动态创建script标签
                同源策略会阻止ajax请求;不阻止具有src属性的标签
                <script src='xxxx'></script>
            - cors
                设置响应头
2.为什么会有跨域?
    1、浏览器的同源策略限制
    2、跨域(域名,端口不一样都是跨域)
    3、同源对ajax是禁止的,ajax是XHR(XMLHttpRequest请求)对象来为底层做出来的
    解决跨域问题方案。
    1,在django中解决方案:
            - 中间件中设置响应头
            - django中的一个第三方组件:corscors方案,从浏览器出发,让浏览器允许url,允许响应头,允许方法。
        cors,设置响应头
                - 简单请求
                - 复杂请求
                    - options请求做预检
                    - PUT/POST....
                简单请求处理方案:在响应头中添加
                Access-Control-Allow-Origin=“允许跨域的url”,即跨省域时,请求头Origin的值,所以一般是获取Origin的值。
                Access-Control-Allow-Method=“*”,允许的方法。
            非简单请求处理方案:在相应头中添加
                Access-Control-Allow-Origin=“允许跨域的url”,即跨域时,可以获取请求头Origin的值。
                Access-Control-Allow-Method=“*”,允许的方法
                Access-Control-Request-Headers=“Content-Type,自定义的header的key”。
             带cookies的跨域解决:在响应头添加
                Access-Control-Allow-Credentials,="true",允许使用cookies

    2,jsonp方案,同源允许src,所以利用这点,可以使用script标签,
            - jsonp,在客户端动态创建一个script标签
                1.客户端:创建一个
                    <script src='http://www.jxntv.cn/data/jmd-jxtv2.html'></script>
                    <script>
                        function func(arg){
                            alert(arg);
                        }
                    </script>
                2.服务端:接收到请求并处理并返回值 "func('success')"
                    相当于:
                        <script>
                            func('success')
                        </script>
            jsonp缺点:jsonp只能发送GET请求,而且前后端函数名要相同,所以就有了cors。
            
3. 你理解的http协议?  
    - 建立在tcp之上
       1. Http协议?
        Http协议就是一个传输数据格式。
        我原来学习django框架,从socket服务端开始学起。
        自己创造了一个socket服务器来充当:网站。
        浏览器当socket客户端。
        更清楚的明白到底http协议是什么?
            - 请求头 请求头
            - 响应头 响应头
        一次请求响应后,断开连接。
    2. 常见请求头
        
    3. 常见的请求体?
        Form表单提交:
            POST /index http1.1\r\nhost:www.luffycity.com...\r\n\r\nusername=alex&password=123&...
        Ajax请求:
            POST /index http1.1\r\nhost:www.luffycity.com...\r\n\r\nusername=alex&password=123&...
            POST /index http1.1\r\nhost:www.luffycity.com...\r\n\r\n{“username”:"alex","password":123}
            
        补充:django中获取请求体
            - request.POST
            - request.body
                  
4. 常见请求头
        - Content-Type
        - User-Agent
        - referer,可以做图片防盗链。
        - Host
        - cookies
5. 常见的请求方法:
        - GET/POST/DELETE/PUT/PATCH/OPTIONS
6. 常见的状态码:
        - 200
        - 301/302 301临时重定向 302永久重定向
        - 403/404 403错表示资源不可用。服务器理解客户的请求,但拒绝处理它,通常由于服务器上文件或目录的
                  权限设置导致的WEB访问错误。 404找不到页面
        - 500 --- 后端程序问题
7. 序列化
    - source
        source='get_level_display'
        source='course.title'
    - method
8. ORM补充:
        a. 需求: 只取某n列
            queryset=[ {},{}]
            models.User.objects.all().values( 'id','name')
            
            queryset=[ (),()]
            models.User.objects.all().values_list( 'id','name')
            
            queryset=[ obj,obj]
            result = models.User.objects.all().only('id','name','age')  性能好
            # result = models.User.objects.all().defer('id','name','age')   defer查找跟olny相反的字段
            for item in reuslt:
                print(item.id,item.name,item.age)
        b. 需求: 打印所有用户姓名以及部门名称
            
            class depart:
                title = ....
            
            class User:
                name = ...
                dp = FK(depart)
            select * from user
            result = models.User.objects.all()
            for item in result:
                print(item.name)
            
            select * from user left join depart on user.dp_id = depart.id
            result = models.User.objects.all().selected_related('dp') selected_related主动做关联表提高性能
            for item in result:
                print(item.name,item.dp.title )
9.支付宝支付
        a. 去支付宝申请
            - 正式:营业执照
            - 测试:沙箱测试环境
                    APPID:2016082500309412
                    买家:
                        nbjsag5718@sandbox.com
                        111111
                        111111
        b. 开发程序
            SDK
                - 官方
                - github
                    pay.py
                    依赖:pip3 install pycryptodome
            
            公钥私钥:
                - 应用公钥
                    - 支付宝公钥
                - 应用私钥
                
10.wsgi
    - web服务网关接口
    - 实现该协议的模块:
            - wsgiref
            - werkzurg
            - uwsig
11. 使用中间件做过什么?
        - 内置
            - csrf
            - session
        - 自定义
            - 登录认证
            - 权限
            - cors
12.6. 中间件中有多少个方法?
        5个
        - 应用场景:
            - 登录认证,不再需要在每个函数中添加装饰器
            - 权限,当用户登录时候获取当前用户所有权限并放入session,然后再次访问其他页面,获取当前url并在session中进行匹配。如果没有匹配成功,则在中间件返回“无权访问”
            - 跨域,
                    - jsonp,动态创建一个script标签。
                    - cors,设置响应头
                    应用:本地开始前后端分离的时使用。
13.FBV和CBV是什么?以及优缺点。
        CBV(class base views) 就是在视图里使用类处理请求
        CBV的执行流程:
            浏览器向服务器端发送请求,服务器端的urls.py根据请求匹配url,找到要执行的视图类,
            执行dispatch方法区分出是POST请求还是GET请求,执行views.py对应类中的POST方法或GET方法。
        FBV(function base views) 就是在视图里使用函数处理请求。
14.rest api
15.django rest framework的作用?
        快速搭建基于restful规范的接口。
        - 访问频率控制原理:
            匿名:
                1.1.1.1:[时间,时间,时间,时间,]
            登录:
                user:[时间,时间,时间,时间,]
            
            默认将访问记录放在缓存中:redis/memcached
        - 序列化
            from rest_framework.serializers import Serializer

            class XX(Serializer):
                pass
            ser =XX(queryset,many=True) # ListSerializer对象
            ser =XX(obj, many=False)    # XX对象
                
        - 列表生成式
        
        - 根据字符串的形式,自动导入模块并使用反射找到模块中的类【参考:s9day108】。
17.如何实现的访问频率控制?
        匿名用户:无法控制,因为用户可以换代理IP
        登录用户:如果有很多账号,也无法限制
        参考源码:from rest_framework.throttling import SimpleRateThrottle
18.update_or_create 更新或创建
19.django组件:contenttype
        组件的作用:可以通过两个字段让表和N张表创建FK关系
        表结构:
            from django.db import models
            from django.contrib.contenttypes.models import ContentType

            from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation

            class DegreeCourse(models.Model):
                """学位课程"""
                name = models.CharField(max_length=128, unique=True)
                course_img = models.CharField(max_length=255, verbose_name="缩略图")
                brief = models.TextField(verbose_name="学位课程简介", )


            class Course(models.Model):
                """专题课程"""
                name = models.CharField(max_length=128, unique=True)
                course_img = models.CharField(max_length=255)

                # 不会在数据库生成列,只用于帮助你进行查询
                policy_list = GenericRelation("PricePolicy")


            class PricePolicy(models.Model):
                """价格与有课程效期表"""
                content_type = models.ForeignKey(ContentType)  # 关联course or degree_course
                object_id = models.PositiveIntegerField()

                #不会在数据库生成列,只用于帮助你进行添加和查询
                content_object = GenericForeignKey('content_type', 'object_id')


                valid_period_choices = (
                    (1, '1天'),
                    (3, '3天'),
                    (7, '1周'), (14, '2周'),
                    (30, '1个月'),
                    (60, '2个月'),
                    (90, '3个月'),
                    (180, '6个月'), (210, '12个月'),
                    (540, '18个月'), (720, '24个月'),
                )
                valid_period = models.SmallIntegerField(choices=valid_period_choices)
                price = models.FloatField()

        使用:
            # 1.在价格策略表中添加一条数据
            # models.PricePolicy.objects.create(
            #     valid_period=7,
            #     price=6.6,
            #     content_type=ContentType.objects.get(model='course'),
            #     object_id=1
            # )

            # models.PricePolicy.objects.create(
            #     valid_period=14,
            #     price=9.9,
            #     content_object=models.Course.objects.get(id=1)
            # )

            # 2. 根据某个价格策略对象,找到他对应的表和数据,如:管理课程名称
            # price = models.PricePolicy.objects.get(id=2)
            # print(price.content_object.name) # 自动帮你找到

            # 3.找到某个课程关联的所有价格策略
            # obj = models.Course.objects.get(id=1)
            # for item in obj.policy_list.all():
            #     print(item.id,item.valid_period,item.price)
            #
20. django请求生命周期
        - wsgi, 他就是socket服务端,用于接收用户请求并将请求进行初次封装,然后将请求交给web框架(Flask、Django)
        - 中间件,帮助我们对请求进行校验或在请求对象中添加其他相关数据,例如:csrf、request.session
        - 路由匹配
        - 视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、templates => 渲染
        - 中间件,对响应的数据进行处理。
        - wsgi,将响应的内容发送给浏览器。
        
21. restful 规范
        什么是接口?
            - URL
            - 约束
                # 约束继承(实现)了他的类中必须含有IFoo中的方法
                interface IFoo:
                    def func(self): pass
                    
                    
                class Foo(IFoo):
                    def func(self):
                        print(11111)
        

        1. 根据method不同,进行不同操作
            GET/POST/PUT/DELETE/PATCH
        2. 面向资源编程
            http://www.luffycity.com/salary
        
        3. 体现版本
            http://www.luffycity.com/v1/salary
            http://www.luffycity.com/v2/salary
            
            https://v4.bootcss.com/
            https://v3.bootcss.com/
        4. 体现是API
            http://www.luffycity.com/api/v1/salary
            http://www.luffycity.com/api/v2/salary  
            
            http://api.luffycity.com/v1/salary  
            http://api.luffycity.com/v2/salary  
        5. https
            https://www.luffycity.com/api/v1/salary
            https://www.luffycity.com/api/v2/salary
            
        6. 响应式设置状态码
            200
            300
            400
            500
            return HttpResponse('adfasdf',status=300)
        
        7. 条件
            https://www.luffycity.com/api/v2/salary?page=1&size=10
        
        8. 返回值
            https://www.luffycity.com/api/v2/salary
            GET: 所有列表
            {
                code: 10000,
                data: [    
                    {'id':1,'title':'高亮'},
                    {'id':1,'title':'龙泰'},
                    {'id':1,'title':'小东北'},
                ]
            }
                
            POST: 返回新增的数据
                {'id':1,'title':'高亮'}
                
            https://www.luffycity.com/api/v2/salary/1/
            GET: 获取单条数据
                    {'id':1,'title':'高亮'}
            PUT:更新
                    {'id':1,'title':'高亮'}
            PATCH: 局部更新
                    {'id':1,'title':'高亮'}
            DELETE:删除
                
        9. 返回错误信息
            {
                code: 100001,
                error: 'xxx错误'
            }
        
        10. Hypermedia API
            ret = {
                code: 1000,
                data:{
                    id:1,
                    name:'小强',
                    depart_id:http://www.luffycity.com/api/v1/depart/8/
                }
            }
    
        建议大家使用restful规范
路飞学成的表结构
  路飞表结构:
        - 课程(13表)
            - 课程大类
            - 课程子类
            - 学位课
                - 讲师
                - 奖学金
            - 专题课(学位课模块表)
            - 价格策略(contenttype)
            - 课程详细(o2o -> 水平分表)
            - 常见问题
            - 课程大纲
            - 章节
            - 课时
            - 作业
        - 深科技(4+2)
            - 用户表
            - 用户token
            - 文章来源
            - 文章表
            - 通用评论表
            - 通用收藏表

 


由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送

(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。

(3) 服务器关闭客户端的连接,发送一个FIN给客户端。

(4) 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。
 

 

posted @ 2018-05-31 15:48  liang哥哥  阅读(78)  评论(0)    收藏  举报