搜尋
首頁後端開發Python教學Django 帳戶管理應用程式(忘記密碼和帳戶詳細信息

從這篇文章可以期待什麼?

我們在先前的文章中開始開發帳戶應用程序,本文將以此為基礎。它將涵蓋

  • 用於忘記密碼、重新發送代碼和帳戶詳細資訊的序列化程序。
  • 相同 API 的視圖。
  • 當然還有網址。

我會盡力介紹盡可能多的細節,以免讓您感到無聊,但我仍然希望您熟悉 Python 和 Django 的某些方面。

最終版本的原始碼可以在https://github.com/saad4software/alive-diary-backend

系列訂購

有興趣的話可以查看之前的文章!

  1. 從頭開始的人工智慧專案、創意、Alive 日記
  2. 用 Google AI Studio 證明它是可行的
  3. Django API 專案設定
  4. Django帳戶管理(一)、註冊與啟動
  5. Django帳戶管理(二)、登入及修改密碼
  6. 帶有 Swagger 的 Django Rest 框架
  7. Django 帳戶管理 (3) 忘記密碼和帳戶詳細資料(您在這裡?)

它是如何運作的?

忘記密碼請求如何運作?流程應遵循以下步驟

  • 使用者顯然忘了他的密碼?我真傻。
  • 使用者輸入他/她的電子郵件地址。
  • 一封帶有驗證碼的郵件寄至信箱。
  • 使用者可以使用電子郵件和啟動碼來設定新密碼。

因此,我們需要一個 API 來取得電子郵件地址、建立啟動碼並將其傳送給用戶,與重新傳送代碼 API 相同。
我們還需要另一個 API 來取得電子郵件、啟動碼和新密碼來重設密碼。
從重新傳送程式碼 API 開始現在聽起來是個好主意。

重新傳送程式碼 API

一如既往,讓我們從序列化器開始

class SendCodeSerializer(serializers.Serializer):
    username = serializers.CharField(required=True)

    def validate_username(self, value):
        if not is_valid_email(value):
            raise serializers.ValidationError("invalid_email")

        verification_query = get_user_model().objects.filter(username=value).exists()
        if not verification_query:
            raise serializers.ValidationError("invalid_username")

        return value

app_account/serializers.py

這是一個通用序列化程序,只有一個字段,即用戶名,我們正在檢查以確保它是有效的電子郵件地址,並且用戶已在系統中註冊。

現在來看看

class AccountSendCodeView(APIView):
    permission_classes = ()
    renderer_classes = [CustomRenderer, BrowsableAPIRenderer]


    @swagger_auto_schema(request_body=SendCodeSerializer)
    def post(self, request, *args, **kwargs):
        serializer = SendCodeSerializer(data=request.data)

        if not serializer.is_valid():
            raise APIException(serializer.errors)

        user = get_user_model().objects.filter(username=serializer.validated_data.get("username")).first()
        code = VerificationCode(user=user, email=user.username)
        code.save()

        send_mail(
            'Password Reset Code',
            'Your password reset code is ' + str(code.code),
            f'AliveDiary',
            [user.username],
            fail_silently=False,
        )

        return Response("success")

app_account/views.py

視圖首先驗證請求,然後取得使用者並為其建立程式碼實例。最後透過電子郵件將程式碼傳送給使用者。
最後是網址

urlpatterns = [
    path('register/', AccountRegisterView.as_view()),
    path('activate/', AccountActivateView.as_view()),

    path('login/', AccountLoginView.as_view()),
    path('refresh/', AccountRefreshTokenView.as_view()),

    path('code/', AccountSendCodeView.as_view()), #new

    path('password/', AccountChangePasswordView.as_view()),
]

app_account/urls.py

我們現在可以在 swagger 上測試它

Django accounts management app ( forgot password and account details

重置密碼API

序列化器應包含使用者名稱、發送的程式碼和新密碼;它應該檢查以確保它是有效的使用者名稱和程式碼,有點像

class ForgotPasswordSerializer(serializers.Serializer):
    username = serializers.CharField(required=True)
    code = serializers.CharField(required=True)
    new_password = serializers.CharField(required=True)

    def validate(self, data):
        verification_query = VerificationCode.objects.filter(
            user__username=data['username'],
        ).order_by('-id')

        if not verification_query.exists():
            raise serializers.ValidationError("no_code")

        code = verification_query[0]
        if str(code.code) != str(data['code']):
            raise serializers.ValidationError("invalid_code")

        return data

app_account/serializers.py

所有欄位都是必需的,我們使用驗證函數來同時驗證使用者名稱和程式碼。如果該使用者沒有即時代碼,我們會引發驗證錯誤,如果發送的代碼與即時代碼值不匹配,我們會透過引發「invalid_code」驗證錯誤來通知用戶。

對於視圖,我們需要先驗證序列化器

class SendCodeSerializer(serializers.Serializer):
    username = serializers.CharField(required=True)

    def validate_username(self, value):
        if not is_valid_email(value):
            raise serializers.ValidationError("invalid_email")

        verification_query = get_user_model().objects.filter(username=value).exists()
        if not verification_query:
            raise serializers.ValidationError("invalid_username")

        return value

app_account/views.py

如果序列化器無效,我們會引發一個帶有序列化器錯誤的 API 異常,如果有效,我們將使用序列化器資料查詢驗證瞬間。請注意,此查詢始終存在,並且發送的代碼與驗證即時代碼值相同,因為此查詢已經通過了序列化器檢查。
然後我們從資料庫中刪除驗證實例,並使用序列化器中的“new_password”值更新使用者密碼

最後,讓我們更新 URL 檔案

class AccountSendCodeView(APIView):
    permission_classes = ()
    renderer_classes = [CustomRenderer, BrowsableAPIRenderer]


    @swagger_auto_schema(request_body=SendCodeSerializer)
    def post(self, request, *args, **kwargs):
        serializer = SendCodeSerializer(data=request.data)

        if not serializer.is_valid():
            raise APIException(serializer.errors)

        user = get_user_model().objects.filter(username=serializer.validated_data.get("username")).first()
        code = VerificationCode(user=user, email=user.username)
        code.save()

        send_mail(
            'Password Reset Code',
            'Your password reset code is ' + str(code.code),
            f'AliveDiary',
            [user.username],
            fail_silently=False,
        )

        return Response("success")

app_account/urls.py

帳戶詳情API

讓我們先為使用者模型建立一個序列化器,它看起來像這樣

urlpatterns = [
    path('register/', AccountRegisterView.as_view()),
    path('activate/', AccountActivateView.as_view()),

    path('login/', AccountLoginView.as_view()),
    path('refresh/', AccountRefreshTokenView.as_view()),

    path('code/', AccountSendCodeView.as_view()), #new

    path('password/', AccountChangePasswordView.as_view()),
]

app_account/serializers.py

它是一個模型序列化器,我們選擇了使用者模型並列出了要序列化的欄位。

轉向視圖,我們需要一個允許用戶透過 GET 請求獲取用戶詳細資訊並透過 POST 請求更新用戶詳細資訊的視圖,它看起來有點像

class ForgotPasswordSerializer(serializers.Serializer):
    username = serializers.CharField(required=True)
    code = serializers.CharField(required=True)
    new_password = serializers.CharField(required=True)

    def validate(self, data):
        verification_query = VerificationCode.objects.filter(
            user__username=data['username'],
        ).order_by('-id')

        if not verification_query.exists():
            raise serializers.ValidationError("no_code")

        code = verification_query[0]
        if str(code.code) != str(data['code']):
            raise serializers.ValidationError("invalid_code")

        return data

app_account/views.py

和網址

class AccountForgotPasswordView(APIView):
    permission_classes = ()
    renderer_classes = [CustomRenderer, BrowsableAPIRenderer]

    @swagger_auto_schema(request_body=ForgotPasswordSerializer)
    def post(self, request, *args, **kwargs):
        serializer = ForgotPasswordSerializer(data=request.data)
        if not serializer.is_valid():
            raise APIException(serializer.errors)

        verification_query = VerificationCode.objects.filter(
            user__username=serializer.validated_data.get('username'),
            code=serializer.validated_data.get('code')
        ).order_by('-id')

        verification_query.delete()

        user = get_user_model().objects.filter(
            username=serializer.validated_data.get('username'),
        ).first()
        user.set_password(serializer.validated_data.get('new_password'))
        user.save()
        return Response("success")

app_account/urls.py

就是這樣!讓我們用 Swagger 來測試一下,打開 http://localhost:8555/swagger/ 並使用登入名稱來取得有效的令牌。為了測試任何授權請求,我們必須單擊鎖定 ?圖標,任何 swagger 中的鎖圖標,並為令牌提供“Bearer”前綴,有點像“Bearer eyJhbGc...”

Django accounts management app ( forgot password and account details

現在測試詳細資料 API 應傳回如圖所示的帳戶詳細資料

Django accounts management app ( forgot password and account details

就是這樣!恭喜,您擁有一個功能齊全的帳戶管理應用程序,只需進行最少的修改即可在任何 Django 應用程式中使用

您認為它還需要其他功能嗎?請提出建議!

我們將在下一篇文章中回到主應用程序,所以

敬請期待?

以上是Django 帳戶管理應用程式(忘記密碼和帳戶詳細信息的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Numpy數組與使用數組模塊創建的數組有何不同?Numpy數組與使用數組模塊創建的數組有何不同?Apr 24, 2025 pm 03:53 PM

numpyArraysareAreBetterFornumericalialoperations andmulti-demensionaldata,而learthearrayModuleSutableforbasic,內存效率段

Numpy數組的使用與使用Python中的數組模塊陣列相比如何?Numpy數組的使用與使用Python中的數組模塊陣列相比如何?Apr 24, 2025 pm 03:49 PM

numpyArraySareAreBetterForHeAvyNumericalComputing,而lelethearRayModulesiutable-usemoblemory-connerage-inderabledsswithSimpleDatateTypes.1)NumpyArsofferVerverVerverVerverVersAtility andPerformanceForlargedForlargedAtatasetSetsAtsAndAtasEndCompleXoper.2)

CTYPES模塊與Python中的數組有何關係?CTYPES模塊與Python中的數組有何關係?Apr 24, 2025 pm 03:45 PM

ctypesallowscreatingingangandmanipulatingc-stylarraysinpython.1)usectypestoInterfacewithClibrariesForperfermance.2)createc-stylec-stylec-stylarraysfornumericalcomputations.3)passarraystocfunctions foreforfunctionsforeffortions.however.however,However,HoweverofiousofmemoryManageManiverage,Pressiveo,Pressivero

