2013-09-25 3 views
0

в попытке избежать пользователя, играя с URL, я добавил эту строку MyProject никогда url.pyПеренаправление HTTP трафика на главную страницу/корень

(r'(.+\.*)$',RedirectView.as_view(url='/')), 

независимо от того, что когда-либо пользователь попробовать в браузере URL будет принимать пользователя на главную страницу. Хорошо!

Проблема начинается, когда я пытаюсь загрузить любую вещь с моего сайта. есть ли способ, что я могу добавить исключение для типа файла, например, JPG, GIF и пусть остальная часть HTTP-трафика идет на главную страницу/корень

мой обновленный views.py

def my_view(request): 
    my_object = get_object_or_404(Document, pk=1) 

def list(request): 
    # Handle file upload 

    if request.method == 'POST': 
     form = DocumentForm(request.POST, request.FILES) 
     if form.is_valid(): 
      newdoc = Document(docfile = request.FILES['docfile']) 
      newdoc.save() 
     docfile = request.FILES['docfile'] 
      return HttpResponseRedirect(reverse('myproject.myapp.views.list')) 
    else: 
     form = DocumentForm() # A empty, unbound form 


    documents = Document.objects.all() 
    return render_to_response(
     'myapp/list.html', 
     {'documents': documents, 'form': form}, 
     context_instance=RequestContext(request) 
    ) 

он дает ошибку сервера 505 now

+0

1) 'my_view' должен что-то вернуть. 2) Удалите 'docfile = request.FILES ['docfile']' или исправьте отступ. – allcaps

ответ

0

Плохо 1: Вы защищаете страницы полезной ошибки.
Bad 2: Django не является веб-сервером, поэтому не обслуживайте статический контент с помощью Django.

Если пользователь запрашивает страницу, которой не существует, обычно нужно вернуть страницу 404, которая не найдена. Страница 404 должна сообщить посетителю, что произошло, и что делать дальше.

Пример: https://stackoverflow.com/doesnotexcist/

Джанго также может быть настроен на электронную почту ошибки о неработающих ссылках (404 «страница не найдена» ошибки). Django отправляет письма о 404 ошибках, когда: DEBUG - False; В настройках MIDDLEWARE_CLASSES: django.middleware.common.BrokenLinkEmailsMiddleware.

https://docs.djangoproject.com/en/1.6/howto/error-reporting/#errors

Теперь вы можете исправить свои неработающие ссылки, когда это необходимо, и если вы получите пользователей пустячный URL, просто увидеть его как запрос функций. С перехватом всех перенаправлений вы находитесь в темноте.

UPDATE: Как поднять 404

В вашем views.py вы можете попытаться получить объект и, если он не существует приподнять 404 не найдено:

from django.http import Http404 

def my_view(request): 
    try: 
     my_object = MyModel.objects.get(pk=1) 
    except MyModel.DoesNotExist: 
     raise Http404 

Но уборщик для использования функции быстрого доступа:

from django.shortcuts import get_object_or_404 

    def my_view(request): 
     my_object = get_object_or_404(MyModel, pk=1) 

Существует также get_list_or_404. Подробнее о возвращающихся 404, ярлыках и мнений пишущих на: https://docs.djangoproject.com/en/dev/topics/http/shortcuts/ и https://docs.djangoproject.com/en/dev/topics/http/views/#django.http.Http404

Когда поднимают Http404 изнутри зрения, Джанго нагрузок и делает шаблон 404.html если вы создали его в корневой директории шаблона. Поэтому добавьте шаблон шаблона. Создайте файл с именем 404.html в/проекте/шаблоны /:

{% extends "base.html" %} 

{% block title %}HTTP 404 - Page not found{% endblock %} 

{% block content %} 
    <h1>HTTP404</h1> 
    <p>Snap! Something went wrong. The page you requested could not be found!</p> 
    <!-- Present some navigation alternatives --> 
</div> 
{% endblock %} 

Обратите внимание, что это презентация для людей.Но реальный важный бит код состояния возвращаемых данных:

allcaps$ curl -I https://stackoverflow.com/doesnotexcist/ 
HTTP/1.1 404 Not Found 
Cache-Control: private 
Content-Length: 18290 
Content-Type: text/html; charset=utf-8 
X-Frame-Options: SAMEORIGIN 
Date: Fri, 27 Sep 2013 08:50:43 GMT 

HTTP/1.1 404 Not Found говорит гусеничный ботам, что они не должны индексировать страницу.

Примечание. Если DEBUG имеет значение True, Django отображает полезную страницу ошибки 404 с трассировкой, предназначенной для разработчиков. Но если DEBUG False (производство), то он отображает только что созданный шаблон. Поэтому убедитесь, что в settings.py DEBUG = False проверьте шаблон, который вы только что создали.

+0

handeling 404 в DJANGO для меня кошмар. есть ли хороший пример для этого, может быть, я упускаю трюк. Я хочу так же, как вы рекомендовали Пример: http://stackoverflow.com/doesnotexcist/. пожалуйста, я действительно застрял с 404 – user2230193

+0

См. мой обновленный ответ. Raising 404 также входит в учебник Django «Начало работы». Глава 3: https://docs.djangoproject.com/en/1.5/intro/tutorial03/#a-shortcut-get-object-or-404 – allcaps

+0

Я положил views.py в оригинале, давая 505, когда я делаю DEBUG = Ложь. что вы подразумеваете под ПРОИЗВОДСТВОМ? я не использую APACHE, просто запускаю его через python manage.py runningerver – user2230193

0

У вас может быть не совпадение в вашем регулярном выражении (r'.+\^jpeg|jpg|gif)',RedirectView.as_view(url='/')),.

В качестве альтернативы укажите URL-адрес, который улавливает эти случаи в строках выше совпадения.

Еще один вариант был бы пустым совпадением, которое, я считаю, поддерживает передачу медиа-расширений. (r'',RedirectView.as_view(url='/')),

И наконец, вы можете положиться на веб-сервер с интерфейсом, чтобы обслуживать мультимедийный контент. Например, мои медиа и статичные живут на media.domain.com и обслуживаются как виртуальный сервер через nginx.

Редактировать: Ваш лучший выбор, вероятно, будет правильным обработчиком 404, который перенаправляет по мере необходимости. См. https://docs.djangoproject.com/en/dev/topics/http/views/#customizing-error-views.

Я по-прежнему рекомендую разделить носители на собственный сервер вирусов на своем веб-сервере.

+0

Вы бы использовали такие шаблоны url? Хотя вы отвечаете на вопрос о форматировании регулярного выражения, это не путь. Действительна часть об обслуживании статического содержимого. – allcaps

+0

@DivinusVox, запустите несколько комбинаций, но ничего не получится. (r '(^ csv | xlsx)', RedirectView.as_view (url = '/ myblog/blog')), пожалуйста, укажите полный синтаксис. попробовал blank также как \t (r '', RedirectView.as_view (url = '/ myblog/blog /')), я новичок в django, поэтому, пожалуйста, извините мое невежество – user2230193

+0

@ user2230193 См. править выше. – DivinusVox

Смежные вопросы