您對這篇文章有什麼期望?
我們在上一篇文章中開始開發帳戶應用程序,本文將以此為基礎。它將涵蓋
- 用於登入、刷新令牌和更改密碼請求的序列化器
- 相同 API 的視圖、登入、刷新令牌和更改密碼
- 當然還有網址。
我會盡力介紹盡可能多的細節,以免讓您感到無聊,但我仍然希望您熟悉 Python 和 Django 的某些方面。
最終版本的原始碼可以在https://github.com/saad4software/alive-diary-backend
系列訂購
有興趣的話可以查看之前的文章!
- 從頭開始的人工智慧專案、創意、Alive 日記
- 用 Google AI Studio 證明它是可行的
- Django API 專案設定
- Django 帳戶管理應用程式(一)、註冊與啟動
- Django 帳戶管理應用程式(2)、登入和更改密碼(你在這裡?)
快速登入和刷新 API!
好吧,如果你很趕時間並且沒有一些複雜的用戶管理和用戶角色系統,你可以簡單地按照SimpleJWT文檔中的說明進行操作,你不必創建序列化器或視圖,只需編輯URL文件如下
from django.urls import path, include from .views import * from rest_framework_simplejwt.views import ( TokenObtainPairView, TokenRefreshView, ) urlpatterns = [ path('register/', AccountRegisterView.as_view()), path('activate/', AccountActivateView.as_view()), path('login/', TokenObtainPairView.as_view()), path('refresh/', TokenRefreshView.as_view()), ]
app_account/urls.py
一切順利,現在使用
運行應用程式
python manage.py runserver 0.0.0.0:8555
開啟 URL http://localhost:8555/api/account/login/ 將允許您登錄,而 http://localhost:8555/api/account/refresh/ 將允許您刷新代幣
很好又簡單,但是如果我們需要自訂令牌回應怎麼辦?實際上,我希望此回應遵循我們在上一篇文章中建立的相同回應模式,並取得 UI 的角色欄位以區分普通使用者和管理員,如何做到這一點?
自訂登入API
為了獲得遵循我們模式的回應,我們可以簡單地建立一個繼承自 TokenObtainPairSerializer 的空序列化器
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer class LoginSerializer(TokenObtainPairSerializer): pass
app_account/serializers.py
並將其傳遞給使用我們的自訂渲染器的登入視圖
from rest_framework_simplejwt.views import TokenViewBase class AccountLoginView(TokenViewBase): serializer_class = LoginSerializer renderer_classes = [CustomRenderer, BrowsableAPIRenderer]
app_account/views.py
登入回應現在應該遵循我們的架構。只需確保更新 URL 文件以指向我們的自訂登入視圖
from django.urls import path, include from .views import * from rest_framework_simplejwt.views import ( TokenObtainPairView, TokenRefreshView, ) urlpatterns = [ path('register/', AccountRegisterView.as_view()), path('activate/', AccountActivateView.as_view()), path('login/', AccountLoginView.as_view()), path('refresh/', TokenRefreshView.as_view()), ]
app_account/urls.py
加入角色欄位有點棘手,最簡單的方法是覆蓋序列化器中的驗證函數,在簡單的 JWT 的幫助下,我們得到了
from django.urls import path, include from .views import * from rest_framework_simplejwt.views import ( TokenObtainPairView, TokenRefreshView, ) urlpatterns = [ path('register/', AccountRegisterView.as_view()), path('activate/', AccountActivateView.as_view()), path('login/', TokenObtainPairView.as_view()), path('refresh/', TokenRefreshView.as_view()), ]
app_account/serializers.py
我們首先取得使用者對象,如果它不存在或密碼不匹配,則會引發錯誤並顯示「invalid_credentials」訊息,然後我們確保使用者處於活動狀態,最後,我們得到令牌並建立回應。現在就來嘗試吧!
我知道對於一個簡單的目標來說看起來太忙碌了!但它使我們能夠控制驗證行為並允許我們添加任何其他欄位。讓我們加入使用者資訊
python manage.py runserver 0.0.0.0:8555
app_account/serializers.py
自訂刷新令牌API
再做一次,做得更好!
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer class LoginSerializer(TokenObtainPairSerializer): pass
app_account/serializer.py
這將為我們提供新的存取和刷新令牌,以及角色和使用者數據,如果我們不需要額外的字段,我們可以簡單地使用繼承自TokenRefreshSerializer 的空序列化器類別(帶有pass)
刷新視圖應該如下圖
from rest_framework_simplejwt.views import TokenViewBase class AccountLoginView(TokenViewBase): serializer_class = LoginSerializer renderer_classes = [CustomRenderer, BrowsableAPIRenderer]
app_account/views.py
它使用我們新的 RefreshTokenSerializer 和 CustomRenderer,不要忘記更新 URL 檔案
from django.urls import path, include from .views import * from rest_framework_simplejwt.views import ( TokenObtainPairView, TokenRefreshView, ) urlpatterns = [ path('register/', AccountRegisterView.as_view()), path('activate/', AccountActivateView.as_view()), path('login/', AccountLoginView.as_view()), path('refresh/', TokenRefreshView.as_view()), ]
app_account/urls.py
偉大的!測試它應該會回傳類似這樣的內容
修改密碼API
一如既往。讓我們從序列化器開始
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer from django.contrib.auth import get_user_model class LoginSerializer(TokenObtainPairSerializer): def validate(self, attrs): username = attrs['username'] user = get_user_model().objects.filter(username=username).first() if not user or not user.check_password(attrs['password']): raise serializers.ValidationError("invalid_credentials") if not user.is_active: raise serializers.ValidationError("not_active") refresh = self.get_token(user) data = { 'refresh': str(refresh), 'access': str(refresh.access_token), 'role': user.role, } return data
app_account/serializers.py
它是一個自訂序列化器,具有兩個必要的字元欄位。移動到視圖
class UserSerializer(serializers.ModelSerializer): class Meta: model = get_user_model() fields = ( 'first_name', 'last_name', 'username', 'country_code', 'expiration_date', 'hobbies', 'job', 'bio', 'role', ) read_only_fields = ['username', 'role', 'expiration_date'] class LoginSerializer(TokenObtainPairSerializer): def validate(self, attrs): username = attrs['username'] user = get_user_model().objects.filter(username=username).first() if not user or not user.check_password(attrs['password']): raise serializers.ValidationError("invalid_credentials") if not user.is_active: raise serializers.ValidationError("not_active") refresh = self.get_token(user) data = { 'refresh': str(refresh), 'access': str(refresh.access_token), 'user': UserSerializer(user).data, 'role': user.role, } return data
app_account/views.py
這個請求需要經過驗證的用戶,所以我們使用 IsAuthenticated 作為權限類,當然,我們使用了我們自訂的渲染器類別。對於 POST 請求,我們首先確保請求滿足序列化器類型,然後檢查密碼有效性(如果有效);我們更改它並保存新的使用者模型
在瀏覽器中開啟 http://localhost:8555/api/account/password/ 看起來像這樣
由於它是經過驗證的視圖,因此需要使用 BrowsableAPIRenderer 不支援的不記名令牌。
為了測試這個(以及每個經過身份驗證的請求),我們有兩個選項之一
- 使用像postman或insomnia這樣的IDE(我個人比較喜歡Insomnia,因為它仍然不會強迫我登入)
- 或使用 swagger
如果你選擇第一個路徑,可以忽略下一篇文章!下一篇文章將引導您在 Django 專案中實現 Swagger
敬請期待?
以上是Django 帳戶管理應用程式(登入和變更密碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Linux終端中查看Python版本時遇到權限問題的解決方法當你在Linux終端中嘗試查看Python的版本時,輸入python...

本文解釋瞭如何使用美麗的湯庫來解析html。 它詳細介紹了常見方法,例如find(),find_all(),select()和get_text(),以用於數據提取,處理不同的HTML結構和錯誤以及替代方案(SEL)

Python的statistics模塊提供強大的數據統計分析功能,幫助我們快速理解數據整體特徵,例如生物統計學和商業分析等領域。無需逐個查看數據點,只需查看均值或方差等統計量,即可發現原始數據中可能被忽略的趨勢和特徵,並更輕鬆、有效地比較大型數據集。 本教程將介紹如何計算平均值和衡量數據集的離散程度。除非另有說明,本模塊中的所有函數都支持使用mean()函數計算平均值,而非簡單的求和平均。 也可使用浮點數。 import random import statistics from fracti

本文比較了Tensorflow和Pytorch的深度學習。 它詳細介紹了所涉及的步驟:數據準備,模型構建,培訓,評估和部署。 框架之間的關鍵差異,特別是關於計算刻度的

本文討論了諸如Numpy,Pandas,Matplotlib,Scikit-Learn,Tensorflow,Tensorflow,Django,Blask和請求等流行的Python庫,並詳細介紹了它們在科學計算,數據分析,可視化,機器學習,網絡開發和H中的用途

本文指導Python開發人員構建命令行界面(CLIS)。 它使用Typer,Click和ArgParse等庫詳細介紹,強調輸入/輸出處理,並促進用戶友好的設計模式,以提高CLI可用性。

在使用Python的pandas庫時,如何在兩個結構不同的DataFrame之間進行整列複製是一個常見的問題。假設我們有兩個Dat...

文章討論了虛擬環境在Python中的作用,重點是管理項目依賴性並避免衝突。它詳細介紹了他們在改善項目管理和減少依賴問題方面的創建,激活和利益。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver Mac版
視覺化網頁開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

記事本++7.3.1
好用且免費的程式碼編輯器