Django配置回顧及DRF框架請求生命週期

Django配置回顧及DRF框架請求生命週期

一、Django配置回顧

先後端不分離的項目中app咱們通常起名叫app,在先後端分離的項目中咱們通常APP起名叫api,見名知意mysql

一、應用是否必定要在INSTALLED_APPS中註冊

在沒有使用app的一些特殊功能時(好比數據庫相關),能夠不用註冊,可是註冊以後,應用的全部應用都能使用,因此咱們將全部的app都完成註冊git

二、數據庫配置(所有在settings文件中配置便可)

在settings中導入pymysql就能夠,能夠不用去__ init__中導入sql

import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '數據庫名',
        'USER': '帳號',
        'PASSWORD': '密碼',
        'HOST': '若是是127.0.0.1,該配置能夠省略',
        "PORT": 3306,  # 若是是3306,該配置能夠省略
    }
}

三、路由分發

主路由中,將應用分發給相關在子路由中交給各子路由本身處理數據庫

from django.conf.urls import url, include
urlpatterns = [
    # ...
    url(r'^api/', include('api.urls')),    # /api/test/
]

四、ORM配置回顧

暴露media文件夾下文件給用戶配置

settings.py文件中django

# root就是將文件夾添加到os.path中
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# url就是配置路由 /路由名/
MEDIA_URL = '/media/'

主路由urls.py下json

from django.views.static import serve
from django.conf import settings
​
urlpatterns = [
    ...
    # document_root必須指向icon/001.png所在的路徑=>path變量,能夠進入serve查看
    url(r'^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT})
]

二、APIView的請求生命週期

一、重寫as_view()方法

一、as_view()方法完成路由配置,返回配置函數 csrf_exempt(view) 中禁用了csrf認證規則後端

因此:全部繼承APIView的子類,都不受csrf認證規則的限制,由於csrf規則對get請求沒有限制,沒有drf本身的好api

二、將請求處理的任務交給dispatch方法瀏覽器

二、重寫的dispatch方法

完成了三大核心任務:服務器

一、請求對象的處理:請求解析模塊

二、請求過程的處理:三大認證模塊 => 本身代碼完成處理

三、請求結果的響應:異常模塊處理異常響應 | 響應渲染模塊處理正常響應

一、請求解析模塊

  1. 二次封裝了Django的wsgi協議的request對象,並作了向下兼容(原來request對象的內容,用如今的request對象都能訪問)

  2. 將全部的拼接參數都放在了request.query_params中,將全部的數據包參數都放在了request.data

  3. 路由的有名和無名分組仍是在args和kwargs中

  4. 解析模塊能夠自定義在settings.py中自定義配置

    REST_FRAMEWORK = {
        # parsers解析模塊,進入rest_framework中的settings中查找
        'DEFAULT_PARSER_CLASSES': [
            'rest_framework.parsers.JSONParser',  # 解析json
            'rest_framework.parsers.FormParser',  # 解析urlencoded
            'rest_framework.parsers.MultiPartParser'  # 解析form-data
        ],
    }

二、響應渲染模塊

  1. 當三大認證模塊和本身處理的視圖邏輯沒有出現異常時,會執行響應渲染模塊

  2. 響應的數據會交給渲染模塊來完成數據的渲染,渲染的方式有兩種:json數據格式渲染,Brower瀏覽器格式數據渲染

  3. 渲染模塊能夠在自定義的settings中自定義配置

    REST_FRAMEWORK = {
        # 渲染模塊
        'DEFAULT_RENDERER_CLASSES': [
            'rest_framework.renderers.JSONRenderer',  # json數據格式渲染
            # 瀏覽器渲染,上線後會註釋,否則瀏覽器請求接口就暴露了後臺語言
            'rest_framework.renderers.BrowsableAPIRenderer',  
        ],
    }

三、序列化組件

單表序列化

在建立表時,給已經有的表添加新字段有三種方式:1)設置該字段的默認值;2)設置該字段能夠爲空;3)在使用數據庫遷移命令的時候設置默認值

序列化組件 serializers,子類ModelSerializer能夠快速幫咱們建立一個序列化

使用:

一、在models.py中

from django.db import models
from django.conf import settings
class User(models.Model):
    name = models.CharField(max_length=64, verbose_name='姓名')
    height = models.DecimalField(max_digits=5, decimal_places=2, default=0)
    sex = models.CharField(choices=[('0', ''), ('1', '')])
    icon = models.ImageField(upload_to='icon', default='icon/default.png')
​
    # 自定義序列化給前臺的字段
    # property優勢:1)能夠格式化數據庫原有字段的數據 2)能夠對外隱藏原有數據庫原有字段名 3)能夠直接連表操做
    @property  # 製造插頭
    def gender(self): # choices方法獲取值get_xxx_display()
        return self.get_sex_display() @property def img(self): # 返回url地址 服務器地址+media+具體名
        # return 'http://127.0.0.1:8000' + settings.MEDIA_URL + str(self.icon)
        return settings.BASE_URL + settings.MEDIA_URL + self.icon.name

二、自定義serializers.py文件

from rest_framework import serializers
from . import models
class UserModelSerializer(serializers.ModelSerializer):
    class Meta:
        # 該序列化類是輔助於那個Model類的
        model = models.User
        # 設置參與序列化與反序列化字段
        # 插拔式:能夠選擇性返回給前臺字段(插頭都是在Model類中製造)
        # fields = ['name', 'sex', 'icon']
        fields = ['name', 'gender', 'img']

三、在views.py中

from rest_framework.views import APIView
from rest_framework.response import Response
​
from . import models, serializers
​
class UserAPIView(APIView):
    def get(self, request, *args, **kwargs):
        pk = kwargs.get('pk')
        if pk:  # 單查
            # 1)數據庫交互拿到資源obj或資源objs
            # 2)數據序列化成能夠返回給前臺的json數據
            # 3)將json數據返回給前臺
            obj = models.User.objects.get(pk=pk)
            # many操做的數據是否有多個,默認是False能夠不寫
            serializer = serializers.UserModelSerializer(obj, many=False) return Response(serializer.data)else:  # 羣查
            # 1)數據庫交互拿到資源obj或資源objs
            # 2)數據序列化成能夠返回給前臺的json數據
            # 3)將json數據返回給前臺
            queryset = models.User.objects.all()
            # many操做的數據是不是多個
            serializer = serializers.UserModelSerializer(queryset, many=True) return Response(serializer.data)def post(self, request, *args, **kwargs):
        # 單增
        # 1)從請求request中得到前臺提交的數據
        # 2)將數據轉換成Model對象,並完成數據庫入庫操做
        # 3)將入庫成功的對象列化成能夠返回給前臺的json數據(請求與響應數據不對等:請求須要提交密碼,響應必定不展現密碼)
        # 4)將json數據返回給前臺
return Response()
相關文章
相關標籤/搜索