如何在django-allauth上自定义activate_url?

mip*_*sov 9 django django-urls angularjs django-rest-framework django-allauth

我使用Django和Django REST框架作为后端,AngularJS作为前端.

对于用户管理,我使用的是django-rest-auth,它使用django-allauth进行用户管理.作为基础,我使用了django-rest-auth的demo.

问题出在注册后,当您尝试验证通过激活网址发送电子邮件的电子邮件时: 127.0.0.1:8000/account/confirm-email/yhca8kmijle0ia7k3p7ztbvnd2n1xepn9kyeuaycmlzll5xw19ubjarnvjrot7eu/

其中*127.0.0.1:8000是Django后端.

但在我的情况下,它应该发送类似的URL localhost:9000/#/verifyEmail/akv2dcvrfnk9ex5fho9jk0xx1ggtpfazmi8sfsoi2sbscoezywfp7kzcyqnizrc0.所以这个验证将从前端完成,localhost:9000我的AngularJS前端在哪里.

有没有办法在django-allauth上定制activate_url?

Sto*_*orm 12

我设法通过覆盖DefaultAccountAdapter类并覆盖send_maildjango-allauth doc中指定的方法从前端进行激活:

如果这不符合您的需求,您可以通过覆盖帐户适配器的send_mail方法来连接自己的自定义机制(allauth.account.adapter.DefaultAccountAdapter)

我首先编写了用于确认电子邮件的后端网址:

api_patterns = [
...
url(r'^verify-email/(?P<key>\w+)/$',
        confirm_email, name="account_confirm_email"),
...
]
Run Code Online (Sandbox Code Playgroud)

然后我settings.py按如下方式指定自定义适配器和前端URL :

ACCOUNT_ADAPTER = 'API.adapter.DefaultAccountAdapterCustom'
URL_FRONT = 'http://localhost:9000/'
Run Code Online (Sandbox Code Playgroud)

并在adapter.py我的应用程序中写了这个:

from allauth.account.adapter import DefaultAccountAdapter
from django.conf import settings

class DefaultAccountAdapterCustom(DefaultAccountAdapter):

    def send_mail(self, template_prefix, email, context):
        context['activate_url'] = settings.URL_FRONT + \
            'verify-email/' + context['key']
        msg = self.render_mail(template_prefix, email, context)
        msg.send()
Run Code Online (Sandbox Code Playgroud)

电子邮件中发送的激活网址现在如下所示: http://127.0.0.1:9000/verify-email/<key>/

我将更改为我指定activate_urlURL_FRONT字符串settings.py并附加了密钥,以便从前端发出get请求到我之前写的url(让我们说http://localhost:8000/verify-email/<key>).(以前设置ACCOUNT_CONFIRM_EMAIL_ON_GETTrue仅通过执行get请求来确认电子邮件)


Tom*_*eld 5

找不到任何指定此内容的文档(确保它们一定在某个地方),但查看github他们只是在"account_confirm_email"

您只需要name="account_confirm_email"在其后面添加一个带有参数的 urlpattern,如下所示:

from allauth.account.views import confirm_email

ulrpatterns= patterns('',
    ...
    url(r'^rest-auth/', include('rest_auth.urls')),
    url(r'^verify-email/(?P<key>\w+)/$',
        confirm_email,
        name="account_confirm_email"),
)
Run Code Online (Sandbox Code Playgroud)

这样做的问题是,您现在直接解决依赖项的依赖项。如果较新版本的 django-restauth 不使用此功能,它可能会损坏您。

如果您愿意使用其他库,我目前正在将djoser与 DRF 一起使用,并且发现它非常简单。也许它能满足您的需求。


小智 5

以 Storm 的回答为基础,我略有改进(也许在最初发布答案时这是不可能的)。DefaultAccountAdapter有一个特定的get_email_confirmation_url方法可以被覆盖以生成电子邮件验证 URL,没有别的。以下对我来说效果很好。urls.py 中不需要条目。

在settings.py中

# Repoint this setting to a subclass of the DefaultAccountAdapter 
# so we can override how it handles account verification to allow 
# for usage in an SPA context.
ACCOUNT_ADAPTER = 'common.accountadapter.CustomAccountAdapter'
# An email verification URL that the client will pick up.
CUSTOM_ACCOUNT_CONFIRM_EMAIL_URL = "/verifyemail/?key={0}"
Run Code Online (Sandbox Code Playgroud)

在 common.accountadapter.py 中:

from allauth.account.adapter import DefaultAccountAdapter
from allauth.utils import build_absolute_uri
from django.conf import settings

class CustomAccountAdapter(DefaultAccountAdapter):

    def get_email_confirmation_url(self, request, emailconfirmation):
        url = settings.CUSTOM_ACCOUNT_CONFIRM_EMAIL_URL.format(emailconfirmation.key)
        ret = build_absolute_uri(
            request,
            url)
        return ret
Run Code Online (Sandbox Code Playgroud)

就我而言,django 根植于“/backend”,而 javascript 客户端(在 Vue 中)根植于“/”。这将返回一个像这样的 URL,它由 javascript 客户端处理:

http://localhost/verifyemail/?key=MTc:1h4C9w:b0CIOekBNfirVSt-0-bHOSQQnjk

(localhost 是从请求中的主机名自动填充的)。