【问题标题】:djoser activate account by linkdjoser 通过链接激活帐户
【发布时间】:2020-03-27 20:16:24
【问题描述】:

点击djoser发送的链接后如何激活? 我的设置 '''

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'djoser',
    'rest_framework',
    'rest_framework_simplejwt',
    'data',

]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES':(
        'rest_framework_simplejwt.authentication.JWTAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
}

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'technomancer7629@gmail.com'
EMAIL_HOST_PASSWORD='naz@technomancer7629'
EMAIL_PORT = 587

PROTOCOL = "http"
DOMAIN = "127.0.0.1:8000"
DJOSER = {
    'PASSWORD_RESET_CONFIRM_URL': '/password/reset/confirm/{uid}/{token}',
    'USERNAME_RESET_CONFIRM_URL': '/username/reset/confirm/{uid}/{token}',
    'ACTIVATION_URL': 'auth/user/activate/{uid}/{token}',
    'SEND_ACTIVATION_EMAIL': True,
    'SEND_CONFRIMATION_EMAIL':True,
    'SERIALIZERS': {},
    'EMAIL':{
        'activation': 'djoser.email.ActivationEmail',
    },
}

''' 网址.py '''

urlpatterns = [
    path('admin/', admin.site.urls),
    path('auth/',include('djoser.urls')),
    path('auth/',include('djoser.urls.jwt')),
    path("api/data/",include("data.urls")),


]

''' 我的电子邮件链接 http://127.0.0.1:8000/auth/users/activate/Mjc/5bx-5f9542251fd9db7e980b 错误:

使用 startgo1.urls 中定义的 URLconf,Django 按以下顺序尝试了这些 URL 模式:

admin/
auth/ ^users/$ [name='user-list']
auth/ ^users\.(?P<format>[a-z0-9]+)/?$ [name='user-list']
auth/ ^users/activation/$ [name='user-activation']
auth/ ^users/activation\.(?P<format>[a-z0-9]+)/?$ [name='user-activation']
auth/ ^users/me/$ [name='user-me']
auth/ ^users/me\.(?P<format>[a-z0-9]+)/?$ [name='user-me']
auth/ ^users/resend_activation/$ [name='user-resend-activation']
auth/ ^users/resend_activation\.(?P<format>[a-z0-9]+)/?$ [name='user-resend-activation']
auth/ ^users/reset_password/$ [name='user-reset-password']
auth/ ^users/reset_password\.(?P<format>[a-z0-9]+)/?$ [name='user-reset-password']
auth/ ^users/reset_password_confirm/$ [name='user-reset-password-confirm']
auth/ ^users/reset_password_confirm\.(?P<format>[a-z0-9]+)/?$ [name='user-reset-password-confirm']
auth/ ^users/reset_username/$ [name='user-reset-username']
auth/ ^users/reset_username\.(?P<format>[a-z0-9]+)/?$ [name='user-reset-username']
auth/ ^users/reset_username_confirm/$ [name='user-reset-username-confirm']
auth/ ^users/reset_username_confirm\.(?P<format>[a-z0-9]+)/?$ [name='user-reset-username-confirm']
auth/ ^users/set_password/$ [name='user-set-password']
auth/ ^users/set_password\.(?P<format>[a-z0-9]+)/?$ [name='user-set-password']
auth/ ^users/set_username/$ [name='user-set-username']
auth/ ^users/set_username\.(?P<format>[a-z0-9]+)/?$ [name='user-set-username']
auth/ ^users/(?P<pk>[^/.]+)/$ [name='user-detail']
auth/ ^users/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='user-detail']
auth/ ^$ [name='api-root']
auth/ ^\.(?P<format>[a-z0-9]+)/?$ [name='api-root']
auth/ ^jwt/create/? [name='jwt-create']
auth/ ^jwt/refresh/? [name='jwt-refresh']
auth/ ^jwt/verify/? [name='jwt-verify']
api/data/

当前路径 auth/users/activate/Mjc/5bx-5f9542251fd9db7e980b 与其中任何一个都不匹配。

【问题讨论】:

  • 您确定要在电子邮件链接中添加带有users/activation/ 而不是users/activate/ 的网址吗?
  • 我不知道。检查我的激活网址。是不是错了?
  • 我没有添加那些 url djoser 添加它们

标签: django python-3.x django-rest-framework django-rest-framework-jwt djoser


【解决方案1】:

用 djoser 试试这个:

在 auth.urls 中:

path('activate/<str:uid>/<str:token>/',
ActivateUserEmail.as_view(), 
name='activate email')
class ActivateUserEmail(APIView):
    def get (self, request, uid, token):
        protocol = 'https://' if request.is_secure() else 'http://'
        web_url = protocol + request.get_host()
        post_url = web_url + "/auth/users/activation/"
        post_data = {'uid': uid, 'token': token}
        result = requests.post(post_url, data = post_data)
        message = result.text
        return Response(message)

【讨论】:

    【解决方案2】:

    谢谢你。我只是用这段代码解决了它。

    def ActivateUserAccount(request, uidb64=None,token=None):
     #print(force_text(urlsafe_base64_decode(uidb64)))
        #print(token)
        try:
            uid = force_text(urlsafe_base64_decode(uidb64))
            #print(type(uid),uid)
            user = User.objects.get(pk=uid)
            print(user)
        except User.DoesNotExist:
            user = None
        if user and default_token_generator.check_token(user,token):
            user.is_email_verified = True
            user.is_active = True
            user.save()
            login(request,user)
            print("Activaton done")
        else:
            print("Activation failed")
    

    【讨论】:

    • 这是视图吗?这是如何运作的?我面临同样的问题,他们告诉我我的“uid”无效
    【解决方案3】:

    我通读了 Djoser 的 docs 并且您的激活 URL 是正确的,但是您以错误的方式使用它,您应该将该 URL 与 POST 请求一起使用以使其工作(当前您单击它的方式将调用GET 请求)所以我建议在 Django 上创建一个 URL 端点来处理 GET 请求,以便在 this issue 之后发送它的 POST 请求。

    在你的 urls.py 中:

    path('activate/<str:uid>/<str:token>/', UserActivationView.as_view()),
    

    你的 views.py 会处理它并在 URL 上调用 POST 请求:

    class UserActivationView(APIView):
        def get (self, request, uid, token):
            protocol = 'https://' if request.is_secure() else 'http://'
            web_url = protocol + request.get_host()
            post_url = web_url + "/auth/users/activate/"
            post_data = {'uid': uid, 'token': token}
            result = requests.post(post_url, data = post_data)
            content = result.text()
            return Response(content)
    

    【讨论】:

    • 是的,我之前试过,但它说用户激活没有反向功能
    • 如果你向下滚动你可以看到this你需要设置djoser urls
    • 哪里可以设置网址
    • 在那个页面上最后一条评论是我的
    • @safakat001 可能是因为他想指定函数名,但你可以用它做普通的 POST 请求来检查,比如this
    猜你喜欢
    • 2019-04-19
    • 2020-04-07
    • 2014-08-17
    • 2021-05-13
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多