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.
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
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.
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).
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"),
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),
]