我在Django中使用内置的webserver时出现了一个奇怪的错误(由于我正处于活动开发状态,所以没有针对Apache进行测试)。我有一个url模式,适用于简短的url参数(例如Chalk%20Hill),但在这个上锁定了python
http://localhost:8000/chargeback/checkDuplicateProject/Bexar%20Street%20Phase%20IV%20Brigham%20Ln%20to%20Myrtle%20St
获取请求只是说挂起,永远不会返回,我必须强制退出python以使服务器再次运行。我做错了什么?
编辑: 在继续测试中,奇怪的是,如果我只输入url,它会返回正确的json响应。然后它锁定python。虽然我在网站上,但它永远不会返回,并锁定python。
网址:
url(r'^chargeback/checkDuplicateProject/(?P<aProjectName>(\w+)((\s)?(-)?(\w+)?)*)/$', 'chargeback.views.isProjectDuplicate'),
的观点:
def isProjectDuplicate(request, aProjectName):
#count the number of matching project names
p = Project.objects.filter(projectName__exact = aProjectName).count()
#if > 0, the project is a duplicate
if p > 0:
return HttpResponse('{"results":["Duplicate"]}', mimetype='application/json')
else:
return HttpResponse('{"results":["Not Duplicate"]}', mimetype='application/json')
型号:
class Project(models.Model):
projectName = models.TextField('project name')
department = models.ForeignKey('Department')
def __unicode__(self):
return self.projectName
答案 0 :(得分:2)
接受的答案是关于正则表达式的,但是由于我们正在讨论优化,我想我应该注意检查项目是否存在的代码可以被修改以生成更快的查询,尤其是在其他情况下你可能不必要地计算数百万行。如果愿意,可以将此“最佳实践”建议称为。
p = Project.objects.filter(projectName__exact = aProjectName).count()
if p > 0:
可以改为
if Project.objects.filter(project_name__iexact=aProjectName).exists():
有两个原因。
首先,您没有使用p
进行任何操作,因此无需将其存储为变量,因为它会提高可读性,p
是一个模糊的变量名称和the best code is no code at all。< / p>
其次,这样我们只需要一行而不是将结果保存到queryset缓存。请查看官方Queryset API docs,a related question on Stack Overflow和the discussion about the latter on the django-developers group。
此外,python(以及Django,自然地)通常将你的字段命名为lower_cased_separated_by_underscores。请在Python样式指南(PEP 8)上查看更多相关信息。
答案 1 :(得分:1)
由于您要检查数据库中是否已存在aProjectName
,因此您无需使正则表达式如此复杂。
我建议你将正则表达式简化为
url(r'^chargeback/checkDuplicateProject/(?P<aProjectName>[\w+\s-]*)/$', 'chargeback.views.isProjectDuplicate'),
有关进一步说明,请参阅django-users组中的问题url regex keeps django busy/crashing。