uWSGI ,WSGI和uwsgi的区别
WSGI:通讯规范,用于web服务器 与 框架之间的通信规范
uwsgi:同样是通讯协议,他是uWSGI服务器的独占协议,用以定义传输信息类型
uWSGI:web服务器,它实现了WSGI、uwsgi、http协议
django 和 flask 内部均没有实现socket,而是wsgi实现
wsgi是web服务网管接口,它是一个协议,实现它的协议有:wsgiref / werkzeug / 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<pk> 查询单个资源
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请求生命周期
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