453

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

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

但是文档说you can actually view custom error views until Debug is Off,所以我确实把它关掉来测试我的东西,这就是东西发疯的时候!

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

通常,一旦我设置DEBUG = False,所有视图都会加载,但任何链接的内容(CSS、Javascript、图像等)都不会加载!发生了什么?关于静态文件和设置,是否缺少某些DEBUG内容?

4

19 回答 19

558

如果您仍然需要在本地提供静态服务器(例如,无需调试的测试),您可以在不安全模式下运行 devserver:

manage.py runserver --insecure
于 2011-10-03T19:55:15.527 回答
437

关闭调试后,Django 将不再为您处理静态文件 - 您的生产 Web 服务器(Apache 或其他东西)应该负责处理。

于 2011-04-29T19:53:49.373 回答
79

在 urls.py 我添加了这一行:

from django.views.static import serve 

在 urlpatterns 中添加这两个 url:

url(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}), 
url(r'^static/(?P<path>.*)$', serve,{'document_root': settings.STATIC_ROOT}), 

并且当 DEBUG=FALSE 时静态和媒体文件都可以访问。
希望能帮助到你 :)

于 2018-04-08T20:59:29.037 回答
47

您可以使用WhiteNoise在生产中提供静态文件。

安装:

pip install WhiteNoise==2.0.6

并将您的wsgi.py文件更改为:

from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise

application = get_wsgi_application()
application = DjangoWhiteNoise(application)

你很高兴去!

感谢Handlebar Creative 博客

但是,真的不建议在生产中以这种方式提供静态文件。您的生产网络服务器(如 nginx)应该负责这一点。

于 2016-02-15T11:57:55.890 回答
23

约翰尼的回答很好,但仅仅通过添加那里描述的那些行仍然对我不起作用。根据该答案,实际对我有用的步骤在哪里:

  1. 按照说明安装WhiteNoise

    pip install WhiteNoise
    
  2. 创建STATIC_ROOT变量并将 WhiteNoise 添加到您的MIDDLEWARE变量中settings.py

    #settings.py
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'whitenoise.middleware.WhiteNoiseMiddleware', #add whitenoise
        'django.contrib.sessions.middleware.SessionMiddleware',
        ...
    ]
    
    #...
    
    STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') ##specify static root
    
  3. wsgi.py然后,按照约翰尼的回答中的说明修改您的文件:

    #wsgi.py
    from django.core.wsgi import get_wsgi_application
    from whitenoise.django import DjangoWhiteNoise
    
    application = get_wsgi_application()
    application = DjangoWhiteNoise(application)
    
  4. 之后,将您的更改部署到您的服务器(使用 git 或您使用的任何东西)。

  5. 最后,从您的服务器上运行该collectstatic选项。manage.py这会将静态文件夹中的所有文件复制到STATIC_ROOT我们之前指定的目录中:

    $ python manage.py collectstatic
    

    您现在将看到一个名为staticfiles包含此类元素的新文件夹。

完成这些步骤后,您现在可以运行您的服务器,并且能够在生产模式下查看您的静态文件。

更新:如果您的版本 < 4,则更改日志表明不再需要WSGI_APPLICATION = 'projectName.wsgi.application'在您的settings.py文件中声明。

于 2018-04-18T00:18:53.450 回答
20

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

警告

这仅在 DEBUG 为 True 时有效。

那是因为这种观点非常低效并且可能不安全。这仅用于本地开发,绝不能在生产中使用。

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

编辑:您可以添加一些网址来测试您的 404 和 500 模板,只需在您的网址中使用通用视图 direct_to_template 即可。

from django.views.generic.simple import direct_to_template

urlpatterns = patterns('',
    ('^404testing/$', direct_to_template, {'template': '404.html'})
)
于 2011-04-29T19:53:00.273 回答
15

实际上,您可以在生产 Django 应用程序中安全地提供静态文件,而无需DEBUG=True.

