Django记录

uWSGI ,WSGI和uwsgi的区别

WSGI:通讯规范,用于web服务器 与 框架之间的通信规范
uwsgi:同样是通讯协议,他是uWSGI服务器的独占协议,用以定义传输信息类型
uWSGI:web服务器,它实现了WSGI、uwsgi、http协议

django 和 flask 内部均没有实现socket,而是wsgi实现
wsgi是web服务网管接口,它是一个协议,实现它的协议有:wsgiref / werkzeug / uwsgi 
uWSGI ,WSGI和uwsgi的区别

Django的请求生命周期

发起请求完整流程图
浏览器
    发送请求(HTTP协议)
 
web服务网关接口
    1.请求来的时候解析封装
        响应走的时候打包处理
 
    2.django默认的wsgiref模块不能承受高并发 最大只有1000左右
        上线之后会替换成uwsgi来增加并发量
    
    3.uWSGI、WSGI、uwsgi的关系
        WSGI是一个应用服务器(如uWSGI)与应用框架(如Django、Flask)通信的一种规范(协议)
        uwsgi是一个Web服务器(如nginx)与应用服务器(如uWSGI)通信的一种规范(协议)
        uWSGI是web服务器
 
django后端
    1.django中间件(暂时不考虑 后面讲)
        类似于django的保安 门户
        
    2.urls.py         路由层
        识别路由匹配对应的视图函数
    
    3.views.py        视图层
        网站整体的业务逻辑
        
    4.templates文件夹  模版层
        网站所有的html文件
    
    5.models.py        模型层
        ORM
额外扩展:缓存数据库的作用

使用wsgiref手写一个简单的框架(和Werkzeug很相似)

from wsgiref.simple_server import make_server


class MyWsgi(object):

    def __call__(self, environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/html')])
        return [b'Hello, World!']

    def run(self):
        # 内部处理请求时会调用self(),因此会触发__call__方法
        # self()
        httpd = make_server('127.0.0.1', 8000, self)
        httpd.serve_forever()


if __name__ == '__main__':
    my_wsgi = MyWsgi()
    my_wsgi.run()

Django常用中间件

MIDDLEWARE_CLASSES = [
    # 缓存中间件
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
    # 会话中间件
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    # 通用中间件
    'django.middleware.common.CommonMiddleware',
    # 为request/response提供了几种安全改进
    'django.middleware.security.SecurityMiddleware',
    # CSRF保护中间件
    'django.middleware.csrf.CsrfViewMiddleware',
    # 用户授权中间件
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    # 消息中间件
    'django.contrib.messages.middleware.MessageMiddleware',
    # 点击劫持防御中间件
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    # 本地化中间件
    'django.middleware.locale.LocaleMiddleware',
]

Django REST framework主要用途

1. 序列化和反序列化
2. 封装视图、路由
3. 认证
4. 权限
5. 限流

RESTful 接口规范

restful:翻译成中文【资源状态转换】,约定面向资源开发,接口中不再使用动词去形容接口的行为,而是直接通过请求方式的不同来指定其行为。

POST    新增资源
DELETE  删除资源
PUT     修改资源
GET     查询所有资源
GET 查询单个资源

Django CBV类View的主要方法、属性及作用

源码核心逻辑

# 用户请求进来,比如GET、POST请求:/book/
get请求/book/ => view() => return self.dispatch() => return get()
post请求/book/ => view() => return self.dispatch() => return post()


class View():

    @classmethod
    def as_view(cls):
        """【注意】只允许被类调用,返回一个view函数"""

        def view():
            """调用子类的dispatch方法,并返回"""
             # 子类BookView()实例
            self = cls()
            return self.dispatch(request,*args,**kwargs)

        return view

    def dispatch(self,request,*args,**kwargs):
        """核心逻辑【分发路由】,通过反射getattr获取子类对应的视图函数,并调用及返回"""

        # self获取'get'、'post'等属性,将得到一个视图函数
        handler = getattr(self,request.method.lower())

        # 真正去执行用户编写的视图函数逻辑
        return handler(request,*args,**kwargs)

Django-rest-framework 类 APIView的主要方法、属性及作用

源码核心逻辑

class APIView(View):
    """继承于CBV的View"""

    def as_view(cls):
        """调用父类的as_view方法"""
        view = super().as_view()
        return view

    def dispatch(self,request,*args,**kwargs):
        """重写路由分发规则"""

        # 构建新request
        self.request = self.initialize(request,*args,**kwargs)
        # 初始化:认证、权限、限流
        self.initial(request,*args,**kwargs)
        # 分发逻辑(和CBV的View类分发逻辑一致)
        handler = getattr(self,request.method.lower())

        # 调用视图函数,并返回
        return handler(request,*args,**kwargs)

APIView请求生命周期

APIView类请求生命周期

Django-rest-framework 类 GenericAPIView的主要方法、属性及应用

源码核心逻辑

class TestSerializers(serializers.ModelSerializer):
    # test_id是自定义的显示字段,source的是模型类里面对应的字段
    test_id = serializers.IntegerField(source='id')

    class Meta:
        # 模型类
        model = RoomAppointment
        # 返回所有字段,和 exclude 属性互斥
        # fields = '__all__'
        # 返回字段
        fields = ['id','name']
        # 排除字段
        exclude = ['id']

class GenericAPIView(APIView):
    """继承于drf的APIView"""

    # queryset 属性名字不能改变,且必须定义
    queryset = Test.objects.all()
    # serializer_class 属性不能改变,且必须定义
    serializer_class = TestSerializers

    def get_queryset(self):
        """获取queryset"""
        pass

    def get_object(self):
        """获取obj对象,【注意】需要在调函函数传递 pk 字段,此字段必传且名字规定,如果要更改字段名称,要继承重写配置"""
        pass

    def get_serializer(self,*args,**kwargs):
        """获取serializer对象,即是定义的serializer_class的实例对象"""
        pass

    def get_serializer_class(self):
        """获取serializer类"""
        pass

版权声明:
作者:感冒的梵高
链接:https://www.techfm.club/p/44717.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>