我正在使用Python(3.6)和Django(2.0)开发一个项目,我需要在注册时验证用户的电子邮件。
这是我尝试过的:
将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
目录中创建了一个模板,为:
{% autoescape off %}
Hi {{ user.username }},
Please click on the link to confirm your registration,
http://{{ domain }}{% url 'users:activate' uidb64=uid token=token %}
{% endautoescape %}
当我提出注册请求时,它返回如下错误:
表格有效 内部服务器错误:/ users / signup / Traceback(最近的呼叫 最后):文件 “ /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
答案 0 :(得分:0)
这是因为您返回的是普通string
对象,而不是有效的HTTPResponse
。
return "This Email Already exists, Use another email address please!"
注意:您正在尝试使用现有的电子邮件地址进行注册。