nem*_*ixx 321 django django-views django-staticfiles
我正在使用Django作为我的主力来构建应用程序.到目前为止一直都很好 - 指定数据库设置,配置静态目录,网址,视图等.但是,当我想要渲染我自己的美丽和自定义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设置有什么遗漏吗?
Dmi*_*nko 440
如果您仍然需要在本地服务器静态(例如,无需调试进行测试),您可以在不安全模式下运行devserver:
manage.py runserver --insecure
Run Code Online (Sandbox Code Playgroud)
Mar*_*ota 318
关闭调试后,Django将不再为您处理静态文件 - 您的生产Web服务器(Apache或其他东西)应该处理这个问题.
Joh*_*hao 30
您可以使用WhiteNoise在生产中提供静态文件.
安装:
pip install WhiteNoise
Run Code Online (Sandbox Code Playgroud)
并将您的wsgi.py文件更改为:
from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise
application = get_wsgi_application()
application = DjangoWhiteNoise(application)
Run Code Online (Sandbox Code Playgroud)
你很高兴去!
感谢车把创意博客.
但是,我们不建议在生产中以这种方式提供静态文件.您的生产Web服务器(如nginx)应该处理这个问题.
小智 21
在urls.py中我添加了这一行:
from django.views.static import serve
Run Code Online (Sandbox Code Playgroud)
在urlpatterns中添加这两个url:
url(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}),
url(r'^static/(?P<path>.*)$', serve,{'document_root': settings.STATIC_ROOT}),
Run Code Online (Sandbox Code Playgroud)
当DEBUG = FALSE时,静态和媒体文件都是可访问的.
希望能帮助到你 :)
j_s*_*syk 17
如果在开发中使用静态服务视图,则必须具有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'})
)
Run Code Online (Sandbox Code Playgroud)
Dar*_*nus 13
约翰尼的答案很棒,但仅仅通过添加那里描述的那些线仍然不适合我.基于这个答案,实际上对我有用的步骤在哪里:
按照描述安装WhiteNoise:
pip install WhiteNoise
Run Code Online (Sandbox Code Playgroud)创建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
Run Code Online (Sandbox Code Playgroud)然后,wsgi.py按照Johnny的回答中的说明修改您的文件:
#wsgi.py
from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise
application = get_wsgi_application()
application = DjangoWhiteNoise(application)
Run Code Online (Sandbox Code Playgroud)之后,将您的更改部署到您的服务器(使用git或您使用的任何内容).
最后,collectstatic从manage.py服务器上运行该选项.这会将静态文件夹中的所有文件复制到STATIC_ROOT我们之前指定的目录中:
$ python manage.py collectstatic
Run Code Online (Sandbox Code Playgroud)
您现在将看到一个staticfiles包含此类元素的新文件夹.
执行完这些步骤后,您现在可以运行服务器,并且可以在生产模式下查看静态文件.
更新:如果您的版本<4,则更改日志表明不再需要WSGI_APPLICATION = 'projectName.wsgi.application'在您的settings.py文件上声明.
Rob*_*low 11
实际上,您可以在生产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())
Run Code Online (Sandbox Code Playgroud)
小智 11
从这里我通过混合一些答案来寻求帮助。在这里,我添加了我的全部部分。[我这样做是为了初学者的帮助以及我将来的使用]
首先的问题是为什么Debug=False需要!我把我的项目放在AWS中,几个小时后由于内存泄漏,连接超时。一开始我想到了芹菜。[当然我只是一个初学者]然后我把DEBUG=False我们DEBUG=True可以看到的安全警告放在settings.py中
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
Run Code Online (Sandbox Code Playgroud)
一旦我这样做了,我的静态文件就无法在网页中成功加载。然后我到处搜索,首先尝试从这里使用 --insecure 命令来运行服务器。
python manage.py runserver --insecure
Run Code Online (Sandbox Code Playgroud)
这是成功的,但我不希望我的项目在生产时使用不安全模式。作为正确的解决方案[根据我],我按照以下步骤操作。
首先,我更正了settings.py中的静态 URL、root 和 dir
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
Run Code Online (Sandbox Code Playgroud)
然后通过命令收集静态文件
python manage.py collectstatic
Run Code Online (Sandbox Code Playgroud)
现在是第二步,[这里也提供了]首先在命令行中的项目目录中安装whitenoise
pip install whitenoise
Run Code Online (Sandbox Code Playgroud)
然后在 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
'...'
]
Run Code Online (Sandbox Code Playgroud)
在已安装的应用程序顶部添加“whitenoise.runserver_nostatic”,以便您已安装的应用程序列表如下所示:-
INSTALLED_APPS = [
'whitenoise.runserver_nostatic',
'django.contrib.admin',
'django.contrib.auth',
'...'
]
Run Code Online (Sandbox Code Playgroud)
完成后,您现在就可以在生产中提供静态文件了![我也在我当地的环境中做了]
只需使用 runserver 命令,就不会出现不安全或任何需要的情况。
python manage.py runserver
Run Code Online (Sandbox Code Playgroud)
繁荣!!!它对我有用。 哈哈哈。我知道我的天性有点幼稚,但我现在很高兴。
感谢在这里提供答案并帮助我的工作的所有人。
小智 9
最终解决方案:-
所以基本上当你设置 debug = False 时,Django 不想处理你的静态文件。
所以我们想要一些可以处理我们的文件的东西。
答案是白噪声。
pip在您的环境中
安装whitenoise
在 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',
'...'
]
Run Code Online (Sandbox Code Playgroud)
在已安装的应用程序顶部添加“whitenoise.runserver_nostatic”,以便您已安装的应用程序列表如下所示:-
INSTALLED_APPS = [
'whitenoise.runserver_nostatic',
'django.contrib.admin',
'django.contrib.auth',
'...'
]
Run Code Online (Sandbox Code Playgroud)
完成后,您现在就可以在生产中提供静态文件了!
只需打开你的项目urls.py,然后找到这个if语句.
if settings.DEBUG:
urlpatterns += patterns(
'django.views.static',
(r'^media/(?P<path>.*)','serve',{'document_root': settings.MEDIA_ROOT}), )
Run Code Online (Sandbox Code Playgroud)
您可以在True上更改settings.DEBUG,它将始终有效.但如果您的项目是严肃的,那么您应该考虑上面提到的其他解决方案.
if True:
urlpatterns += patterns(
'django.views.static',
(r'^media/(?P<path>.*)','serve',{'document_root': settings.MEDIA_ROOT}), )
Run Code Online (Sandbox Code Playgroud)
在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 }), ]
Run Code Online (Sandbox Code Playgroud)
您可以用许多不同的方式调试它。这是我的方法。
localsettings.py:
DEBUG = False
DEBUG404 = True
Run Code Online (Sandbox Code Playgroud)
urls.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')} ),
)
Run Code Online (Sandbox Code Playgroud)
请务必阅读文档;)
https://docs.djangoproject.com/zh-CN/2.0/howto/static-files/#limiting-use-to-debug-true
这正是您必须在终端上输入才能在没有 DEBUG = TRUE 的情况下运行您的项目,然后您会看到所有资产(静态)文件都在本地服务器上正确加载。
python manage.py runserver --insecure
Run Code Online (Sandbox Code Playgroud)
--insecure : 这意味着您可以在没有安全模式的情况下运行服务器