Django REST framework

《Django Web典型模塊開發(fā)實戰(zhàn)》

一、Django組件

1、AOP(Aspect Oriented Programming,面向切面編程)

2、Django REST framework

10個常用組件如下:

  • 權(quán)限組件
  • 認(rèn)證組件
  • 訪問頻率限制組件
  • 序列化組件
  • 路由組件
  • 視圖組件
  • 分頁組件
  • 解析器組件
  • 渲染器組件
  • 版本組件

二、組件介紹

1、Django REST framework序列化

序列化(Serialization)是指將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸形式的過程。在客戶端與服務(wù)端傳輸?shù)臄?shù)據(jù)形式主要分為兩種:XML和JSON。

在Django中的序列化就是指將對象狀態(tài)的信息轉(zhuǎn)換為JSON數(shù)據(jù),以達(dá)到將數(shù)據(jù)信息傳送給前端的目的

  • Serializer與ModelSerializer
  • Django REST framework視圖三層封裝
    • mixins.ListModelMixin+GenericAPIView
    • generics.ListAPIView
    • 用viewsets+Router的方式實現(xiàn)視圖封裝
          from .serializers import BookModelSerializer
          from rest_framework.response import Response
          from .models import UserProfile, Book
          from rest_framework import viewsets
          from rest_framework.permissions import BasePermission
          class IsDeveloper(BasePermission):
              message = "查無此人啊"
              def has_permission(self, request, view):
                APIKey = request.query_params.get("apikey", 0)
                developer = UserProfile.objects.filter(APIkey=APIKey).first()
                if developer:
                    return True
                else:
                    print(self.message)
                    return False
          class EnoughMoney(BasePermission):
              message = "兄弟,又到了需要充錢的時候!好開心?。?
              def has_permission(self, request, view):
                APIKey = request.query_params.get("apikey", 0)
                developer = UserProfile.objects.filter(APIkey=APIKey).first()
                balance = developer.money
                if balance > 0:
                    developer.money -= 1
                    developer.save()
                    return True
                else:
                    return False
          class BookModelViewSet(viewsets.ModelViewSet):
              authentication_classes = []  # 必須加的,如果不加,雖然權(quán)限組件依然起作用,但是在權(quán)限通不過的時候,detail將不會顯示我們自定義的message的內(nèi)容,而永遠(yuǎn)只是提示認(rèn)證未通過
              permission_classes = [IsDeveloper, EnoughMoney]
              queryset = Book.objects.all()
              serializer_class = BookModelSerializer
              def get_queryset(self):
                isbn = self.request.query_params.get("isbn", 0)
                books = Book.objects.filter(isbn=int(isbn))
                queryset=books
                return queryset
    
  • Django REST framework 安裝依賴包

    pip install djangorestframework markdown django-filter pillow django-guardian coreapi
    
  • Django REST framework的選擇器,大家可以根據(jù)自己的喜好,選擇

    • JSONRenderer
    • BrowsableAPIRenderer
  • 解決跨域問題

    • 在后端Django項目中安裝相關(guān)模塊
    pip install Django-cors-hearders
    
    • 在settings.py中的注冊里配置
    INSTALLED_APPS = [
      ......,
      "crosheaders",
    ]
    
    • MIDDLEWARE里設(shè)置
    MIDDLEWARE = [
      "crosheaders.middleware.CrosMiddleware", # 放在中間件的頂部
    ]
    
    • 新增配置項
    CORS_ORIGIN_ALLOW_ALL = True
    

