請求模組 LL

朱饱饱發表於2024-03-12

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 提供的各種特性。

相關文章