可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
Am building an app using Django as my workhorse. All has been well so far - specified db settings, configured static directories, urls, views etc. But trouble started sneaking in the moment I wanted to render my own beautiful and custom 404.html and 500.html pages.
I read the docs on custom error handling, and set necessary configurations in UrlsConf, created corresponding views and added the 404.html and the 500.html to my app\'s template directory (specified in the settings.py too).
But the docs say you can actually view custom error views until Debug is Off
, so I did turn it off to test my stuff, and that\'s when stuff goes berserk!
Not only do I fail to view the custom 404.html (actually, it loads, but because my error pages each contain a graphic error message -as some nice image), the source of the error page loads, but nothing else loads! Not even linked CSS or Javascript!
Generally, once I set DEBUG = False
, all views will load, but any linked content (CSS, Javascript, Images, etc) wont load! What\'s happening? Is there something am missing, concerning static files and the DEBUG
setting?
回答1:
With debug turned off Django won\'t handle static files for you any more - your production web server (Apache or something) should take care of that.
回答2:
If you still need to server static locally (e.g. for testing without debug) you can run devserver in insecure mode:
manage.py runserver --insecure
回答3:
You can use WhiteNoise to serve static files in production.
Install:
pip install WhiteNoise
And change your wsgi.py file to this:
from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise
application = get_wsgi_application()
application = DjangoWhiteNoise(application)
And you\'re good to go!
Credit to Handlebar Creative Blog.
BUT, it\'s really not recommended serving static files this way in production. Your production web server(like nginx) should take care of that.
回答4:
If you are using the static serve view in development, you have to have DEBUG = True :
Warning
This will only work if DEBUG is True.
That\'s because this view is grossly
inefficient and probably insecure.
This is only intended for local
development, and should never be used
in production.
Docs: serving static files in developent
EDIT: You could add some urls just to test your 404 and 500 templates, just use the generic view direct_to_template in your urls.
from django.views.generic.simple import direct_to_template
urlpatterns = patterns(\'\',
(\'^404testing/$\', direct_to_template, {\'template\': \'404.html\'})
)
回答5:
You actually can serve static files in a production Django app, securely and without DEBUG=True
.
Rather than using Django itself, use dj_static in your WSGI file (github):
# 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())
回答6:
Johnny\'s answer is great, but still didn\'t work for me just by adding those lines described there. Based on that answer, the steps that actually worked for me where:
Install WhiteNoise as described:
pip install WhiteNoise
Create the STATIC_ROOT
variable and add WhiteNoise to your MIDDLEWARE
variable in 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
Then, modify your wsgi.py
file as explained in Johnny\'s answer:
#wsgi.py
from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise
application = get_wsgi_application()
application = DjangoWhiteNoise(application)
After that, deploy your changes to your server (with git or whatever you use).
Finally, run the collectstatic
option from your manage.py
on your server. This will copy all files from your static folders into the STATIC_ROOT
directory we specified before:
$ python manage.py collectstatic
You will now see a new folder named staticfiles
that contains such elements.
After following these steps you can now run your server and will be able to see your static files while in Production mode.
Update: In case you had version < 4 the changelog indicates that it\'s no longer necessary to declare the WSGI_APPLICATION = \'projectName.wsgi.application\'
on your settings.py
file.
回答7:
Just open your project urls.py, then find this if statement.
if settings.DEBUG:
urlpatterns += patterns(
\'django.views.static\',
(r\'^media/(?P<path>.*)\',\'serve\',{\'document_root\': settings.MEDIA_ROOT}), )
You can change settings.DEBUG on True and it will work always. But if your project is a something serious then you should to think about other solutions mentioned above.
if True:
urlpatterns += patterns(
\'django.views.static\',
(r\'^media/(?P<path>.*)\',\'serve\',{\'document_root\': settings.MEDIA_ROOT}), )
In django 1.10 you can write so:
urlpatterns += [ url(r\'^media/(?P<path>.*)$\', serve, { \'document_root\': settings.MEDIA_ROOT, }), url(r\'^static/(?P<path>.*)$\', serve, { \'document_root\': settings.STATIC_ROOT }), ]
回答8:
In urls.py I added this line:
from django.views.static import serve
add those two urls in urlpatterns:
url(r\'^media/(?P<path>.*)$\', serve,{\'document_root\': settings.MEDIA_ROOT}),
url(r\'^static/(?P<path>.*)$\', serve,{\'document_root\': settings.STATIC_ROOT}),
and both static and media files were accesible when DEBUG=FALSE.
Hope it helps :)
回答9:
You can debug this in many different ways. Here\'s my approach.
localsettings.py:
DEBUG = False
DEBUG404 = True
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\')} ),
)
Be sure to read the docs ;)
https://docs.djangoproject.com/en/2.0/howto/static-files/#limiting-use-to-debug-true
回答10:
Support for string view arguments to url() is deprecated and will be removed in Django 1.10
My solution is just small correction to Conrado solution above.
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\')} ),
)
回答11:
Although it\'s not safest, but you can change in the source code. navigate to Python/2.7/site-packages/django/conf/urls/static.py
Then edit like following:
if settings.DEBUG or (prefix and \'://\' in prefix):
So then if settings.debug==False
it won\'t effect on the code, also after running try python manage.py runserver --runserver
to run static files.
NOTE: Information should only be used for testing only