用户注册时的Python Django 2电子邮件验证 [英] Python Django 2 Email Verification on User SignUp

查看:104
本文介绍了用户注册时的Python Django 2电子邮件验证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Python(3.6)和Django(2.0)开发一个项目,在该项目中,我需要在注册时验证用户的电子邮件.

I'm working on a project using Python(3.6) and Django(2.0) in which I need to verify the user's email on registration.

这是我尝试过的:

App应用于名为 users

forms.py

class SignUpForm(UserCreationForm):
    first_name = forms.CharField(max_length=30, required=False, help_text='Optional.')
    last_name = forms.CharField(max_length=30, required=False, help_text='Optional.')
    email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.')

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2')

    def save(self, commit=True):
        user = super(SignUpForm, self).save(commit=False)
        user.email = self.cleaned_data['email']
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.password = self.cleaned_data['password1']
        if commit:
            user.save()
        return user

urls.py:

urlpatterns = [
    path('signup/', views.SignUpView.as_view(), name='signup'),
    path('login/', views.LoginView.as_view(), name='login'),
    path('logout/', views.LogoutView.as_view(), name='logout'),
    url(r'^activate/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
        views.activate, name='activate'),

views.py:

class SignUpView(generic.CreateView):
form_class = forms.SignUpForm
template_name = 'users/signup.html'
success_url = reverse_lazy('users:login')
form_valid_message = 'User has been created successfully!'
form_invalid_message = 'Something wrong'

def post(self, request, *args, **kwargs):
    if request.method == 'POST':
        print('Get post signup')
        form = forms.SignUpForm(request.POST)
        print(request.POST)
        if form.is_valid():
            print('Form is valid')
            fd = form.cleaned_data
            username = fd['username']
            email = fd['email']
            password1 = fd['password1']
            password2 = fd['password2']
            password = None
            if password1 == password2:
                password = password1

            if not (User.objects.filter(username=username).exists() or User.objects.filter(email=email).exists()):
                userObj = User.objects.create_user(username, email, password)
                userObj.first_name = fd['first_name']
                userObj.last_name = fd['last_name']
                userObj.is_active = False
                userObj.save()
                print(userObj)
                current_site = get_current_site(request)
                mail_subject = 'Activate your blog account.'
                message = render_to_string('acc_active_email.html', {
                    'user': User,
                    'domain': current_site.domain,
                    'uid': urlsafe_base64_encode(force_bytes(userObj.pk)).decode(),
                    'token': account_activation_token.make_token(userObj),
                })
                to_email = form.cleaned_data.get('email')
                email = EmailMessage(
                    mail_subject, message, to=[to_email]
                )
                email.send()
                # user = authenticate(username=username, password=password)
                # login(request, user)

                return HttpResponseRedirect('/users/login')
            else:
                return "This Email Already exists, Use another email address please!"

    else:
        form = forms.SignUpForm()

    return render(request, 'users/signup.html', {'form': form})


def activate(request, uidb64, token):
    try:
        uid = force_text(urlsafe_base64_decode(uidb64))
        user = User.objects.get(pk=uid)
    except(TypeError, ValueError, OverflowError, User.DoesNotExist):
        user = None
    if user is not None and account_activation_token.check_token(user, token):
        user.is_active = True
        user.save()
        login(request, user)
        # return redirect('home')
        return HttpResponse('Thank you for your email confirmation. Now you can login your account.')
    else:
        return HttpResponse('Activation link is invalid!')

我在templates目录中创建了一个模板,作为:

And I have craeted a template in my templates directory as:

{% autoescape off %}
Hi {{ user.username }},
Please click on the link to confirm your registration,
http://{{ domain }}{% url 'users:activate' uidb64=uid token=token %}
{% endautoescape %}

当我提出注册请求时,它会返回如下错误:

When I make a signup request, it returns an error like below:

表格有效 内部服务器错误:/users/signup/回溯(最近的呼叫 最后):文件 "/Users/abdul/PycharmProjects/Dmitry/DVirEnv/lib/python3.6/site-packages/django/core/handlers/exception.py", 第34行,在内部 响应= get_response(请求)文件"/Users/abdul/PycharmProjects/Dmitry/DVirEnv/lib/python3.6/site-packages/django/utils/deprecation.py", 第93行,在致电 响应= self.process_response(请求,响应)文件"/Users/abdul/PycharmProjects/Dmitry/DVirEnv/lib/python3.6/site-packages/django/middleware/clickjacking.py", 第26行,在process_response中 如果response.get('X-Frame-Options')不是None:AttributeError:'str'对象没有属性'get'[08/Nov/2018 06:20:44]"POST /users/signup/HTTP/1.1"500 56497

Form is valid Internal Server Error: /users/signup/ Traceback (most recent call last): File "/Users/abdul/PycharmProjects/Dmitry/DVirEnv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner response = get_response(request) File "/Users/abdul/PycharmProjects/Dmitry/DVirEnv/lib/python3.6/site-packages/django/utils/deprecation.py", line 93, in call response = self.process_response(request, response) File "/Users/abdul/PycharmProjects/Dmitry/DVirEnv/lib/python3.6/site-packages/django/middleware/clickjacking.py", line 26, in process_response if response.get('X-Frame-Options') is not None: AttributeError: 'str' object has no attribute 'get' [08/Nov/2018 06:20:44] "POST /users/signup/ HTTP/1.1" 500 56497

推荐答案

这是因为您返回的是普通string对象,而不是有效的HTTPResponse.

This is because you are returning plain string object instead of valid HTTPResponse.

return "This Email Already exists, Use another email address please!"

注意:您正在尝试使用现有的电子邮件地址进行注册.

Note: You are trying to signup with existing email address.

这篇关于用户注册时的Python Django 2电子邮件验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