2017-01-30 14 views
2

私のDjangoプロジェクトの "animals"には "birds"というアプリがあります。動物では/ URIは、このような鳥/ urls.pyにルーティングされている「鳥」のurls.py:DjangoプロジェクトのアプリURIのエイリアスurls.py

urlpatterns=[ 
    url(r'^birds/', include('birds.urls')), 
    url(r'^b/',  include('birds.urls')), # alias 
] 

「鳥/」公式、永久的なベースURIです。 "b /"はショートカット/エイリアスとして受け入れられます。

"b/penguin"と入力してもブラウザーのアドレスバーに(最終的に) "birds"が表示されるように、 "birds /"にリダイレクトされた "b /" URI(永続的) /ペンギン"?私は "birds"アプリでコードに触れない方がいいです。なぜなら、プロジェクトがどのようにURIをアプリにマップするかを知ってはならないからです。

私は

RedirectView.as_view(pattern_name='birds')) 

を使用しようとしましたが、これは410ゴーン応答をもたらします。そして

RedirectView.as_view(url='/birds/')) 

リダイレクト/ b /ペンギンと/ birds /は、私の鳥を殺します。

答えて

1

あなたはそのような何かを試してみてください:

from django.views.generic import RedirectView 

urlpatterns=[ 
    url(r'^birds/', include('birds.urls')), 
    url(r'^b/(?P<path>.*)$', RedirectView.as_view(url='/birds/%(path)s')), 
] 
+1

これは私の作品です(Djangoバージョン1.9.5)。私のブラウザは、最初の '/ b/penguin'リクエストがDjangoから'/birds/penguin'位置ヘッダを伴って '302 Found'ステータス応答を得ることを記録しています。ブラウザは次に、 '200 OK 'という2番目の'/birds/penguin'リクエストを作成します。 Djangoが '302 Found'ではなく' 301 Moved Permanently'を返すように 'permanent = True'属性を追加しました。 – Roger

0

あなたが

class BirdMiddleware(MiddlewareMixin, object): 
    def process_view(self, request, view_func, view_args, view_kwargs): 
     if '/b/' in request.path: 
      return HttpResponseRedirect(request.path.replace('/b/', '/birds/')) 
     return None 

実装は仕事のビットを必要とするが、実際の方法は立って、現在のパスをチェックして/b/が存在する場合、それをリダイレクトするためのリダイレクトを処理するためにcustom middlewareを作ることができますあなたの必要な目的地。

それ以外の場合は、birdsのすべてのURLを繰り返してリダイレクトビューを指定できますが、これは他のURLの名前空間である鳥のURLが乱雑になります。

+0

P.Sを:鳥を節約します! – Sayse

+1

私は、鳥は今安全だと思う。このアプローチは非常に適切で清潔であるようです。 –

+1

DRY違反 - あなたのミドルウェアはurlマッピングに関してあまりにも多くのことを想定しており、誰かがurlパターンを変更したり、i18nのURLを追加したりするとすぐに壊れてしまいます。 –

関連する問題