Rumah > Artikel > pembangunan bahagian belakang > Apl pengurusan akaun Django (terlupa kata laluan dan butiran akaun
Kami mula mengusahakan apl akaun dalam artikel sebelumnya, artikel ini akan membinanya. Ia akan meliputi
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
Semak artikel sebelum ini jika berminat!
Bagaimana cara melupakan permintaan kata laluan berfungsi? prosesnya hendaklah mengikut langkah
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.
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
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")
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()), ]
app_account/urls.py
kita boleh mengujinya pada swagger sekarang
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
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
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")
app_account/urls.py
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()), ]
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
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")
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..."
kini menguji butiran API harus mengembalikan butiran akaun seperti yang ditunjukkan
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!