3

同じ URL の下に配置したい 2 種類のオブジェクトがあります。オブジェクトの 1 つのグループをビュー関数 'foo' に渡し、別のグループを 'bar' に渡す必要があります。

私は現在、ハードコードされた URL の長い長いリストを使用してこれを行っています。

urlpatterns = patterns('project.views',
    (r'^a/$', 'foo'),
    (r'^b/$', 'foo'),
    (r'^c/$', 'foo'),
    #...and so on until...
    (r'^x/$', 'bar'),
    (r'^y/$', 'bar'),
    (r'^z/$', 'bar'),
)

次のような各タイプの URL のリストを定義することは可能ですか...

foo_urls = ['a', 'b', 'c'] #...
bar_urls = ['x', 'y', 'z'] #...

...そして、それらのリストに対して着信 URL をチェックしますか? ('foo_urls' にある場合は、'project.views.foo' に送信します。'bar_urls' にある場合は、'project.views.bar' に送信します)?

以前のサイトの URL との互換性を維持するためにこの構造を維持することに制限されていますが、urls.py を簡素化する方法についてアドバイスをいただければ幸いです。

4

4 に答える 4

5

通常、URLマップは明示的に表現されますが、明示的に表現する必要はありません。リストからURLマップを作成してみませんか?

foo_urls = ['a', 'b', 'c'] #...
bar_urls = ['x', 'y', 'z'] #...

# A first pattern to get urlpatterns started.
urlpatterns = pattern('project.views', 
    ('blah', 'blah')
    )

# Append all the foo urls.
for foo_url in foo_urls:
    urlpatterns += patterns('project.views',
        ('^' + foo_url + '/$', 'foo')
        )

# Append all the bar urls.
for bar_url in bar_urls:
    urlpatterns += patterns('project.views',
        ('^' + bar_url + '/$', 'bar')
        )
于 2009-09-24T00:24:27.607 に答える
4

Django の URL パターンは正規表現であるため、これは実際に可能です。

urlpatterns = patterns('project.views',
    (r'^[abc]/$', 'foo'),
    (r'^[xyz]/$', 'bar'),
)

1 文字以外のプレースホルダーの例として a、b、c を使用している場合は、代わりに完全な文字列を使用できますが、正規表現の一致規則に従っていることを確認してください。

urlpatterns = patterns('project.views',
    (r'^(foo|slithy|toves)/$', 'foo'),
    (r'^(bar|twas|brillig)/$', 'bar'),
)
于 2009-09-24T00:00:34.500 に答える
3

urlpatternsを、すべてのurlをキャッチするものに置き換えてから、ロジックを移動して、 URLfoobarURLのどちらかを選択することができます。

urlpatterns = patterns('project.views',
    (r'^(?P<letter>[a-z])/$', 'foobar'),
)

次に、関数foobarを記述しますviews.py

def foobar(request, letter):

    foo_urls = ['a', 'b', 'c'] #...
    bar_urls = ['x', 'y', 'z'] #...
    if slug in foo_urls:
        return foo(request)
    if slug in bar_urls:
        return bar(request)
    else:
         #oh dear, you've caught a
         #url that isn't foo or bar
         #return 404?

別の方法として、djangoリダイレクトアプリを調べ、URL構造を再設計してから、古いURLのリダイレクトを設定することもできます。

于 2009-09-24T00:28:36.340 に答える
1

アプリの前に Apache がある場合:

<LocationMatch "^[a-w]/$">
   ...
</LocationMatch>

<LocationMatch "^[x-z]/$">
   ...
</LocationMatch>

... は、環境変数で foo と bar のどちらに移動するかを指示したい場合は SetEnv を含め、必要な任意の構成ディレクティブにすることができます。または、いくつかの異なるバックエンド サーバー URL にリクエストを送信する ProxyPass を使用することもできます。

URL 書き換えや、正規表現引数を受け入れるその他の多くの Apache 構成設定を使用することもできます。

于 2009-09-24T01:33:17.860 に答える