将HTTP流量重定向到主页/ root

时间:2013-09-25 07:49:18

标签: django python-2.7

为了避免用户使用网址,我已将此行添加到myproject的url.py

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

无论用户在浏览器网址中尝试什么,它都会将用户带到主页。好!

每当我尝试从我的网站下载任何东西时,

问题就开始了。有没有办法,我可以添加文件类型的例外,例如jpg,gif,让其余的http流量转到主页/ root

我更新了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

2 个答案:

答案 0 :(得分:0)

错误1:您屏蔽了有用的错误页面。
坏2:Django不是网络服务器,因此不要使用Django提供静态内容。

如果用户请求不存在的页面,则常见的事情是返回未找到的404页面。 404页面应该告知访问者发生了什么以及下一步该做什么。

示例:https://stackoverflow.com/doesnotexcist/

  

Django还可以配置为发送有关损坏链接的错误(404   “找不到页面”错误)。 Django在以下情况下发送有关404错误的电子邮件:   DEBUG是假的;您的MIDDLEWARE_CLASSES设置包括   django.middleware.common.BrokenLinkEmailsMiddleware。

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

现在,您可以在需要时修复损坏的链接,如果您让用户摆弄网址,只需将其视为功能请求即可。抓住所有重定向你都在黑暗中。

更新:如何筹集404

在views.py中,您可以尝试获取一个对象,如果它不存在,则会找到一个未找到的对象:

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时,如果您在根模板目录中创建了模板,Django会加载并呈现模板404.html。所以添加一个模板模板。在/ project / templates /:

中创建一个名为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中测试您刚创建的模板。

答案 1 :(得分:0)

您的正则表达式(r'.+\^jpeg|jpg|gif)',RedirectView.as_view(url='/')),可能不匹配。

或者,指定一个能够在一揽子匹配上方的行中捕获这些案例的URL。

另一种选择是空白匹配,我认为支持通过媒体扩展。 (r'',RedirectView.as_view(url='/')),

最后,您可以依靠前端Web服务器来提供媒体内容。例如,我的媒体和静态直播在media.domain.com,并通过nginx作为虚拟服务器。

编辑:你最好的选择可能是一个合适的404处理程序,根据需要重定向 - 见https://docs.djangoproject.com/en/dev/topics/http/views/#customizing-error-views

我仍然建议将您的媒体分成您自己的网络服务器中的虚拟服务器。