与其使用 Django 本身,不如在你的 WSGI 文件(github )中使用dj_static

# requirements.txt:

...
dj-static==0.0.6


# YOURAPP/settings.py:

...
STATIC_ROOT = 'staticdir'
STATIC_URL = '/staticpath/'

# YOURAPP/wsgi.py:

...
from django.core.wsgi import get_wsgi_application
from dj_static import Cling

application = Cling(get_wsgi_application())
于 2014-09-14T10:00:06.063 回答
7

您可以通过许多不同的方式对此进行调试。这是我的方法。

本地设置.py:

DEBUG = False
DEBUG404 = True

网址.py:

from django.conf import settings
import os

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

请务必阅读文档;)

https://docs.djangoproject.com/en/2.0/howto/static-files/#limiting-use-to-debug-true

于 2011-10-03T18:57:21.310 回答
6

对于 Django 的最新版本,请在此处查看答案:https ://stackoverflow.com/a/7639983/6180987

对于 1.10 以下的 django 版本,该解决方案应该可以工作:

只需打开您的项目 urls.py,然后找到这个 if 语句。

if settings.DEBUG:
    urlpatterns += patterns(
        'django.views.static',
        (r'^media/(?P<path>.*)','serve',{'document_root': settings.MEDIA_ROOT}), )

您可以将 settings.DEBUG 更改为 True,它将始终有效。但是,如果您的项目很严肃,那么您应该考虑上面提到的其他解决方案。

if True:
    urlpatterns += patterns(
        'django.views.static',
        (r'^media/(?P<path>.*)','serve',{'document_root': settings.MEDIA_ROOT}), )

在 django 1.10 中你可以这样写:

urlpatterns += [ url(r'^media/(?P<path>.*)$', serve, { 'document_root': settings.MEDIA_ROOT, }), url(r'^static/(?P<path>.*)$', serve, { 'document_root': settings.STATIC_ROOT }), ]
于 2016-05-08T22:05:42.957 回答
5

这正是您必须在终端上键入才能在没有 DEBUG = TRUE 的情况下运行您的项目,然后您会看到所有资产(静态)文件在本地服务器上正确加载。

python manage.py runserver --insecure 

--insecure:这意味着您可以在没有安全模式的情况下运行服务器

于 2020-06-18T05:43:26.333 回答
4

终极解决方案:-
所以基本上当你使 debug = False 时,Django 不想处理你的静态文件。
所以我们想要一些可以处理我们文件的东西。
答案是白噪声。

  1. 在您的环境中 安装白噪声

  2. 在 settings.py 的中间件列表中添加“whitenoise.middleware.WhiteNoiseMiddleware”

    这应该添加到'django.middleware.security.SecurityMiddleware' 的下方,以及所有剩余的中间件之上。这样您的中间件列表将如下所示:-

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'whitenoise.middleware.WhiteNoiseMiddleware',
        # add it exactlyhere
        'django.contrib.sessions.middleware.SessionMiddleware',
        '...'
    ]
    
  3. 在已安装的应用程序顶部添加“whitenoise.runserver_nostatic”,这样您已安装的应用程序列表将如下所示:-

    INSTALLED_APPS = [
        'whitenoise.runserver_nostatic',
        'django.contrib.admin',
        'django.contrib.auth',
        '...'
    ]
    

完成,您现在可以在生产环境中提供静态文件了!!

于 2021-04-03T12:33:27.810 回答
3

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

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

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

第二步:然后收集静态文件

$ python manage.py collectstatic

第 3 步:现在定义您的 URLConf,如果 static 在 url 的开头,则从 static 文件夹访问文件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, })
]
于 2020-06-19T06:19:33.930 回答
2

这是正常和预期的行为。

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,它将无法工作。

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

于 2021-05-22T13:01:19.243 回答
2

当我使DEBUG = True我的静态不起作用时。

