Redirection d'URL Django

101

Comment puis-je rediriger le trafic qui ne correspond à aucune de mes autres URL vers la page d'accueil?

urls.py:

urlpatterns = patterns('',
    url(r'^$', 'macmonster.views.home'),
    #url(r'^macmon_home$', 'macmonster.views.home'),
    url(r'^macmon_output/$', 'macmonster.views.output'),
    url(r'^macmon_about/$', 'macmonster.views.about'),
    url(r'^.*$',  'macmonster.views.home'),
)

En l'état, la dernière entrée envoie tout "autre" trafic vers la page d'accueil mais je souhaite rediriger via HTTP 301 ou 302 .

felix001
la source

Réponses:

181

Vous pouvez essayer la vue basée sur les classes appelée RedirectView

from django.views.generic.base import RedirectView

urlpatterns = patterns('',
    url(r'^$', 'macmonster.views.home'),
    #url(r'^macmon_home$', 'macmonster.views.home'),
    url(r'^macmon_output/$', 'macmonster.views.output'),
    url(r'^macmon_about/$', 'macmonster.views.about'),
    url(r'^.*$', RedirectView.as_view(url='<url_to_home_view>', permanent=False), name='index')
)

Remarquez comment, comme urldans le cas, <url_to_home_view>vous devez spécifier l'URL.

permanent=Falseretournera HTTP 302, tandis que permanent=Trueretournera HTTP 301.

Vous pouvez également utiliser django.shortcuts.redirect

Mise à jour pour les versions de Django 2+

Avec Django 2+, url()est obsolète et remplacé par re_path(). L'utilisation est exactement la même que url()pour les expressions régulières. Pour les remplacements sans expression régulière, utilisez path().

from django.urls import re_path

re_path(r'^.*$', RedirectView.as_view(url='<url_to_home_view>', permanent=False), name='index')
dmg
la source
J'ai ajouté ceci mais je viens de recevoir une erreur HTTP 500? url (r '^. * $', RedirectView.as_view (url = 'macmon_about', permanent = False)
felix001
1
Vous semblez manquer un ")", faites défiler le côté jusqu'à la fin et vous le verrez. Vous pouvez cependant omettre la namepartie
dmg
1
@ felix001 btw, HTTP 500 signifie généralement (comme dans 99% des cas) que vous avez une erreur de syntaxe, jetez un œil à ceci - docs.djangoproject.com/en/dev/howto/error-reporting/… . Lorsqu'un site est en cours de développement, il est toujours bon d'avoir DEBUG = Trueou au moins de définir l' ADMINSoption - docs.djangoproject.com/en/dev/ref/settings/#std:setting-ADMINS
dmg
COMMENT faire je passe le slug et utilise ce champ pour créer l'URL de redirection. EXA: url (r '^ (? P <slug> [a-zA-Z0-9 -] +) /', RedirectView.as_view (url = 'http: //'+slug+'.mywebsite.com', permanent = False),)
Roshan
Notez qu'en utilisant cette méthode, il est très facile de faire attraper l'utilisateur dans une boucle de redirection.
smilebomb
35

Dans Django 1.8, c'est comme ça que j'ai fait le mien.

from django.views.generic.base import RedirectView

url(r'^$', views.comingSoon, name='homepage'),
# whatever urls you might have in here
# make sure the 'catch-all' url is placed last
url(r'^.*$', RedirectView.as_view(pattern_name='homepage', permanent=False))

Au lieu d'utiliser url, vous pouvez utiliser le pattern_name, qui est un peu non-DRY, et vous assurera de changer votre URL, vous n'avez pas à changer la redirection aussi.

KhoPhi
la source
11

Si vous êtes bloqué sur django 1.2 comme moi et que RedirectView n'existe pas, un autre moyen centré sur l'itinéraire pour ajouter le mappage de redirection consiste à utiliser:

(r'^match_rules/$', 'django.views.generic.simple.redirect_to', {'url': '/new_url'}),  

Vous pouvez également tout réacheminer sur un match. Ceci est utile lorsque vous modifiez le dossier d'une application mais que vous souhaitez conserver les signets:

(r'^match_folder/(?P<path>.*)', 'django.views.generic.simple.redirect_to', {'url': '/new_folder/%(path)s'}),  

Ceci est préférable à django.shortcuts.redirect si vous essayez seulement de modifier votre routage d'url et n'avez pas accès à .htaccess, etc. (je suis sur Appengine et app.yaml n'autorise pas la redirection d'url à ce niveau comme un .htaccess).

Blaine Garrett
la source
3
Cet ancien format est obsolète ou supprimé dans les nouvelles versions de Django, mais vous pouvez toujours utiliser des mots-clés url lors de la redirection à l'aide de RedirectView comme décrit dans la réponse acceptée. Exemple:(r'^match_folder/(?P<path>.*)/$', RedirectView.as_view(url='/new_folder/%(path)s/', permanent=True), name='view-name'),
Micah Walter
9

Une autre façon de le faire consiste à utiliser HttpResponsePermanentRedirect comme ceci:

Dans view.py

def url_redirect(request):
    return HttpResponsePermanentRedirect("/new_url/")

Dans le url.py

url(r'^old_url/$', "website.views.url_redirect", name="url-redirect"),
sirFunkenstine
la source
8

Les autres méthodes fonctionnent bien, mais vous pouvez également utiliser le bon vieux django.shortcut.redirect.

Le code ci-dessous est tiré de cette réponse .

Dans Django 2.x:

from django.shortcuts import redirect
from django.urls import path, include

urlpatterns = [
    # this example uses named URL 'hola-home' from app named hola
    # for more redirect's usage options: https://docs.djangoproject.com/en/2.1/topics/http/shortcuts/
    path('', lambda request: redirect('hola/', permanent=True)),
    path('hola/', include('hola.urls')),
]
bombes
la source