Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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
Python Django Regex验证程序不工作-部署服务器错误500_Python_Django_Regex - Fatal编程技术网

Python Django Regex验证程序不工作-部署服务器错误500

Python Django Regex验证程序不工作-部署服务器错误500,python,django,regex,Python,Django,Regex,以以下为例: 类项目表单(forms.Form): client=forms.CharField(widget=forms.TextInput(attrs={‘占位符’:‘客户端名称(小写)’}),validator=[RegexValidator(r'^[a-z]+$,‘输入有效的客户端名称(仅小写字母)’) stage=forms.ChoiceField(选项=类型) folder=forms.ChoiceField(选项=FOLDERS,必需=False,标签=“”) purpose=fo

以以下为例:

类项目表单(forms.Form):
client=forms.CharField(widget=forms.TextInput(attrs={‘占位符’:‘客户端名称(小写)’}),validator=[RegexValidator(r'^[a-z]+$,‘输入有效的客户端名称(仅小写字母)’)
stage=forms.ChoiceField(选项=类型)
folder=forms.ChoiceField(选项=FOLDERS,必需=False,标签=“”)
purpose=forms.CharField(widget=forms.TextInput(attrs={'placeholder':'Project purpose(小写;数字可选)}),Validator=[RegexValidator(r'^[a-z-]+[1-9]?$,'输入有效的目的(仅小写字母,带有一个可选数字)'))
computeapi=forms.BooleanField(必需=True,初始=True,label='computeengine')
deploymentmanapi=forms.BooleanField(必需=False,label='Deployment Manager')
storagecompapi=forms.BooleanField(必需=False,标签='Storage Components')
monitorapi=forms.BooleanField(必需=False,label='Monitoring')
loggingapi=forms.BooleanField(必需=False,label='Logging')
def清洁(自清洁):
表单\u数据=自清理\u数据
projectname=表格数据['client']+“-”+表格数据['stage']+“-”+表格数据['purpose']
client=表单_数据['client']
目的=表格数据[“目的”]
对于projectdict中的projectdict:
如果projectname==projectdict['name']:
引发ValidationError(projectname+“已存在!请尝试其他名称。”)
如果不重新匹配(“^[a-z-]+[1-9]?$”,目的):
raise ValidationError(目的+“不符合正则表达式参数”。)
如果不重新匹配(“^[a-z]+$”,客户端):
raise ValidationError(客户端+“不符合正则表达式参数”。)
返回表格数据
projectname的ValidationError工作正常。 然而,它不适用于正则表达式,而是不断抛出一个500错误。 我们是否需要专门做些什么来让RegexValidator在类变量中按预期工作?我不相信我的额外代码在clean中是必要的(如果需要,它就不能正常工作)

在此方面的任何帮助都将不胜感激

编辑2020年8月28日: 根据请求进行回溯:

Traceback (most recent call last):
  File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\user\OneDrive - Company\GCP App Engine\Test-Django-Terraform-Deployments - Copy\webscripts\views.py", line 30, in projectcreation
    if form.is_valid():
  File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\forms\forms.py", line 185, in is_valid
    return self.is_bound and not self.errors
  File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\forms\forms.py", line 180, in errors
    self.full_clean()
  File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\forms\forms.py", line 382, in full_clean
    self._clean_form()
  File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\forms\forms.py", line 409, in _clean_form
    cleaned_data = self.clean()
  File "C:\Users\user\OneDrive - Company\GCP App Engine\Test-Django-Terraform-Deployments - Copy\webscripts\projectform.py", line 90, in clean
    projectname = form_data['client'] + "-" + form_data['stage'] + "-" + form_data['purpose']
KeyError: 'client'
projectdicts dictionary是一个全局变量,由对Google Cloud的GET请求生成,以生成所有项目的名称列表:

try:
    global projectdicts
    projectdicts = cloudresmanv1.projects().list().execute()
    projectdicts = projectdicts.get('projects')
except Exception as e:
    logging.error(e)

您没有调用超级类的clean,因此您的form.clean\u数据为空

def clean(self):
    form_data = super(ProjectForm, self).clean()
    projectname = form_data['client'] + "-" + form_data['stage'] + "-" + form_data['purpose']
    client = form_data['client']
    purpose = form_data['purpose']
    for projectdict in projectdicts:
        if projectname == projectdict['name']:
            raise ValidationError(projectname + " already exists! Please try another name.")
    
    if not re.match("^[a-z-]+[1-9]?$", purpose):
        raise ValidationError(purpose + " does not comply with the Regex parameters.")
    
    if not re.match("^[a-z]+$", client):
        raise ValidationError(client + " does not comply with the Regex parameters.")
    return form_data

基于您提供的回溯

  File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\forms\forms.py", line 409, in _clean_form
    cleaned_data = self.clean()
  File "C:\Users\user\OneDrive - Company\GCP App Engine\Test-Django-Terraform-Deployments - Copy\webscripts\projectform.py", line 90, in clean
    projectname = form_data['client'] + "-" + form_data['stage'] + "-" + form_data['purpose']
KeyError: 'client'
表单_数据
没有
客户端
的值,因此它不在字典中。因此,当设置
projectname
并且永远无法到达您的正则表达式验证器时,它会失败

在验证过程中,您需要更具防御性,以确保在尝试使用数据之前数据存在。我的意思是做这样的事情

    def clean(self):
        cleaned_data = super().clean()
        data_invalid = False

        # Setting required attrs on the fields should ensure the browser 
        # enforces validation, but this will double check before you cause a server error

        for field in (
                'client',
                'purpose',
                'stage',
        ):
            if not cleaned_data.get(field):
                self.add_error(field, 'This field is required')
                data_invalid = True

        if data_invalid:
            # Return early because data is missing
            return cleaned_data


        client = cleaned_data.get('client')
        purpose = cleaned_data.get('purpose')
        stage = cleaned_data.get('stage')

        # Once you know the data is there, you can then go on to use it &
        # add your validators
        
        if client and purpose and stage:
            projectname = client + "-" + stage + "-" + purpose

在clean中,projectdicts变量是从何处获得的,请发布一个可以从中获得的错误跟踪log@iklinac-我已经用错误消息更新了原始帖子。这只是一个简单的按键错误。projectdicts dictionary是一个全局变量,通过向Google Cloud发出GET请求来生成所有项目的名称列表。使用全局变量不是一个好主意,被认为是反模式的,但这仍然会产生相同的错误。