python - 带有 token 参数的 Django 电子邮件验证 URL

标签 python django python-3.x django-rest-framework django-views

我正在尝试创建电子邮件验证身份验证,但无法访问此 URL

127.0.0.1:8000/activate/d34324/KYJsqYMoV5DJ0vewSBdC9KZlZtnOAU7KE

如何为此代码创建正确的路由?

urls.py

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

views.py

class OwnerRegister(TemplateView):
    template_name = "owner_register.html"

    def get_context_data(self, * args, ** kwargs):
        context = super(OwnerRegister, self).get_context_data()
        return context

    def logout_view(request):
        logout(request)
        return HttpResponseRedirect("/")

    def activate(request, uidb64, token):
        try:
            print('\n\n request',request)

            user_id = request.GET.get('uid')
            token = request.GET.get('token')
            user = User.objects.get(username=user_id)
            profile = OwnerInfo.objects.get(user=user)
            print(user.date_joined)

            if profile.confirmation_code == token and user.date_joined > (datetime.datetime.now()-datetime.timedelta(days=1)):
                print("test")
                user.is_active = True
                user.save()

                user.backend='django.contrib.auth.backends.ModelBackend' 
                auth_login(request,user)
                return HttpResponseRedirect('You have activated this account')
        except:
            return HttpResponseRedirect('')


def send_registration_confirmation(self,user,request):
    p = OwnerInfo.objects.get(user=user)
    current_site = get_current_site(request)
    content = current_site.domain+"/activate" +  user.username + "/" + str(p.confirmation_code) 
    send_mail("Email Verify", content, 'no-reply@gsick.com', [user.email], fail_silently=False)

最佳答案

尽管您的代码中可能存在任何其他问题,但您的 URL 模式声明似乎存在问题。具体来说,URL 模式为 token 指定以下正则表达式。命名参数和尾部斜杠:

(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/

传入的字符串为token在网址 does not match this regex因为它在第 13 个字符之后缺少连字符。

您的网址也没有尾部斜杠。提供 Django 的 APPEND_SLASH 就可以了。启用选项( the default behaviour ),这将导致 Django 在没有找到没有 URL 模式的情况下自动发出重定向以添加尾部斜杠。

您应该更改用于在 URL 中生成 token 的机制,以确保它与正则表达式匹配(添加连字符 indeed does so ),反之亦然。

关于python - 带有 token 参数的 Django 电子邮件验证 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52154017/

相关文章:

python - django rest 框架中补丁方法的验证

Django、GDAL 和 CircleCI 2

python - 无法排除 Python 中的 cryptography.fernet.InvalidToken 错误

python - 生成一个字符串列表的所有组合,同时包含两个括号和一个被置换的运算符

python - 一个短语中多个换行符的正则表达式

python - 使用 python 检查两个文件的新行独立标识的最佳方法

python - Django,使用 "|": Expression tree is too large (maximum depth 1000)

django - 在 Mac (10.6.8) 上为 Django 初始化 virtualenvwrapper

python-3.x - 具有重复名称的 Pandas read_table

python - 获取已编译函数对象的函数