django-rest-framework-源码解析001-整体框架
简介
Django Rest Framework是⼀个强⼤且灵活的⼯具包,主要⽤以构建RESTful风格的Web API。
Django REST Framework(简称DRF)可以在Django的基础上迅速实现API,并且⾃⾝还带有基于WEB的测试和浏览页⾯,可以⽅便的测试⾃⼰的API。DRF⼏乎是Django⽣态中进⾏前后端分离开发的默认库。
Django REST Framework具有以下功能和特性:
⾃带基于Web的可浏览的API,对于开发者⾮常有帮助
⽀持OAuth1a 和OAuth2认证策略
⽀持ORM或⾮ORM数据源的序列化
⾼可⾃定制性,多种视图类型可选
⾃动⽣成符合 RESTful 规范的 API ⽀持
OPTION、HEAD、POST、GET、PATCH、PUT、DELETE等HTTP⽅法
根据 Content-Type 来动态的返回数据类型(如HTML、json)
细粒度的权限管理(可到对象级别)
丰富的⽂档和强⼤的社区⽀持
Mozilla、Red Hat、 Heroku和Eventbrite等知名公司正在使⽤
安装
在项⽬环境中直接pip安装
pip install djangorestframework
安装完毕,在项⽬配置⽂件中,注册app:
怎么将linux系统改成中文
INSTALLED_APPS = (
...
'rest_framework',
)
如果你想使⽤基于浏览器的可视化的API⽬录,并且希望获得⼀个登录登出功能,那么可以在根路由下添加下⾯的路由('api-auth/' 可以随意指定),这个功能类似Django⾃带的admin后台:
urlpatterns = [
...
path('api-auth/', include('rest_framework.urls'))
]
为了登录操作,也许你还要⽣成数据表,创建超级⽤户。
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
DRF模块
DRF有⼏⼤功能模块:
  1. 序列化模块(Serializer): (rest_framework.serializers) 对数据进⾏序列化和反序列化, 序列化即通过django的model对象创建序列化对象, 进⽽将对应的字段转换为json格式, 反序列化即通过请求中的json数据创建反序列化对象, 进⽽将json数据转化为字典格式, 序列化模块中
提供了常⽤的三种序列化类:
foreign外国的怎么读    1.1 Serializer类(rest_framework.serializers.Serializer): 基础的序列化类, 需要⾃⼰编写所有的字段以及create和update⽅法,⽐较底层,抽象度较低
    1.2 ModelSerializer类(rest_framework.serializers.ModelSerializer): 更常⽤的序列化类, 不需要⼿动编写所有字段, 会根据指向的model⾃动⽣成默认的字段和简单的create和update⽅法
    1.3 ListSerializer类(rest_framework.serializers.ListSerializer): 当使⽤ModelSerializer进⾏改(⼀次更新多个model对象)时, 需要⽤到ListSerializer并重写update()⽅法
  2. 请求模块(Request): (quest.Request) 对django的原⽣request对象进⾏⼆次封装, 将原⽣request对象封装⾄DRF⾃⼰的Request的_request属性中, 并新增了解析器, 认证器等属性
  3. 解析模块(Parses) : (rest_framework.parser) 对request中携带的常见Content-Type进⾏相应的解析:
    3.1 JSONParser类(rest_framework.parser.JSONParser): 解析Content-Type为 application/json 的数据
