Rumah > pembangunan bahagian belakang > Tutorial Python > Apl pengurusan akaun Django (terlupa kata laluan dan butiran akaun

Apl pengurusan akaun Django (terlupa kata laluan dan butiran akaun

Mary-Kate Olsen
Lepaskan: 2024-11-25 20:17:10
asal
925 orang telah melayarinya

Apa yang diharapkan daripada artikel ini?

Kami mula mengusahakan apl akaun dalam artikel sebelumnya, artikel ini akan membinanya. Ia akan meliputi

  • Serializers untuk melupakan kata laluan, menghantar semula kod dan butiran akaun.
  • Paparan untuk API yang sama.
  • Dan sudah tentu URL.

Saya akan cuba mengupas sebanyak mungkin butiran tanpa menjemukan anda, tetapi saya masih mengharapkan anda membiasakan diri dengan beberapa aspek Python dan Django.

versi akhir kod sumber boleh didapati di https://github.com/saad4software/alive-diary-backend

Pesanan siri

Semak artikel sebelum ini jika berminat!

  1. Projek AI dari Scratch, The Idea, Alive Diary
  2. Buktikan ia boleh dilaksanakan dengan Google AI Studio
  3. Persediaan Projek API Django
  4. Pengurusan akaun Django (1), pendaftaran dan pengaktifan
  5. Pengurusan akaun Django (2), log masuk dan tukar kata laluan
  6. Rangka kerja Django Rest dengan Swagger
  7. Pengurusan akaun Django (3) terlupa kata laluan dan butiran akaun (Anda di sini?)

Bagaimana ia berfungsi?

Bagaimana cara melupakan permintaan kata laluan berfungsi? prosesnya hendaklah mengikut langkah

  • Pengguna terlupa kata laluannya, jelas sekali ?, bodohnya saya.
  • Pengguna memasukkan alamat e-melnya.
  • E-mel dengan kod pengesahan dihantar ke e-mel.
  • Pengguna boleh menggunakan e-mel dan kod pengaktifan untuk menetapkan kata laluan baharu.

Jadi, kami memerlukan API yang mengambil alamat e-mel, mencipta kod pengaktifan dan menghantarnya kepada pengguna, sama seperti API kod hantar semula.
Kami juga memerlukan API lain yang mengambil e-mel, kod pengaktifan dan kata laluan baharu untuk menetapkan semula kata laluan.
Bermula dengan menghantar semula kod API kelihatan seperti idea yang bagus sekarang.

Hantar semula kod API

Seperti biasa, mari kita mulakan dengan serializer

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

Salin selepas log masuk
Salin selepas log masuk

app_account/serializers.py

Ini ialah penyeri bersiri generik, dengan satu medan, nama pengguna, kami sedang menyemak untuk memastikan ia adalah alamat e-mel yang sah dan pengguna didaftarkan dalam sistem.

sekarang untuk pandangan

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<{settings.EMAIL_SENDER}>',
            [user.username],
            fail_silently=False,
        )

        return Response("success")
Salin selepas log masuk
Salin selepas log masuk

app_account/views.py

Paparan bermula dengan mengesahkan permintaan, kemudian mengambil pengguna dan mencipta kod segera untuknya. dan akhirnya menghantar kod melalui e-mel kepada pengguna.
Dan akhirnya, URL

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()),
]
Salin selepas log masuk
Salin selepas log masuk

app_account/urls.py

kita boleh mengujinya pada swagger sekarang

Django accounts management app ( forgot password and account details

Tetapkan semula kata laluan API

Pensiri harus mengandungi nama pengguna, kod yang dihantar dan kata laluan baharu; ia harus menyemak untuk memastikan ia adalah nama pengguna dan kod yang sah, agak seperti

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
Salin selepas log masuk
Salin selepas log masuk

app_account/serializers.py

semua medan diperlukan, kami menggunakan fungsi pengesahan untuk mengesahkan kedua-dua nama pengguna dan kod bersama-sama. jika tiada kod segera untuk pengguna ini, kami menimbulkan ralat pengesahan dan jika kod yang dihantar tidak sepadan dengan nilai kod segera, kami memaklumkan pengguna dengan menaikkan ralat pengesahan "invalid_code".

untuk paparan, kami perlu mengesahkan serializer pada mulanya

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

Salin selepas log masuk
Salin selepas log masuk

app_account/views.py

jika serializer tidak sah, kami menimbulkan pengecualian API dengan ralat serializer, jika sah, kami sedang menyoal pengesahan segera menggunakan data serializer. Perhatikan bahawa pertanyaan ini sentiasa wujud dan kod yang dihantar adalah sama dengan nilai kod segera pengesahan kerana pertanyaan ini telah melepasi semakan serializer.
Kemudian kami memadamkan contoh pengesahan daripada pangkalan data dan mengemas kini kata laluan pengguna dengan nilai "new_password" daripada serializer

akhirnya, mari kemas kini fail 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<{settings.EMAIL_SENDER}>',
            [user.username],
            fail_silently=False,
        )

        return Response("success")
Salin selepas log masuk
Salin selepas log masuk

app_account/urls.py

API butiran akaun

Mari kita mulakan dengan mencipta penyeri bersiri untuk model pengguna, ia akan kelihatan seperti ini

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()),
]
Salin selepas log masuk
Salin selepas log masuk

app_account/serializers.py

ia adalah model bersiri, kami memilih model pengguna dan menyenaraikan medan untuk disiri.

bergerak ke paparan, kami memerlukan paparan yang membolehkan pengguna mendapatkan butiran pengguna dengan permintaan GET dan mengemas kini butiran pengguna dengan permintaan POST, ia akan kelihatan seperti

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
Salin selepas log masuk
Salin selepas log masuk

app_account/views.py

dan url

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")
Salin selepas log masuk

app_account/urls.py

itu sahaja! mari kita uji ini dengan Swagger, membuka http://localhost:8555/swagger/ dan menggunakan log masuk membolehkan kita mendapatkan token yang sah. Untuk menguji sebarang permintaan yang dibenarkan, kita perlu mengklik pada kunci ? ikon, sebarang ikon kunci dalam kesombongan dan sediakan token dengan awalan "Pembawa", agak seperti "Pembawa eyJhbGc..."

Django accounts management app ( forgot password and account details

kini menguji butiran API harus mengembalikan butiran akaun seperti yang ditunjukkan

Django accounts management app ( forgot password and account details

Itu sahaja! tahniah, anda mempunyai apl pengurusan akaun berfungsi sepenuhnya yang boleh digunakan dalam mana-mana apl Django dengan pengubahsuaian yang minimum

Adakah anda percaya ia memerlukan fungsi lain? sila buat cadangan!

Kami akan kembali ke apl utama dalam artikel kami yang seterusnya, jadi

Nantikan ?

Atas ialah kandungan terperinci Apl pengurusan akaun Django (terlupa kata laluan dan butiran akaun. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan