web-dev-qa-db-fra.com

Django URL Redirect

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

rls.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 actuel des choses, la dernière entrée envoie tout le "autre" trafic vers la page d'accueil, mais je souhaite rediriger via HTTP 301 ou 2.

92
PacketPimp

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')
)

Notez comme url dans le <url_to_home_view> vous devez spécifier l’url.

permanent=False retournera HTTP 302, tandis que permanent=True retournera HTTP 301.

Sinon, vous pouvez utiliser Django.shortcuts.redirect

165
dmg

Dans Django 1.8, voici comment 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 un-DRY, et vous assurera de changer votre URL, vous n'avez pas à changer la redirection aussi.

31
Rexford

Si vous êtes bloqué sur Django 1.2 comme je suis et que RedirectView n'existe pas, une autre façon d'ajouter le mappage de redirection centré sur la route est la suivante:

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

Vous pouvez également réacheminer tout 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 uniquement de modifier votre routage d'URL et que vous n'avez pas accès à .htaccess, etc. (je suis sur Appengine et app.yaml n'autorise pas la redirection d'URL à ce niveau .htaccess).

9
Blaine Garrett

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

Dans la vue.py

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

Dans l'url.py

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

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

Le code ci-dessous provient de this answe r

Dans Django 2.x,

from Django.contrib import admin
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=False)),
    path('hola/', include("hola.urls")),
    path('admin/', admin.site.urls),
]
1
bombs