python请求并解析json数据
    3.2 FormParser类(rest_framework.parser.FormParser): 解析Content-Type为 application/x-www-form-urlencoded 的数据(普通form 表单提交的数据)
    3.3 MultiPartParser类(rest_framework.parser.MultiPartParser): 解析Content-Type为 multipart/form-data 的数据(⽐普通form表单⽀持的类型更多)
    3.4 FileUploadParser类(rest_framework.parser.FileUploadParser): 解析Content-Type为 */* 的数据, ⼀般为⽂件类型的数据
  4. 认证模块(Authentication): (rest_framework.authentication) 对request进⾏验证, 判断请求的⽤户是否合法, ⼀般将⽤户分成三类: 游客(不携带认证信息的匿名⽤户), ⾮法⽤户(携带了认证信息的⽤户但信
息是错误的), 合法⽤户(携带了正确的认证信息)
  5. 权限模块(Permission): (rest_framework.permission) 对通过认证的⽤户判断其是否有权限访问该页⾯
  6. 频率模块(Throttle): (rest_framework.throttling) 限制同⼀个访问客户端的IP或⽤户等指标每秒访问服务器的次数
  7. 响应模块(Response): (sponse) 将序列化后的数据以及其他常见response数据如http状态码/headers等封装成Response对象
  8. 异常模块(Exception): (ptions) 捕获认证模块/权限模块/频率模块/⾃定义视图类/响应模块中所抛出的异常, 并将异常信息转化为json返回给前端
  9. 渲染模块(Renders): (derers) 返回json数据还是将数据渲染为HTML页⾯等
DRF源码⼊⼝超文本标记语言是编程语言吗
rest_framework.views.as_view()
使⽤DRF时, 需要将视图⽂件(view.py)定义的类(CBV)继承rest_framework的APIView(APIView是django原⽣View的⼦类)或者将定义的函数(FBV)⽤rest_framework的api_view装饰器进⾏装饰. 因此在url中调⽤的view.as_view()⽅法或者api_view中调⽤的as_view⽅法就是
rest_framework.views.as_view()⽅法, 即rest_framework重写了django原⽣的view中的as_view()⽅法
@classmethod
def as_view(cls, **initkwargs):
"""
Store the original class on the view function.
This allows us to discover information about the view when we do URL
reverse lookups.  Used for breadcrumb generation.
"""
代码省略......# 1.调⽤⽗类View的as_view
view = super().as_view(**initkwargs)
view.cls = cls
view.initkwargs = initkwargs
# 2.跳过csrf认证
# Note: session based authentication is explicitly CSRF validated,
# all other authentication is CSRF exempt.
return csrf_exempt(view)
分析as_view()⽅法, 发现其主要做了两件事: 1. 调⽤⽗类View的as_view  2. 跳过csrf认证
因此主要的逻辑还是在⽗类View的as_view中, 来到⽗类View.as_view的代码, 发现其定义了⼀个view⽅法, 最后返回这个view⽅法, 在view ⽅法中实例化了⼀个cls的对象(self), 然后返回了self.dispatch⽅法的返回值
@classonlymethod
def as_view(cls, **initkwargs):
"""Main entry point for a request-response process."""
    代码省略......
def view(request, *args, **kwargs):
self = cls(**initkwargs)
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head =
self.setup(request, *args, **kwargs)
if not hasattr(self, 'request'):
raise AttributeError(
"%s instance has no 'request' attribute. Did you override "
"setup() and forget to call super()?" % cls.__name__
)
return self.dispatch(request, *args, **kwargs)matlab random函数
代码省略......return view
rest_framework.views.dispatch()
注意上⾯的cls就是as_view的cls参数, 也就是外层APIView中的as_view的cls参数, 也就是APIView, 那么这⾥cls创建的self就是APIView的对象, 那么调⽤的dispatch⽅法就是APIView对象的dispatch⽅法, 如果我们⾃定义的视图类没有重写dispatch⽅法, 那么就会⾛APIView的dispatch⽅法, 可以看到APIView中确实重写了dispatch⽅法, 这⾥就是DRF的核⼼⼊⼝
def dispatch(self, request, *args, **kwargs):
"""
`.dispatch()` is pretty much the same as Django's regular dispatch,
but with extra hooks for startup, finalize, and exception handling.
"""
self.args = args
self.kwargs = kwargs
# 请求模块/解析模块
request = self.initialize_request(request, *args, **kwargs)
self.headers = self.default_response_headers  # deprecate?
try:
# 三⼤认证模块
c语言中为了结束while语句构成的循环self.initial(request, *args, **kwargs)
# 通过反射获取⾃定义视图类中hod对应的⽅法
hod.lower() in self.http_method_names:
handler = getattr(self, hod.lower(),
self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
# 响应模块
response = handler(request, *args, **kwargs)
except Exception as exc:
# 异常处理模块
response = self.handle_exception(exc)
# 渲染模块
sponse
在这个dispatch中主要分为了5部分
1.  request = self.initialize_request(request, *args, **kwargs) 这⾥初始化了⼀个DRF的Request对象, 除了包括了django原⽣request, 还包括了解析器, 权限器等
2.  self.initial(request, *args, **kwargs) 这⾥是对Request进⾏三⼤校验, 包括认证模块(authentication), 权限模块(permission), 频率模块(throttle)
3.  response = handler(request, *args, **kwargs) 这⾥是先通过反射机制获取⾃定义视图类中hod对应的⽅法, 然后调⽤该⽅法, 得到处理结果
4.  response = self.handle_exception(exc) 这⾥是捕获三⼤校验和获取响应所抛出的异常, 并得到异常的处理结果
5.  sponse = self.finalize_response(request, response, *args, **kwargs) 这⾥将上⾯的到的正常或异常处理结果(response)再进⾏最终的渲染处理, 可以渲染为单纯的json数据或者是⽅便浏览器查看的html格式等

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。