我将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吗?
发布于 2015-12-13 08:35:57
我通过重写DefaultAccountAdapter类和重写django-allauth中指定的send_mail方法,成功地实现了从前端的激活:
如果这不适合您的需要,则可以通过重写帐户适配器(allauth.account.adapter.DefaultAccountAdapter)的send_mail方法来连接您自己的自定义机制。
我首先写了后端url,用于确认电子邮件:
api_patterns = [
...
url(r'^verify-email/(?P<key>\w+)/$',
confirm_email, name="account_confirm_email"),
...
]然后,我在settings.py中将自定义适配器和前端url指定如下:
ACCOUNT_ADAPTER = 'API.adapter.DefaultAccountAdapterCustom'
URL_FRONT = 'http://localhost:9000/'并在我的应用程序的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()电子邮件中发送的激活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请求即可确认电子邮件)
发布于 2015-06-23 20:58:41
找不到指定此内容的文档(确定它们一定在某个地方),但是查看github,它们只是在"account_confirm_email"上做了一个URL反向操作
您只需要在它们之后添加一个带有name="account_confirm_email" param的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"),
)这方面的问题是,您现在正在直接解决依赖关系的依赖关系。如果一个较新版本的django-restauth不使用这个,它可能会对您造成破坏。
如果您愿意使用其他库,我现在使用的是乔瑟和DRF,并且发现它非常简单。也许它能满足你的需要。
发布于 2019-03-13 22:31:00
在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}"在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在我的例子中,django根植于"/backend",而javascript客户机(在Vue中)根植于"/“。这将返回如下URL,该URL由javascript客户端处理:
http://localhost/verifyemail/?key=MTc:1h4C9w:b0CIOekBNfirVSt-0-bHOSQQnjk
(从请求中的主机名自动填充localhost)。
https://stackoverflow.com/questions/27984901
复制相似问题