1

Django に組み込まれている Web サーバーを使用すると奇妙なエラーが発生します (アクティブな開発を行っているため、Apache に対してテストしていません)。短い URL パラメーター (Chalk%20Hill など) で機能する URL パターンがありますが、このパターンでは Python がロックされます。

http://localhost:8000/chargeback/checkDuplicateProject/Bexar%20Street%20Phase%20IV%20Brigham%20Ln%20to%20Myrtle%20St

get リクエストは保留中と言うだけで戻りません。サーバーを再び機能させるには、python を強制終了する必要があります。私は何を間違っていますか?

編集:テストを続けると、奇妙なことに、URLを入力するだけで正しいjson応答が返されます。次に、pythonをロックします。ただし、私がウェブサイトにいる間は、戻ることはなく、python がロックされます。

URL:

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():

2つの理由で。

まず、何にも使用していないため、読みやすさが向上し、変数名がわかりにくく、コードがまったくないためp、変数として保存する必要はありません。p

次に、この方法では、結果をクエリセットキャッシュに保存するのではなく、単一の行のみを要求します。公式のQuerysetAPIドキュメント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'),

詳細な説明については、django-users グループでurl regex keep django busy/crashingという質問を参照してください。

于 2013-01-30T17:28:23.683 に答える