《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
- 相關(guān)概念
-
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的數(shù)據(jù)結(jié)構(gòu)是很長的一段字符串,使用.將其分為3個部分,依次:Header(頭部),Payload(負(fù)載),Signature(簽名):
- Json Web Token(Json Web Token,簡稱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-jwtREST_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


