使用Djoser和Django Rest Framework激活帐户

时间:2019-12-14 12:36:24

标签: python django django-rest-framework djoser

我在我的项目中使用Djoser进行身份验证。 到目前为止,一直在努力添加电子邮件激活功能已超过4天,但由于文档难以理解,因此似乎无法很好地掌握它。

这是我的代码 settings.py

#change auth model to custom model
AUTH_USER_MODEL = 'userauth.User'

#setting up email server
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'okumujustine01@gmail.com'
EMAIL_HOST_PASSWORD = 'codemanuzmaster'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = 'okumujustine01@gmail.com'

#djoser login settings
DJOSER = {
    'DOMAIN': 'localhost:8000',
    'SITE_NAME': 'net',
    'LOGIN_FIELD':'email',
    'USER_CREATE_PASSWORD_RETYPE':True,
    'ACTIVATION_URL': '#/users/activate/{uid}/{token}',
    'SEND_ACTIVATION_EMAIL': True,
    'SERIALIZERS':{
        'user_create':'userauth.serializers.UserCreateSerializer',
        'user':'userauth.serializers.UserCreateSerializer',
        'activation': 'djoser.email.ActivationEmail',
    }
}

这是我在创建用户后收到的电子邮件

http://example.com/auth/users/activate/MQ/5c9-26bcab9e85e8a967731d

它显示 example.com ,但我希望它将网址更改为 localhost:8000

您收到此电子邮件是因为您需要在example.com上完成激活过程。

请转到以下页面激活帐户:

http://example.com/auth/users/activate/MQ/5c9-26bcab9e85e8a967731d

如果我将网址手动更改为

http://127.0.0.1:8000/users/activate/MQ/5c9-26bcab9e85e8a967731d

它不断返回

{
    "detail": "Authentication credentials were not provided."
}

我真的要求你们帮助我。

2 个答案:

答案 0 :(得分:1)

要回答您的原始问题(如何为激活URL使用不同的域),您需要从Djoser设置中删除DOMAIN和SITE_NAME。示例:

DOMAIN = config('DOMAIN') #localhost:8000
SITE_NAME = config('SITE_NAME') #net

DJOSER = {
    'LOGIN_FIELD':'email',
    'USER_CREATE_PASSWORD_RETYPE':True,
    'ACTIVATION_URL': '#/users/activate/{uid}/{token}',
    'SEND_ACTIVATION_EMAIL': True,
    'SERIALIZERS':{
        'user_create':'userauth.serializers.UserCreateSerializer',
        'user':'userauth.serializers.UserCreateSerializer',
        'activation': 'djoser.email.ActivationEmail',
}

然后,您应该在电子邮件中获得下一个链接:

http://localhost:8000/auth/users/activate/MQ/5c9-26bcab9e85e8a967731d

答案 1 :(得分:0)

我已经使用下面的答案https://stackoverflow.com/a/47159919/8110396

我可能正在解释您已经了解的事情,但这可能会帮助其他人了解这种情况的进展。

查看User Activation上的Djoser文档,它说:“此端点不是直接向您的用户公开的URL”,

这意味着使用的链接不会提供给注册人员,您在电子邮件中获得的链接需要激活一些代码,这些代码将执行对Django视图的调用,从而激活用户的电子邮件。

我想您可以从前端执行这两个操作,在前端,一些JavaScript使用fetch / axios会调用电子邮件激活视图。但是,也可以通过使Django视图包含将调用电子邮件激活视图的代码来实现。

因此,基本上,电子邮件链接将触发代码(JS / Python),该代码将向Django视图发送http发布请求。

我不知道最佳选择是什么,但是此解决方案将全部通过Django进行。

基本流程是这样:

1个用户注册

2用户正在发送带有URL的电子邮件,其中包含我们需要的两个重要信息,uidtoken

可以通过ACTIVATION_URL设置更改电子邮件中此URL的格式:在我的情况下为"ACTIVATION_URL": "auth/request_activate/{uid}/{token}",

/{uid}/{token}意味着我们可以在链接指向的视图中使用uidtoken

3此链接会导致执行用户激活的Django视图

views.py

from rest_framework import permissions
from rest_framework.decorators import (
    api_view,
    permission_classes,
)
from rest_framework.response import Response
from rest_framework.views import APIView

import requests


@api_view(["GET"])
@permission_classes([permissions.AllowAny])
def request_user_activation(request, uid, token):
    """ 
    Intermediate view to activate a user's email. 
    """
    post_url = "http://127.0.0.1:8000/djoser_auth/users/activation/"
    post_data = {"uid": uid, "token": token}
    result = requests.post(post_url, data=post_data)
    content = result.text
    return Response(content)

如您所见,视图函数接收uidtoken作为参数,然后使用{{1}在POST请求中将其发送到实际(Djoser)视图}}库。

此处创建的

requests是Djoser文档中提到的用于激活电子邮件的post_urlDefault URL(您可能会发现较旧的网址/users/activation/,请不要使用那是行不通的;))。

请注意,我的网址中有/users/activate/,其中的默认值仅为djoser_auth,我不会继续讲究为什么,但这是我的主要auth

urls.py

还有我的from django.urls import include, path urlpatterns = [ ... path("auth/", include("authentication.urls")), ... path("djoser_auth/", include("djoser.urls")), path("djoser_auth/", include("djoser.urls.jwt")), ]

settings.py

因此,使用它,您应该能够单击电子邮件中的链接,并且您的用户在管理员中选中了DJOSER = { "ACTIVATION_URL": "auth/request_activate/{uid}/{token}", "SEND_ACTIVATION_EMAIL": True, "SERIALIZERS": {}, "USER_CREATE_PASSWORD_RETYPE": True, } 复选框。

enter image description here