1、CBV源码分析
# 视图层 from django.shortcuts import render, HttpResponse from django.views import View class CBVTest(View): # 通过调度(dispatch)分发请求 def dispatch(self, request, *args, **kwargs): pass super().dispatch(request, *args, **kwargs) pass def get(self, request): return render(request, 'cbv.html') def post(self, request): return HttpResponse('cbv post method') <!-- 模板层 --> <form action="/cbv/" method="post"> {% csrf_token %} <input type="text" name="usr"> <button type="submit">提交</button> </form> # 路由层 from app import views urlpatterns = [ url(r'^cbv/', views.CBVTest.as_view()), ]
2、drf安装与使用
# 1)安装drf:pip3 install djangorestframework # 2)settings.py注册app:INSTALLED_APPS = [..., 'rest_framework'] # 3)基于cbv完成满足RSSTful规范的接口
# 视图层 from rest_framework.views import APIView from rest_framework.response import Response user_list = [{'id': 1, 'name': 'Bob'}, {'id': 2, 'name': 'Tom'}] class Users(APIView): def get(self, request, *args, **kwargs): return Response({ 'status': 0, 'msg': 'ok', 'results': user_list }) def post(self, request, *args, **kwargs): # request对formdata,urlencoded,json三个格式参数均能解析 name = request.data.get('name') id = len(user_list) + 1 user = {'id': id, 'name': name} user_list.append(user) return Response({ 'status': '0', 'msg': 'ok', 'results': user }) # 路由层 from app import views urlpatterns = [ url(r'^users/', views.Users.as_view()), ]
3、request源码分析
# as_view() # 核心走了父类as_view view = super(APIView, cls).as_view(**initkwargs) # 返回的是局部禁用csrf认证的view视图函数 return csrf_exempt(view) # dispatch(self, request, *args, **kwargs) # 二次封装request对象 request = self.initialize_request(request, *args, **kwargs) # 自定义request规则 self.initial(request, *args, **kwargs) # initialize_request(self, request, *args, **kwargs) # 原生request封装在request._request # initial(self, request, *args, **kwargs) # 认证 self.perform_authentication(request) # 权限 self.check_permissions(request) # 频率 self.check_throttles(request)
as_view()
as_view() 是 Django REST Framework(DRF)和Django中用于将一个视图类转换为可调用视图函数的方法。
在类基于视图的设计模式下,视图逻辑封装在一个类中,而为了与URL配置进行交互并处理HTTP请求,需要将这个类转化为常规的视图函数
View和APIView
在 Django REST Framework(DRF)中,View 和 APIView 是两种不同的视图类型:
Django 视图 (View):
Django 自身提供的基础视图类,位于 django.views 包下。
用于处理所有类型的请求(不仅仅是针对API),包括HTML页面、静态内容等。
在处理HTTP请求时,它通常使用 HttpRequest 对象,并返回一个 HttpResponse 对象。
REST框架视图 (APIView):
DRF 中的核心视图基类,位于 rest_framework.views 包下。
特别为构建Web API而设计,提供了许多与API开发相关的功能和便利性。
使用 rest_framework.request.Request 对象代替了标准的 HttpRequest,并且可以返回 rest_framework.response.Response 对象,支持更多格式的数据序列化和反序列化。
内置了对身份验证、权限控制、分页、过滤器、异常处理等功能的支持。
还提供了通用视图如 ListAPIView、CreateAPIView 等,简化了CRUD操作的实现。
总结起来,APIView 是基于 Django 视图 (View) 构建的,专为 RESTful API 开发进行了增强和扩展。在构建 REST API 时,推荐使用 APIView 及其派生类,以充分利用 Django REST Framework 提供的各种特性。
,
1、CBV源码分析
# 视图层 from django.shortcuts import render, HttpResponse from django.views import View class CBVTest(View): # 通过调度(dispatch)分发请求 def dispatch(self, request, *args, **kwargs): pass super().dispatch(request, *args, **kwargs) pass def get(self, request): return render(request, 'cbv.html') def post(self, request): return HttpResponse('cbv post method') <!-- 模板层 --> <form action="/cbv/" method="post"> {% csrf_token %} <input type="text" name="usr"> <button type="submit">提交</button> </form> # 路由层 from app import views urlpatterns = [ url(r'^cbv/', views.CBVTest.as_view()), ]
2、drf安装与使用
# 1)安装drf:pip3 install djangorestframework # 2)settings.py注册app:INSTALLED_APPS = [..., 'rest_framework'] # 3)基于cbv完成满足RSSTful规范的接口
# 视图层 from rest_framework.views import APIView from rest_framework.response import Response user_list = [{'id': 1, 'name': 'Bob'}, {'id': 2, 'name': 'Tom'}] class Users(APIView): def get(self, request, *args, **kwargs): return Response({ 'status': 0, 'msg': 'ok', 'results': user_list }) def post(self, request, *args, **kwargs): # request对formdata,urlencoded,json三个格式参数均能解析 name = request.data.get('name') id = len(user_list) + 1 user = {'id': id, 'name': name} user_list.append(user) return Response({ 'status': '0', 'msg': 'ok', 'results': user }) # 路由层 from app import views urlpatterns = [ url(r'^users/', views.Users.as_view()), ]
3、request源码分析
# as_view() # 核心走了父类as_view view = super(APIView, cls).as_view(**initkwargs) # 返回的是局部禁用csrf认证的view视图函数 return csrf_exempt(view) # dispatch(self, request, *args, **kwargs) # 二次封装request对象 request = self.initialize_request(request, *args, **kwargs) # 自定义request规则 self.initial(request, *args, **kwargs) # initialize_request(self, request, *args, **kwargs) # 原生request封装在request._request # initial(self, request, *args, **kwargs) # 认证 self.perform_authentication(request) # 权限 self.check_permissions(request) # 频率 self.check_throttles(request)
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。