我建立一个应用程序使用Django作为我的主力。到目前为止,一切都很好-指定的数据库设置,配置的静态目录,url,视图等。但是当我想要渲染自己漂亮的自定义404.html和500.html页面时,麻烦就来了。

我阅读了关于自定义错误处理的文档,并在UrlsConf中设置了必要的配置,创建了相应的视图,并将404.html和500.html添加到我的应用程序的模板目录(在settings.py中也指定了)。

但是文档说,在Debug关闭之前,您实际上可以查看自定义错误视图,所以我确实关闭了它来测试我的东西,而那就是事情变得疯狂的时候!

我不仅无法查看自定义404.html(实际上,它加载,但因为我的错误页面每个包含一个图形错误消息-作为一些漂亮的图像),错误页面的源加载,但没有其他加载!甚至没有链接CSS或Javascript!

一般来说,一旦我设置DEBUG = False,所有的视图将加载,但任何链接的内容(CSS, Javascript,图像等)不会加载!发生什么事情了?是否有什么东西我丢失了,关于静态文件和调试设置?


当前回答

这是正常且有意为之的行为。

Warning

This will only work if DEBUG is True.  
you can actually view custom error views until Debug is Off  

如果Django只是从文件系统中读取并发送一个文件,那么它与普通的web服务器相比没有任何优势,所有的web服务器都能够自己提供文件。

此外,如果你用Django提供静态文件,你会让Python进程在请求期间一直很忙,它将无法提供更适合它的动态请求。

由于这些原因,Django静态视图仅设计用于开发期间,如果DEBUG设置为False,则它将无法工作。

因为在开发过程中,我们通常一次只有一个人访问站点 developer), Django可以很好地提供静态文件。

其他回答

对url()的字符串视图参数的支持已弃用,并将在Django 1.10中被移除

我的解决方案只是上面孔拉多解决方案的小修正。

from django.conf import settings
import os
from django.views.static import serve as staticserve

if settings.DEBUG404:
    urlpatterns += patterns('',
        (r'^static/(?P<path>.*)$', staticserve,
            {'document_root': os.path.join(os.path.dirname(__file__), 'static')} ),
        )

我同意Marek Sapkota的回答;但是你仍然可以使用django URFConf来重新分配url,如果静态文件被请求的话。

步骤1:在settings.py中定义STATIC_ROOT路径

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

步骤2:然后收集静态文件

$ python manage.py collectstatic

步骤3:现在定义URLConf,如果static位于url的开头,则从静态文件夹staticfiles中访问文件。注意:这是你项目的urls.py文件:

from django.urls import re_path
from django.views.static import serve

urlpattern += [
  re_path(r'^static/(?:.*)$', serve, {'document_root': settings.STATIC_ROOT, })
]

Nginx,设置和url配置

如果你在linux上,这可能会有帮助。

nginx 文件

your_machn: / /维姆etc / nginx sites-available / nginxfile

server {
    server_name xyz.com;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /var/www/your_prj;
    }

    location /media/ {
        root /var/www/your_prj;
    }
...........
......
}

urls . py

.........
   .....
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('test/', test_viewset.TestServer_View.as_view()),
        path('api/private/', include(router_admin.urls)),
        path('api/public/', include(router_public.urls)),    
        ]
    
    if settings.DEBUG:
        import debug_toolbar
        urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
        urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

settings.py

.....
........
STATIC_URL = '/static/'
MEDIA_URL = '/media/'

STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
.....
....

确保运行:

(venv)yourPrj$ ./manage.py collectstatic
yourSys# systemctrl daemon-reload

如果你在开发中使用静态服务视图,你必须有DEBUG = True:

警告 这只在DEBUG为True时有效。 这是因为这种观点过于粗暴 效率低下,而且可能不安全。 这只适用于本地 开发,绝不应该使用 在生产中。

文档:在开发中提供静态文件

更新链接,还有这个

编辑:你可以添加一些url只是为了测试你的404和500模板,只是在你的url中使用通用视图direct_to_template。

from django.views.generic.simple import direct_to_template

urlpatterns = patterns('',
    ('^404testing/$', direct_to_template, {'template': '404.html'})
)

我对我的project/urls.py做了以下更改,它为我工作

加上这一行: 导入url

并补充: url (r ^媒体/ (? P <路径>。*)的美元,,{“document_root”:设置。MEDIA_ROOT}), urlpattern。