2017-01-30 3 views
2

Mein Django Projekt "Tiere" hat eine App namens "Vögel". Bei Tieren/urls.py die „Vögel“ URIs Vögel/urls.py wie folgt geführt werden:Alias ​​für App URI in Django Projekt urls.py

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

Die „Vögel /“ ist die offizielle, dauerhafte Basis-URI; "b /" wird als Verknüpfung/Alias ​​akzeptiert.

Wie kann ich die "b /" URIs (permanent) zu "birds /" umleiten, so dass, obwohl Benutzer "b/pinguin" eingeben können, die Adressleiste des Browsers (letztendlich) "vögel" anzeigt /Pinguin"? Ich bevorzuge es, keinen Code in der "vögel" -App zu berühren, weil er nicht wissen sollte, wie das Projekt URIs der App zuordnet.

habe ich versucht,

RedirectView.as_view(pattern_name='birds')) 

aber dies führt zu einer 410 Vorbei Antwort zu verwenden. Und

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

leitet/b/penguin zu/vögel/um und tötet meinen Vogel.

Antwort

1

Sie sollten so etwas versuchen:

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

Das funktioniert für mich (Django Version 1.9.5). Mein Browser protokolliert, dass die anfängliche '/ b/penguin' Anfrage eine' 302 gefunden' Statusantwort von Django erhält, begleitet von einem '/ vögel/Pinguin' Location Header. Der Browser macht dann eine zweite '/ vögel/Pinguin' Anfrage, die' 200 OK' ist. Ich habe das Attribut 'permanent = True' hinzugefügt, damit Django '301 Moved Permanently' anstelle von' 302 Found' zurückgibt. – Roger

0

Sie können eine custom middleware machen die Umleitungen für Sie

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 

Die Implementierung zu handhaben kann ein wenig Arbeit brauchen, aber die eigentliche Methode steht, überprüfen Sie den Strompfad und wenn die /b/ vorhanden ist, leiten sie zu Ihr gewünschtes Ziel

Sonst könnten Sie eine Umleitungsansicht angeben, indem Sie über jede URL in birds iterieren, aber dies würde für URLs in Vögeln, die ein Namespace zu anderen URLs sind, unordentlich werden.

+0

P. S: die Vögel retten! – Sayse

+1

Ich denke, die Vögel sind jetzt sicher. Dieser Ansatz scheint sehr ansprechend und sauber zu sein. –

+1

DRY-Verletzung - Ihre Middleware nimmt zu viel über die URL-Mapping und wird brechen, sobald jemand die URL-Muster ändern, fügt i18n URLs usw. –