在Python的上下文中定義'數組”和'列表”。在Python的上下文中定義'數組”和'列表”。Apr 24, 2025 pm 03:41 PM

Inpython,一個“列表” isaversatile,mutableSequencethatCanholdMixedDatateTypes,而“陣列” isamorememory-sepersequeSequeSequeSequeSequeRingequiringElements.1)列表

Python列表是可變還是不變的?那Python陣列呢?Python列表是可變還是不變的?那Python陣列呢?Apr 24, 2025 pm 03:37 PM

pythonlistsandArraysareBothable.1)列表Sareflexibleandsupportereceneousdatabutarelessmory-Memory-Empefficity.2)ArraysareMoremoremoremoreMemoremorememorememorememoremorememogeneSdatabutlesserversEversementime,defteringcorcttypecrecttypececeDepeceDyusagetoagetoavoavoiDerrors。

Python vs. C:了解關鍵差異Python vs. C:了解關鍵差異Apr 21, 2025 am 12:18 AM

Python和C 各有優勢,選擇應基於項目需求。 1)Python適合快速開發和數據處理,因其簡潔語法和動態類型。 2)C 適用於高性能和系統編程,因其靜態類型和手動內存管理。

Python vs.C:您的項目選擇哪種語言?Python vs.C:您的項目選擇哪種語言?Apr 21, 2025 am 12:17 AM

選擇Python還是C 取決於項目需求:1)如果需要快速開發、數據處理和原型設計,選擇Python;2)如果需要高性能、低延遲和接近硬件的控制,選擇C 。

達到python目標:每天2小時的力量達到python目標:每天2小時的力量Apr 20, 2025 am 12:21 AM

通過每天投入2小時的Python學習,可以有效提升編程技能。 1.學習新知識:閱讀文檔或觀看教程。 2.實踐:編寫代碼和完成練習。 3.複習:鞏固所學內容。 4.項目實踐:應用所學於實際項目中。這樣的結構化學習計劃能幫助你係統掌握Python並實現職業目標。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器