Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在现有视图中使用Django密码验证?_Django_Python 3.x - Fatal编程技术网

如何在现有视图中使用Django密码验证?

如何在现有视图中使用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

我有一个现有的django views.py,其中应用了一些密码、用户名和电子邮件验证逻辑。但是,接下来我需要应用更高级的密码验证。例如,密码长度限制、大写字母sesitivity等。我有一个为高级验证编写的代码,但我无法将其应用于现有的views.py。下面是views.py中的代码

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 ')