class user(models.model):
user = models.charfield(max_length=32)
pwd = models.charfield(max_length=32)
class usertoken(models.model):
token = models.charfield(max_length=64)
user = models.onetoonefield(to='user')
from rest_framework import serializers
class userjson(serializers.modelserializer):
class meta:
model = models.user
fields = '__all__'
from rest_framework.views import apiview
from rest_framework.response import response
class login(apiview):
def post(self, request):
# 用前台提交的資料完成資料庫查詢校驗
data_dic = request.data
user = models.user.objects.filter(**data_dic).first()
if user:
# 登入成功操作token
token = common.get_token()
# token的資料庫操作,第一次產生token是新建,再次就是更新
models.usertoken.objects.update_or_create(user=user, defaults=)
user_data = objson.userjson(user).data
return response()
return response()
# 原始碼分析from rest_framework.authentication import baseauthentication# as_view() => apiview.dispatch => self.initial(request, *args, **kwargs) => 封裝後的drf的request => request.user => self._authenticate() => authenticate(self, request) 的原始碼根據地
from rest_framework.authentication import baseauthentication
from rest_framework.exceptions import authenticationfailed
class loginauthenticate(baseauthentication):
def authenticate(self, request):
# 登入邏輯:如果使用者登入了,登入操作產生了token,且前後臺同步了
# 登入判斷:再次發生的請求,沒有token代表沒登入,錯誤token,代表無效的登入,token正確才是正常的登入使用者
# 如何將token取出, 規定token用請求頭傳遞
# 認證通過,可以返回none (有多個認證時),可以返回兩個值:user,auth
return result.user, token
else:
# 驗證失敗,丟擲apiexception或其子類物件
raise authenticationfailed("認證失敗")
class books(apiview):
authentication_classes = [loginauthenticate]
# 檢視函式處理的邏輯
def get(self, request):
# 通過認證後,用request.user拿到當前登入的使用者,用request.auth拿到認證值(該值通常自定義)
print(request.user)
return response()
from rest_framework.exceptions import authenticationfailed
class loginauthenticate(baseauthentication):
def authenticate(self, request):
return result.user, token
else:
raise authenticationfailed("認證失敗")
# 區域性認證: 在需要認證的類上方標註認證類:authentication_classes = [auth1, ... authn]
class books(apiview):
authentication_classes = [auth.loginauthenticate]
def get(self, request):
print(request.user)
return response()
# 案例:訪問當前登入使用者資訊 - 個人主頁
class home(apiview):
# 新增登入認證即可
authentication_classes = [auth.loginauthenticate]
def get(self, request):
return response()
# 1.在settings.py中配置# 全域性認證
rest_framework =
# 2.所有的cbv類都不需要新增類屬性:authentication_classes
# 區域性禁用
# 3.在不需要認證的cbv類中新增類屬性:authentication_classes =
class logout(apiview):# 在全域性認證情況下,如果能走get方法,代表已經通過登入認證(登入狀態),就可以登出
def get(self, request):
models.usertoken.objects.update_or_create(user=request.user, defaults=)
return response()
登入請求獲取token
學習週報 rest framework
本週學習情況 1.rest framework的學習 2.前後端分離5 2到5 6 下週學習計畫 停止課程內容學習 2.花10學習rest framework基礎的學習 本週完成情況 一 fbv,cbv 繼承 避免重複 1 優先順序從左往右 2 super 1.先在studentsview裡面查詢,...
REST framework 渲染模組
根據 使用者請求url 或 使用者可接受的型別,篩選出合適的 渲染元件。頁面 postman from rest framework.renderers import jsonrenderer from rest framework.renderers import browsableapirend...
REST framework 路由元件
from django.conf.urls import include from rest framework.routers import router router router router類內部做了的對映關係 所有路由與viewset檢視類的都可以註冊,會產生 v6 books 和 v6 ...