如何在现有视图中使用Django密码验证?
我有一个现有的django views.py,其中应用了一些密码、用户名和电子邮件验证逻辑。但是,接下来我需要应用更高级的密码验证。例如,密码长度限制、大写字母sesitivity等。我有一个为高级验证编写的代码,但我无法将其应用于现有的views.py。下面是views.py中的代码如何在现有视图中使用Django密码验证?,django,python-3.x,Django,Python 3.x,我有一个现有的django views.py,其中应用了一些密码、用户名和电子邮件验证逻辑。但是,接下来我需要应用更高级的密码验证。例如,密码长度限制、大写字母sesitivity等。我有一个为高级验证编写的代码,但我无法将其应用于现有的views.py。下面是views.py中的代码 from django.shortcuts import render, redirect from django.contrib.auth.models import User from django.cont
from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from django.contrib import messages
from . import validator
def register(request):
if request.method == 'POST':
first_name = request.POST['first_name']
last_name = request.POST['last_name']
email = request.POST['email']
username = request.POST['username']
password = request.POST['password', validator.MinimumLengthValidator]
password2 = request.POST['password2']
# check if the password match
if password == password2:
if User.objects.filter(username=username).exists():
messages.error(request, 'username already exist')
return redirect('register')
else:
if User.objects.filter(email=email).exists():
messages.error(request, 'Registration Failed - Try different email address')
return redirect('register')
else:
user = User.objects.create_user(username=username, password=password, email=email,
first_name=first_name, last_name=last_name)
user.save()
messages.success(request, 'Registration complete, please proceed to login')
return redirect('register')
else:
messages.error(request, 'password dose not match')
return redirect('register')
else:
return render(request, 'ACCOUNTS/register.html')
下面是validate.py中高级密码验证的代码
import re
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext as _
class MinimumLengthValidator:
def __init__(self, min_length=8):
self.min_length = min_length
def validate(self, password, user=None):
if len(password) < self.min_length:
raise ValidationError(
_("This password must contain at least %(min_length)d characters."),
code='password_too_short',
params={'min_length': self.min_length},
)
def get_help_text(self):
return _(
"Your password must contain at least %(self.min_length)d characters."
% {'min_length': self.min_length}
)
class NumberValidator(object):
def validate(self, password, user=None):
if not re.findall('\d', password):
raise ValidationError(
_("The password must contain at least %(min_digits)d digit(s), 0-9."),
code='password_no_number',
)
def get_help_text(self):
return _(
"Your password must contain at least 1 digit, 0-9."
)
class UppercaseValidator(object):
def validate(self, password, user=None):
if not re.findall('[A-Z]', password):
raise ValidationError(
_("The password must contain at least 1 uppercase letter, A-Z."),
code='password_no_upper',
)
def get_help_text(self):
return _(
"Your password must contain at least 1 uppercase letter, A-Z."
)
但这不起作用。如果我是对的,我可以编写一个mixin类并在我的views.py中调用它。但我使用的是基于函数的视图。所以,我不确定我是否可以使用mixin。请建议我们如何达到预期的结果
新错误:
你需要使用表单来干净地使用它们。尽管你也需要改变这些
def min_length(password): # validator
if not re.findall('\d', password):
raise ValidationError(
_("The password must contain at least %(min_digits)d digit(s), 0-9."),
code='password_no_number',
)
然后更新:
但是,如果不想使用django表单,则需要手动运行这些验证,例如:
def register(request):
validators = [MinimumLengthValidator, NumberValidator, UppercaseValidator]
if request.method == 'POST':
# some code
password = request.POST('password')
try:
for validator in validators:
validator().validate(password)
except ValidationError as e:
messages.error(request, str(e))
return redirect('register')
您可以创建一个自定义表单类,并使用它来验证您的请求主体
from django.forms import ModelForm
from yourApp.models import YourModel
# Create the form class.
class YourCustomValidationForm(ModelForm):
class Meta:
model = YourModel
fields = ['field1', 'field2']
def clean_psswd(self):
#custom validation
form = YourCustomValidationForm(request.POST)
if form.is_valid():
pass
else:
#fail
In views.py
使用请求正文中的值创建此类的实例
from django.forms import ModelForm
from yourApp.models import YourModel
# Create the form class.
class YourCustomValidationForm(ModelForm):
class Meta:
model = YourModel
fields = ['field1', 'field2']
def clean_psswd(self):
#custom validation
form = YourCustomValidationForm(request.POST)
if form.is_valid():
pass
else:
#fail
如果愿意,您可以使用自己的验证,而无需使用django内置验证,如下所示:
password = "mypassword_Q@1"
if len(password) < 8 or password.lower() == password or password.upper() == password or password.isalnum()\
or not any(i.isdigit() for i in password):
print('your password is weak ')
else:
print('your password is strong ')
password=“我的密码_Q@1"
如果len(password)<8或password.lower()==password或password.upper()==password或password.isalnum()\
或不存在(i.isdigit()表示密码中的i):
打印('您的密码很弱')
其他:
打印('您的密码很强')
我已经创建了验证器模块的一个对象,并调用了其中的所有函数,如您所示。但是我的IDE中有一个错误“所有这些文件的未解析引用。您需要从您编写的文件中导入它们,使用来自您的验证程序的\u文件导入MinimumLengthValidator、NumberValidator、UppercaseValidator
您可以这样尝试吗:验证程序=[validator.MinimumLengthValidator,validator.NumberValidator,validator.UppercaseValidator]
?感谢您的帮助,您的建议正在发挥作用。但最后一件事是,当我输入的密码与标准不匹配时,我会得到所需的错误。但我没有在UI上得到这些错误,我得到的是django抛出错误的方式。我已经在原始帖子中发布了错误。@learner我想您可以对此进行研究:
password = "mypassword_Q@1"
if len(password) < 8 or password.lower() == password or password.upper() == password or password.isalnum()\
or not any(i.isdigit() for i in password):
print('your password is weak ')
else:
print('your password is strong ')