2015-10-05 1 views
0

У меня есть следующий urls.py:Джанго - 'иначе' запасной вариант по умолчанию привязок в urls.py

from django.conf import settings 
from django.conf.urls import include, url 
from django.conf.urls.static import static 
from django.contrib import admin 
from django.views.generic.base import RedirectView 

urlpatterns = [ 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^$', 'news_readr.views.home', name='home'), 
    url(r'^details/(?P<article_id>[0-9]+)$', 'news_readr.views.details', name='details'), 
    url(r'^details/$', 'news_readr.views.details', name='details'), 
    url(r'^/$', 'news_readr.views.home', name='home'), 
] 


if settings.DEBUG: 
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

У меня есть два действительных URL-адреса в моем приложении:

  1. локальный: 8000/
  2. локальный: 8000/подробности/123 #Where 123 может быть любое число

Я хочу поставить RegEx там что ручки другой Порядок размещения ns и перенаправляет эти запросы обратно в представление «home». Но я ничего не пытаюсь работать. Я попытался положить их в качестве последней строки в моем URLPATTERN:

url(r'^/$', 'news_readr.views.home', name='home'), #this does nothing 
url(r'', 'news_readr.views.home', name='home'), #this redirects fine to my homepage, but breaks all of my media and static paths, and causes my images to not load 

Есть ли лучший способ или правильное регулярное выражение, я могу использовать, чтобы исправить эту ситуацию?

ответ

2

Отображение домашней страницы по любому запросу, которое обычно приводит к HTTP 404, не является лучшей практикой, это запутывает людей и роботов. Если вы все еще хотите это сделать, лучше используйте перенаправление HTTP 301. Для этой цели, Django имеет RedirectView:

from django.core.urlresolvers import reverse 
from django.views.generic import RedirectView 

class RedirectToHome(RedirectView): 

    def get_redirect_url(self, *args, **kwargs): 
     return reverse('home') 

Чтобы исправить проблему статических файлов, просто вставить статические URL-адреса перед тем все ваш выделяющийся URL:

# You don't have to check DEBUG because static() does nothing if DEBUG is False. 
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

urlpatterns.append(url(r'^.*$', views.RedirectToHome.as_view(), name='redirect_to_home')) 
+0

Спасибо, это сработало! Я просто тестирую POC, поэтому я пока не смотрю на ботов и всех. Большое вам спасибо за ваше предложение! – nikjohn

2

Добавьте переназначения регулярное выражение после статических и медиа URLs:

if settings.DEBUG: 
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

urlpatterns += url(r'', 'news_readr.views.home', name='home') 

Добавление этого регулярное выражение после всех других URLs сделает это последний выбор.

+0

(на Джанго 1.10.5) этот метод вызывает ошибку 'TypeError: объект RegexURLPattern 'не является итерабельным'. Решение делает 'urlpatterns.append (url (...))' вместо 'urlpatterns + = url (...)' – danyamachine

+0

@danyamachine yes в 1.10 вам нужно указать urlpatterns как список. Отсюда и проблема. –