2、身份認(rèn)證

  • UGC(User-generated Content,用戶生產(chǎn)內(nèi)容),也可稱為UCC(User-created Content)

    • 相關(guān)概念
      • PGC(Professional-generated Content),由有專業(yè)知識的人所生產(chǎn)的內(nèi)容。
      • OGC(Occupationally-generated Content),職業(yè)生產(chǎn)內(nèi)容者所生產(chǎn)的內(nèi)容。
    • 內(nèi)容生產(chǎn)者認(rèn)證


      image.png
  • Cookie與Session

    • Cookie

      • 保存在用戶的瀏覽器中
      • 可以主動清除
      • 可以被偽造
      • 不可以跨站共享Cookie
    • Session

      • 與cookie區(qū)別

        • Session機(jī)制的工作原理與Cookie的簽名加密機(jī)制的原理相似。區(qū)別在于,Cookie機(jī)制是將用戶的信息存儲在客戶端瀏覽器里,而Session機(jī)制是將用戶的信息存儲于服務(wù)端的一個散列表里,返回給用戶一個Session_id,讓用戶在登錄成功后的每一次數(shù)據(jù)請求都帶上Session_id,服務(wù)端根據(jù)Session_id來創(chuàng)建和更新Session表中的數(shù)據(jù),并返回給用戶特定的數(shù)據(jù)。
        • Session是基于Cookie的一種機(jī)制,屬于Cookie機(jī)制的一種改進(jìn)。
        • Session機(jī)制比Cookie機(jī)制更安全,比如用戶名和密碼等敏感信息不用返回給瀏覽器。Session機(jī)制無法被反解。能做到這一點,歸根結(jié)底是因為Session機(jī)制是將用戶的登錄信息存儲在服務(wù)器端,而非存儲在客戶端瀏覽器中。
      • 配置

        • 服務(wù)器端配置
            SESSION_ENGINE = 'django.contrib.sessions.backends.db'  # 默認(rèn)
            SESSION_COOKIE_NAME="sessionid" # Session的Cookie保存在瀏覽器上時的key
            SESSION_COOKIE_PATH="/"         # Session的Cookie保存的路徑(默認(rèn))
            SESSION_COOKIE_DOMAIN = None    # Session的Cookie保存的域名(默認(rèn))
            SESSION_COOKIE_SECURE = False   # 是否HTTPS傳輸Cookie(默認(rèn))
            SESSION_COOKIE_HTTPONLY = True  # 是否Session的Cookie只支持HTTP傳輸(默認(rèn))
          SESSION_COOKIE_AGE = 1209600    # Session的Cookie失效日期(2周)(默認(rèn))
          SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否關(guān)閉瀏覽器使得Session過期(默認(rèn))
            SESSION_SAVE_EVERY_REQUEST = False  # 是否每次請求都保存Session,默認(rèn)修改后才保存
        
        
        • SESSION_ENGINE:配置不同的Session引擎,代表了將Session數(shù)據(jù)儲存在服務(wù)器的不同地方。Django中支持Session,其中內(nèi)部提供了5種類型的Session供開發(fā)者使用,分別是數(shù)據(jù)庫(默認(rèn))、緩存、文件、緩存+數(shù)據(jù)庫、加密Cookie
        # 數(shù)據(jù)庫(引擎(默認(rèn)))
        SESSION_ENGINE = 'django.contrib.sessions.backends.db' 
        # 緩存
        SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
        SESSION_CACHE_ALIAS= 'default' # 使用的緩存別名(默認(rèn)內(nèi)存緩存,也可以是memcache),此處別名依賴緩存的設(shè)置
        # 文件
        SESSION_ENGINE = 'django.contrib.sessions.backends.file'
        SESSION_FILE_PATH=None  #緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir()
        # 緩存+數(shù)據(jù)庫
        SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
        
    • Cookie/Session的局限性,不適合在多端分離的項目中使用

      • 首先Cookie和Session都將數(shù)據(jù)存儲于瀏覽器的Cookie中
      • 同源策略的局限性,Cookie不能跨站,阻礙平臺之間的數(shù)據(jù)共享
  • Token

    • 概念:從各個終端與服務(wù)端進(jìn)行數(shù)據(jù)交互的身份驗證的字符串,就是Token

    • 使用形式


      image.png
  • Django REST framework的Token的

    • 局限性
      • 缺少Token的有效期時間字段
      • 不利于分布式部署或多個系統(tǒng)使用一套驗證:Token表只能放在一臺服務(wù)器上,如果每一次數(shù)據(jù)請求都要查詢一次數(shù)據(jù)庫的整個用戶表,那么對于服務(wù)器來說將是很大的消耗
    • 解決辦法:
      • Json Web Token(Json Web Token,簡稱JWT)
        • 原理:JWT的數(shù)據(jù)結(jié)構(gòu)是很長的一段字符串,使用.將其分為3個部分,依次:Header(頭部),Payload(負(fù)載),Signature(簽名):
          jwt數(shù)據(jù).png
          • JWT生命周期
