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请求来生成所有项目的名称列表。使用全局变量不是一个好主意,被认为是反模式的,但这仍然会产生相同的错误。