0

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

(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

4

2 回答 2

0

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

如果用户请求一个不存在的页面,通常的做法是返回一个 404 页面未找到。404 页面应告知访问者发生了什么以及接下来要做什么。

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

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

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

现在,您可以在需要时修复损坏的链接,如果您让用户摆弄 url,只需将其视为功能请求。使用全部重定向,您将陷入黑暗。

更新:如何提高 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,Django 会加载并呈现模板。所以添加一个模板模板。在 /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.pyDEBUG = False中测试你刚刚创建的模板。

于 2013-09-25T08:48:37.527 回答
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

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

于 2013-09-25T08:49:28.507 回答