如果我在python manage.py runserver --insecure. 通过这个我也得到了我的静态。

解决方案1:

python manage.py runserver --insecure

解决方案2:

但我需要永久解决方案。然后我安装pip install dj-static==0.0.6并添加一些代码到我的 wsgi.py 文件中:

from django.core.wsgi import get_wsgi_application
from dj_static import Cling

application = Cling(get_wsgi_application())

然后我在setting.py中添加了一些:

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, '/static/')
STATICFILES_DIRS = [
    BASE_DIR / "static",
]
于 2021-09-21T13:12:13.420 回答
1

不推荐对 url() 的字符串视图参数的支持,并将在 Django 1.10 中删除

我的解决方案只是对上述 Conrado 解决方案的小修正。

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')} ),
        )
于 2016-01-20T10:50:42.890 回答
1

我对我的 project/urls.py 做了以下更改,它对我有用

添加这一行: from django.conf.urls import url

并在 urlpatterns 中添加 : url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT, })

于 2019-03-28T11:59:21.147 回答
1

nginx,设置和 url 配置

如果您使用的是 linux,这可能会有所帮助。

nginx 文件

your_machn:/#vim 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;
    }
...........
......
}

网址.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)

设置.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
于 2021-01-25T16:33:09.103 回答
1

从这里我通过混合一些答案来获得帮助。在这里,我正在添加我的整个部分。[我这样做是为了初学者的帮助以及我将来的使用]

那么首先的问题是为什么Debug=False需要!我将我的项目放在 AWS 中,由于内存泄漏,几个小时后连接超时。起初我想芹菜。[当然我只是一个初学者] 然后我把DEBUG=Falsefrom DEBUG=TrueAs we can see the security warning in settings.py

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

一旦我这样做了,我的静态文件就没有在网页中成功加载。然后我到处搜索,首先从这里尝试使用 --insecure 命令来运行服务器。

python manage.py runserver --insecure

这是成功的,但我不希望我的项目在生产时使用不安全模式。作为正确的解决方案[根据我],我遵循了以下步骤。

首先,我更正了settings.py中的静态 URL、root 和 dir

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

然后通过命令收集静态文件

python manage.py collectstatic

现在第二步,[这里也提供了]首先在命令行中的项目目录中安装whitenoise

pip install whitenoise

然后在 settings.py 的中间件列表中添加“whitenoise.middleware.WhiteNoiseMiddleware”。

这应该添加到 'django.middleware.security.SecurityMiddleware' 的下方,以及所有剩余的中间件之上。这样您的中间件列表将如下所示:-

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware', #after this line
    'whitenoise.middleware.WhiteNoiseMiddleware', #add it exactlyhere
    'django.contrib.sessions.middleware.SessionMiddleware', #before this
    '...'
]

在已安装的应用程序顶部添加“whitenoise.runserver_nostatic”,这样您已安装的应用程序列表将如下所示:-

INSTALLED_APPS = [
    'whitenoise.runserver_nostatic',
    'django.contrib.admin',
    'django.contrib.auth',
    '...'
]

完成,您现在可以在生产环境中提供静态文件了!![我也在我的本地环境中做过]

只需像往常一样使用 runserver 命令,没有不安全的或需要的任何东西。

python manage.py runserver

繁荣!!!它对我有用。 哈哈哈。我知道有点幼稚,但我现在很开心。

感谢所有在这里提供答案并帮助我工作的人。

于 2022-02-06T07:01:09.807 回答
0

虽然它不是最安全的,但你可以在源代码中更改。导航Python/2.7/site-packages/django/conf/urls/static.py

然后编辑如下:

if settings.DEBUG or (prefix and '://' in prefix):

因此,如果settings.debug==False它不会影响代码,也可以在运行后尝试python manage.py runserver --runserver运行静态文件。

注意:信息只能用于测试

于 2016-10-29T15:15:36.733 回答