1

我在使用 Django 中的内置网络服务器时遇到了一个奇怪的错误(由于我正在积极开发中,因此尚未针对 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
4

2 回答 2

2

接受的答案是关于正则表达式的,但是由于我们正在讨论优化,我想我应该注意,可以修改用于检查项目是否存在的代码以生成更快的查询,特别是在您可能的其他上下文中不必要地计算数百万行。如果您愿意,可以将此称为“最佳实践”建议。

p = Project.objects.filter(projectName__exact = aProjectName).count()
if p > 0:

可以改为

if Project.objects.filter(project_name__iexact=aProjectName).exists():

有两个原因。

首先,您没有使用p任何东西,因此无需将其存储为变量,因为它增加了可读性并且p是一个晦涩的变量名称,最好的代码是根本没有代码

其次,这种方式我们只要求一行而不是将结果保存到查询集缓存中。请参阅官方Queryset API 文档Stack Overflow 上的一个相关问题以及django-developers 组上关于后者的讨论

此外,在 python(和 Django,自然)中,将字段命名为 lower_cased_separated_by_underscores 是习惯性的。请在 Python 样式指南(PEP 8)上查看更多相关信息。

于 2013-01-30T18:31:29.763 回答
1

由于您要检查aProjectName数据库中是否已经存在,因此您无需使正则表达式如此复杂。

我建议您将正则表达式简化为

url(r'^chargeback/checkDuplicateProject/(?P<aProjectName>[\w+\s-]*)/$', 'chargeback.views.isProjectDuplicate'),

有关进一步的解释,请参阅问题url regex keep django busy/crashing on the django-users group。

于 2013-01-30T17:28:23.683 回答