渲染带有 uid/token 变量的电子邮件模板时没有反向匹配

Posted

技术标签:

【中文标题】渲染带有 uid/token 变量的电子邮件模板时没有反向匹配【英文标题】:No reverse match when rendering an email template with uid/token variable 【发布时间】:2021-11-05 09:18:57 【问题描述】:

我为用户注册编写了一个视图,包括电子邮件验证。但是,一旦视图尝试呈现邮件模板,它就会由于以下错误而中断。

我什至不理解错误本身。见解将不胜感激。根据一些谷歌搜索,uid 可能不是字符串?

/signup/ 处的 NoReverseMatch 使用关键字参数“'uidb64': 'MTE', 'token': 'asnwwr-550108ae10aa04da212561866c8d1ae3'' 未找到“激活”的反向。尝试了 1 种模式:['activate/(?P[0-9A-Za-z_\-]+)/(?P[0-9A-Za-z]1,13-[0-9A -Za-z]1,20)/$']

邮件模板

% autoescape off %
Hi  user.username ,

Please click on the link below to confirm your registration:

http:// domain % url 'activate' uidb64=uid token=token %
% endautoescape %

查看

def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)

        if form.is_valid():
            user = form.save(commit=False)
            user.is_active = False
            user.save()

            current_site = get_current_site(request)
            subject = 'Activate your Poller Account'
            message = render_to_string('userprofile/account_activation_email.html', 
                'user': user,
                'domain': current_site.domain,
                'uid': urlsafe_base64_encode(force_bytes(user.pk)),   # Issue might sit here?
                'token': account_activation_token.make_token(user),
            )
            user.email_user(subject, message)
            return redirect('account_activation_sent')

令牌

from django.contrib.auth.tokens import PasswordResetTokenGenerator
import six


class AccountActivationTokenGenerator(PasswordResetTokenGenerator):
    def _make_hash_value(self, user, timestamp):
        return (
            six.text_type(user.pk) + six.text_type(timestamp) +
            six.text_type(user.email_confirmed)
        )

account_activation_token = AccountActivationTokenGenerator()

网址

url(r'^account_activation_sent/$', signup_views.account_activation_sent, name='account_activation_sent'),
url(r'^activate/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]1,13-[0-9A-Za-z]1,20)/$', signup_views.activate, name='activate'),

【问题讨论】:

您在模板文件中将 uidb64 和令牌作为 kwargs 传递,但您的网址接受 args 。分享urls.py文件代码 @shahbazahmad 完成谢谢 【参考方案1】:

错误似乎是因为您的令牌有 32 个字符,但正则表达式最多只能有 20 个字符。尝试将正则表达式更改为:

r'^activate/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]1,13-[0-9A-Za-z]1,32)/$'
                                                                   # Change to 32 ^^

【讨论】:

成功了,谢谢。快速提问:如果我增加到 50 个或更多来避免这种冲突,或者上面的令牌生成逻辑是否总是会提供一个 32 个字符的令牌,会不会有伤害? 这取决于您生成的令牌。它可以有任意长度吗? tbh idk,然后必须查看 PasswordResetTokenGen 文档。再次感谢!

以上是关于渲染带有 uid/token 变量的电子邮件模板时没有反向匹配的主要内容,如果未能解决你的问题,请参考以下文章

Python大神教你300行代码搞定HTML模板渲染「附源码」

Django 渲染模板路径配置变量使用。

如何在 Django 模板中的“带有模板标签”中设置 Django 渲染块值?

如何在锚点处渲染 EJS

将twig渲染为html文件,避免重复代码添加变量

渲染 Marionette/Backbone 视图时将变量传递到 Handlebars 模板