首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在django-allauth上自定义activate_url?

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

Stack Overflow用户
提问于 2015-01-16 13:21:26
回答 3查看 4.6K关注 0票数 18

我将Django与Django REST框架一起用作后端,并在前端使用AngularJS。

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

问题是在注册后,当您尝试验证它用激活url:127.0.0.1:8000/account/confirm-email/yhca8kmijle0ia7k3p7ztbvnd2n1xepn9kyeuaycmlzll5xw19ubjarnvjrot7eu/发送的电子邮件时。

其中*127.0.0.1:8000是Django后端。

但在我的例子中,它应该发送类似于localhost:9000/#/verifyEmail/akv2dcvrfnk9ex5fho9jk0xx1ggtpfazmi8sfsoi2sbscoezywfp7kzcyqnizrc0的url。因此,这个验证将在前端完成,其中localhost:9000是我的AngularJS前端。

有什么方法可以在django-allauth上定制activate_url吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-13 08:35:57

我通过重写DefaultAccountAdapter类和重写django-allauth中指定的send_mail方法,成功地实现了从前端的激活:

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

我首先写了后端url,用于确认电子邮件:

代码语言:javascript
复制
api_patterns = [
...
url(r'^verify-email/(?P<key>\w+)/$',
        confirm_email, name="account_confirm_email"),
...
]

然后,我在settings.py中将自定义适配器和前端url指定如下:

代码语言:javascript
复制
ACCOUNT_ADAPTER = 'API.adapter.DefaultAccountAdapterCustom'
URL_FRONT = 'http://localhost:9000/'

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

代码语言:javascript
复制
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()

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

我将activate_url更改为我在settings.py中指定的URL_FRONT字符串,并追加了键,以便从前面编写的url (假设为http://localhost:8000/verify-email/<key>)发出get请求。(之前将ACCOUNT_CONFIRM_EMAIL_ON_GET设置为True,只需执行get请求即可确认电子邮件)

票数 30
EN

Stack Overflow用户

发布于 2015-06-23 20:58:41

找不到指定此内容的文档(确定它们一定在某个地方),但是查看github,它们只是在"account_confirm_email"上做了一个URL反向操作

您只需要在它们之后添加一个带有name="account_confirm_email" param的urlpattern,如下所示:

代码语言:javascript
复制
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"),
)

这方面的问题是,您现在正在直接解决依赖关系的依赖关系。如果一个较新版本的django-restauth不使用这个,它可能会对您造成破坏。

如果您愿意使用其他库,我现在使用的是乔瑟和DRF,并且发现它非常简单。也许它能满足你的需要。

票数 5
EN

Stack Overflow用户

发布于 2019-03-13 22:31:00

在Storm回答的基础上,我有了一点小小的改进(也许这在最初发布答案时是不可能的)。DefaultAccountAdapter有一个特定的get_email_confirmation_url方法,它可以被重写以生成电子邮件验证URL,而没有其他任何东西。下面这些对我来说很好。在urls.py中不需要一个条目。

在settings.py中

代码语言:javascript
复制
# 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}"

在common.accountadapter.py中:

代码语言:javascript
复制
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

在我的例子中,django根植于"/backend",而javascript客户机(在Vue中)根植于"/“。这将返回如下URL,该URL由javascript客户端处理:

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27984901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档