8

urls.pyの正規表現に問題がありました(私はdjangoの初心者であり、一般的な正規表現でもあります)

これが私の元のurls.pyです

url(r'^name/(?P<name>\w+)/$', 'course.views.name'),
url(r'^', 'course.views.index'),

そして、私はこれを使用してそれにアクセスしようとしていました:

http://127.0.0.1:8000/name/blah/

私の見解は次のようになります。

def index(request):
    return HttpResponse("Hello, sam. You're at the course index.")

def name(request, name):
    return HttpResponse("Hello, %s. You're at the course index." % name)

私が得た結果は、私がどんな入力をしたとしても、「名前」関数ではなく「インデックス」関数を定期的に取得するということでした。問題は最初の正規表現にあると思いました。

しかし、その後、2番目のものを次のように変更しました。

url(r'^$', 'course.views.index'),

そして、これは私がそれが機能すると思ったのと同じように機能します!

「$」は行の終わりを意味することを理解していますが、最初の正規表現を最初に評価するべきではありませんか?これらの式が一致する順序は何ですか?

すべてのURLに「$」を追加することはそれほど大きな問題ではありませんが、なぜそこに配置するのかを理解したいと思います。

Django1.4とPython2.7を使用しています

4

2 に答える 2

4

Djangoドキュメントを読む

Djangoがリクエストを処理する方法

ユーザーがDjangoを利用したサイトからページをリクエストすると、これはシステムが実行するPythonコードを決定するために従うアルゴリズムです。

  1. Djangoは、使用するルートURLconfモジュールを決定します。通常、これはROOT_URLCONF設定の値ですが、着信HttpRequestオブジェクトにurlconf(ミドルウェア要求処理によって設定される)という属性がある場合、その値がROOT_URLCONF設定の代わりに使用されます。
  2. DjangoはそのPythonモジュールをロードし、変数urlpatternsを探します。これは、関数django.conf.urls.patterns()によって返される形式のPythonリストである必要があります。
  3. Djangoは各URLパターンを順番に実行し、要求されたURLに一致する最初のパターンで停止します。
  4. 正規表現の1つが一致すると、Djangoは指定されたビューをインポートして呼び出します。これは単純なPython関数です。ビューには、最初の引数としてHttpRequestが渡され、残りの引数として正規表現にキャプチャされた値が渡されます。
  5. 一致する正規表現がない場合、またはこのプロセスのいずれかの時点で例外が発生した場合、Djangoは適切なエラー処理ビューを呼び出します。以下のエラー処理を参照してください。

とのこと3. Django runs through each URL pattern, in order, and stops at the first one that matches the requested URL.なので、これはバグだと思います。

$ただし、すべてのURLパターンを追加する必要がありますIncluding other URLconfs

于 2012-06-04T08:17:33.833 に答える
1

そうです、djangoのドキュメントは次のように語っています。

Djangoがリクエストを処理する方法

ユーザーがDjangoを利用したサイトからページをリクエストすると、これはシステムが実行するPythonコードを決定するために従うアルゴリズムです。

  1. Djangoは、使用するルートURLconfモジュールを決定します。通常、これはROOT_URLCONF設定の値ですが、着信HttpRequestオブジェクトにurlconf(ミドルウェア要求処理によって設定される)という属性がある場合、その値がROOT_URLCONF設定の代わりに使用されます。
  2. DjangoはそのPythonモジュールをロードし、変数urlpatternsを探します。これは、関数django.conf.urls.patterns()によって返される形式のPythonリストである必要があります。
  3. Djangoは各URLパターンを順番に実行し、要求されたURLに一致する最初のパターンで停止します。
  4. 正規表現の1つが一致すると、Djangoは指定されたビューをインポートして呼び出します。これは単純なPython関数です。ビューには、最初の引数としてHttpRequestが渡され、残りの引数として正規表現にキャプチャされた値が渡されます。
  5. 一致する正規表現がない場合、またはこのプロセスのいずれかの時点で例外が発生した場合、Djangoは適切なエラー処理ビューを呼び出します。以下のエラー処理を参照してください。

これは、別のSO投稿が別のURL評価の問題を修正するために提案していることでもあります。

于 2012-06-04T08:21:35.073 に答える