from django.urls import path, include from drf_yasg.utils import swagger_auto_schema from drf_yasg import openapi from rest_framework.decorators import api_view from dj_rest_auth.views import ( LoginView, LogoutView, PasswordResetView, PasswordResetConfirmView, UserDetailsView ) from rest_framework import serializers # 定义Swagger请求和响应Schema class StandardLoginRequestSchema(serializers.Serializer): username = serializers.CharField(required=True, help_text="用户名") password = serializers.CharField(required=True, help_text="密码") class StandardLoginResponseSchema(serializers.Serializer): key = serializers.CharField(help_text="认证令牌") class PasswordResetRequestSchema(serializers.Serializer): email = serializers.EmailField(required=True, help_text="用户注册邮箱") class PasswordResetConfirmRequestSchema(serializers.Serializer): new_password1 = serializers.CharField(required=True, help_text="新密码") new_password2 = serializers.CharField(required=True, help_text="确认新密码") uid = serializers.CharField(required=True, help_text="用户ID(编码后)") token = serializers.CharField(required=True, help_text="重置密码令牌") class EmptyResponseSchema(serializers.Serializer): detail = serializers.CharField(help_text="操作结果信息") # 添加Swagger文档到dj_rest_auth视图 login_view = swagger_auto_schema( method='post', request_body=StandardLoginRequestSchema, responses={ 200: openapi.Response('登录成功', StandardLoginResponseSchema), 400: openapi.Response('登录失败', openapi.Schema( type=openapi.TYPE_OBJECT, properties={ 'non_field_errors': openapi.Schema( type=openapi.TYPE_ARRAY, items=openapi.Schema(type=openapi.TYPE_STRING) ) } )) }, operation_description="使用用户名和密码进行标准登录", tags=['用户认证'] )(LoginView.as_view()) logout_view = swagger_auto_schema( method='post', responses={ 200: openapi.Response('登出成功', EmptyResponseSchema) }, operation_description="退出登录,使当前令牌失效", tags=['用户认证'], security=[{'Bearer': []}] )(LogoutView.as_view()) password_reset_view = swagger_auto_schema( method='post', request_body=PasswordResetRequestSchema, responses={ 200: openapi.Response('密码重置邮件已发送', EmptyResponseSchema) }, operation_description="发送密码重置邮件到用户邮箱", tags=['用户认证'] )(PasswordResetView.as_view()) password_reset_confirm_view = swagger_auto_schema( method='post', request_body=PasswordResetConfirmRequestSchema, responses={ 200: openapi.Response('密码重置成功', EmptyResponseSchema) }, operation_description="使用重置链接中的令牌确认密码重置", tags=['用户认证'] )(PasswordResetConfirmView.as_view()) user_details_view = swagger_auto_schema( method='get', responses={ 200: openapi.Response('获取用户信息成功', openapi.Schema( type=openapi.TYPE_OBJECT, properties={ 'id': openapi.Schema(type=openapi.TYPE_INTEGER, description='用户ID'), 'username': openapi.Schema(type=openapi.TYPE_STRING, description='用户名'), 'email': openapi.Schema(type=openapi.TYPE_STRING, description='邮箱'), 'phone_number': openapi.Schema(type=openapi.TYPE_STRING, description='手机号码'), 'first_name': openapi.Schema(type=openapi.TYPE_STRING, description='名'), 'last_name': openapi.Schema(type=openapi.TYPE_STRING, description='姓'), 'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, description='是否激活') } )) }, operation_description="获取当前登录用户的详细信息,不包含敏感字段如密码", tags=['用户认证'], security=[{'Bearer': []}] )(UserDetailsView.as_view()) # 定义URL模式 urlpatterns = [ path('login/', login_view, name='rest_login'), path('logout/', logout_view, name='rest_logout'), path('password/reset/', password_reset_view, name='rest_password_reset'), path('password/reset/confirm/', password_reset_confirm_view, name='rest_password_reset_confirm'), path('user/', user_details_view, name='rest_user_details'), # 包含其他dj_rest_auth URLs path('', include('dj_rest_auth.urls')), ]