3

djangoサイトのurlpatternsで見つけたすべての例には、先頭にスラッシュがない着信URLまたはルートフォルダー用の個別のエントリがあります。次に、個々の行のサブフォルダーを処理します。なぜ単純なのか分かりません

/?

正規表現では、これらを1行にまとめることはできません。

次のことを考慮して、DjangoプロジェクトをBaloneyと呼びましょう。アプリ名は、Cheeseです。したがって、プロジェクトurls.pyには、アプリurls.pyがそのリクエストを処理できるようにするための次のようなものがあります...

urlpatterns = patterns('',
    (r'^cheese/', include('Baloney.Cheese.urls')),
)

次に、Cheeseアプリのurls.py内で、この1つの単純な行が空白の値を含むすべての着信URLサブパスに対してtrueとしてトリガーされない理由がわかりません...

urlpatterns = patterns('',
    (r'^(?P<reqPath>.*)/?$', views.cheeseapp_views),
)

代わりに、空白の場合と一致しますが、値が存在する場合とは一致しません。それで...

http://baloneysite.com/cheese/        -->   MATCHES THE PATTERN
http://baloneysite.com/cheese/swiss   -->   DOES NOT MATCH

基本的に、reqPath変数をキャプチャして、そこにあるもの(空白または''でも)を含めますが、末尾のスラッシュがある場合は含めないようにします。

URLはDBから取得された動的なスラッグであるため、ビューのコンテンツまですべてのマッチングを行い、値を転送するためにURLパターンが必要です。以下が機能することは知っていますが、なぜこれをすべて/で1行に配置できないのかわかりません。終了$記号の前の正規表現。

(r'^$', views.cheeseapp_views, {'reqPath':''}),
(r'^(?P<reqPath>.*)/$', views.cheeseapp_views),

洞察に感謝します。

4

1 に答える 1

10

私はちょうど同様のサンプルを試しました、そしてそれはあなたがそれを書いたように働きました。/?、。*は必要ありませんが、とにかくそれに一致します。あなたが得ている正確なエラーは何ですか?たぶんあなたはリクエストパラメータなしであなたの見解を持っていますか?つまり、views.cheeseapp_viewsは次のようになります。

def cheeseapp_views(request, reqPath):
    ...

編集:

提案したパターンは、*演算子が貪欲であるため、末尾のスラッシュをreqPathにキャッチします(docs.python.org/library/re.htmlを参照してください)。代わりにこれを試してください:

(r'^(?P<reqPath>.*?)/?$', views.cheeseapp_views) 

。*であることに注意してください。欲張りでないようにするために。*の代わりに。

于 2010-11-10T23:55:33.540 に答える