JWT生命周期.png
  • Django Token使用

    • settings.py
    INSTALLED_APPS = [
      ......,
        'rest_framework.authtoken'  # 執(zhí)行數(shù)據(jù)更新命令,數(shù)據(jù)庫中會自動生成一張authtoken_token表
    ]
    # 在settings中不但要加入認(rèn)證的配置代碼,還要加入權(quán)限的配置代碼,如果不加入權(quán)限的配置代碼,那么認(rèn)證代碼將無法阻止未認(rèn)證用戶獲取到本應(yīng)該只有已認(rèn)證的用戶才可以獲取到的數(shù)據(jù)信息
    REST_FRAMEWORK = {
      'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',  #必須有
      ),
      'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        )
    }
    
    • urls.py中配置Token登錄的路由
    from rest_framework.authtoken import views
    urlpatterns = [
      #……
      #drf自帶的Token認(rèn)證模式
      path('api-token-auth/', views.obtain_auth_token),
    ]
    
  • JWT在Django中的應(yīng)用

    $ pip install djangoframework-jwt
    
    REST_FRAMEWORK = {
      'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',  # 必須有
      ),
      'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
      )
    }
    import datetime
    JWT_AUTH = {
      # 指明Token的有效期
      'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
    }
    
  • 區(qū)塊鏈技術(shù)

    • 舉例:
      • 有一道題,要求你根據(jù)條件A,計算出結(jié)果B,而這道題的特點是,由A向B計算,最后得到B的過程,需要大量的計算工作,而一旦計算得出了B,通過B來印證A的正確性,則只需要少量的計算即可。將題目所有的條件與結(jié)果進(jìn)行連接,這樣任何一個節(jié)點上有改變,都會造成后面所有節(jié)點的改變,從而達(dá)到?jīng)]有辦法弄虛作假的效果
    • 應(yīng)用:
      • 消滅假貨?;趨^(qū)塊鏈技術(shù),每一個品牌的每一件商品,都可以有全世界唯一的商品標(biāo)識,而且還可以非常低的成本驗證這些商品的信息。
      • 消滅注冊。當(dāng)網(wǎng)絡(luò)實名制徹底普及以后,完全可以通過區(qū)塊鏈技術(shù),讓每個人都可以使用同一個賬號登錄任何一個網(wǎng)站,不需要像現(xiàn)在這樣,每下載一個新的應(yīng)用程序,都要通過手機(jī)號注冊一個賬號,如果長時間不使用,還容易將賬號和密碼忘記。人臉識別技術(shù)和區(qū)塊鏈技術(shù)的配合,說不定可以使“登錄密碼”這種驗證方式成為歷史。
      • 消滅盜版。目前所有打擊盜版的成本,都由支持正版的人在承擔(dān),這顯然并不合理。區(qū)塊鏈技術(shù)可以幫助那些支持正版的人分享利潤,同時區(qū)塊鏈技術(shù)也有利于打擊盜版。

3、Vue

  • 安裝cnpm
    npm install cnpm --registry=https://registry.npm.taobao.org
    
  • 安裝vue腳手架工具
    cnpm install --global vue-cli
    
  • 初始化項目
    $ vue init webpack-simple Project-demo  # 然后連續(xù)按5次回車
    $ cd Project-demo
    $ cnpm install 
    $ npm run dev
    
  • axios
    • 安裝網(wǎng)絡(luò)請求模塊axios

    • --save,將模塊的注冊信息寫入前端項目的配置信息中

      cnpm install axios --save
      
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容