483👍
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.
610👍
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
- [Django]-How to test auto_now_add in django
- [Django]-Celery discover tasks in files with other filenames
- [Django]-Override existing Django Template Tags
108👍
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
.
- [Django]-Django ignores router when running tests?
- [Django]-Trying to migrate in Django 1.9 — strange SQL error "django.db.utils.OperationalError: near ")": syntax error"
- [Django]-Use Python standard logging in Celery
56👍
You can use WhiteNoise to serve static files in production.
Install:
pip install WhiteNoise==2.0.6
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.
- [Django]-Exclude fields in Django admin for users other than superuser
- [Django]-Django Queryset with year(date) = '2010'
- [Django]-Filtering dropdown values in django admin
24👍
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 yourMIDDLEWARE
variable insettings.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 yourmanage.py
on your server. This will copy all files from your static folders into theSTATIC_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.
- [Django]-Django 2.0 – Not a valid view function or pattern name (Customizing Auth views)
- [Django]-Where to put business logic in django
- [Django]-How do I POST with jQuery/Ajax in Django?
20👍
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'})
)
- [Django]-Django annotation with nested filter
- [Django]-Django {% if forloop.first %} question
- [Django]-Adding to the "constructor" of a django model
16👍
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())
- [Django]-Django project models.py versus app models.py
- [Django]-Django AutoField with primary_key vs default pk
- [Django]-Troubleshooting Site Slowness on a Nginx + Gunicorn + Django Stack
11👍
From here I took help by mixing a few answers. Here, I am adding my whole parts. [I am doing this for a beginners help and for my future use as well]
Well at first the question is why Debug=False
needed!
I put my project in AWS and it was being connection timeout after few hours because of memory leaking.
At first I thought for celery. [of course I am just a beginner]
Then I put DEBUG=False
from DEBUG=True
As we can see the security warning in settings.py
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
Once I did that my staticfiles were not loading successfully in webpages.
Then I searched everywhere and at first tried from here the –insecure command to runserver.
python manage.py runserver --insecure
Which is successful but I don’t want the insecure mode in my project when it is in production.
And as the proper solution [according to me] I followed the steps below.
At first, I correct the static URL,root, and dir in settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
Then collect the static files by command
python manage.py collectstatic
Now the second step, [which also provided here]
At first install whitenoise in your project directory in the command line
pip install whitenoise
Then Add ‘whitenoise.middleware.WhiteNoiseMiddleware’ in your middleware list in settings.py.
This should be added just below the ‘django.middleware.security.SecurityMiddleware’ and above all the remaining middleware. So that your middleware list will look like this:-
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', #after this line
'whitenoise.middleware.WhiteNoiseMiddleware', #add it exactlyhere
'django.contrib.sessions.middleware.SessionMiddleware', #before this
'...'
]
Add ‘whitenoise.runserver_nostatic’ on top of your installed apps So that your installed apps list will look like this:-
INSTALLED_APPS = [
'whitenoise.runserver_nostatic',
'django.contrib.admin',
'django.contrib.auth',
'...'
]
Done, you will be able to serve static files in production now!! [I did on my local environment as well]
Just use the runserver command as always no insecure or anything needed.
python manage.py runserver
Boom!!! It’s working for me.
Hahaha. I know kinda childish nature but I am so happy now.
Thanks to everyone who provided answers here and help my work.
- [Django]-ModuleNotFoundError: No module named 'grp' on windows
- [Django]-Unittest Django: Mock external API, what is proper way?
- [Django]-Paginate relationship in Django REST Framework?
9👍
Ultimate solution:-
So basically when you make debug = False, Django doesn’t want to take care of your static files.
So we want something that can take care of our files.
The answer is whitenoise.
-
pip install whitenoise in your environment
-
Add ‘whitenoise.middleware.WhiteNoiseMiddleware’ in your middleware list in settings.py.
This should be added just below the ‘django.middleware.security.SecurityMiddleware’ and above all the remaining middleware. So that your middleware list will look like this:-
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'whitenoise.middleware.WhiteNoiseMiddleware', # add it exactlyhere 'django.contrib.sessions.middleware.SessionMiddleware', '...' ]
-
Add ‘whitenoise.runserver_nostatic’ on top of your installed apps
So that your installed apps list will look like this:-INSTALLED_APPS = [ 'whitenoise.runserver_nostatic', 'django.contrib.admin', 'django.contrib.auth', '...' ]
Done, you will be able to serve static files in production now!!
- [Django]-Django gunicorn sock file not created by wsgi
- [Django]-How to implement FirebaseDB with a Django Web Application
- [Django]-Dynamic choices field in Django Models
7👍
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
- [Django]-Equivalent of PHP "echo something; exit();" with Python/Django?
- [Django]-Does django with mongodb make migrations a thing of the past?
- [Django]-How do you change the collation type for a MySQL column?
6👍
For last versions of Django please look at the answer here: https://stackoverflow.com/a/7639983/6180987
For django version below 1.10 the solution should work:
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 }), ]
- [Django]-Visual Editor for Django Templates?
- [Django]-How do I deploy Django on AWS?
- [Django]-Name '_' is not defined
6👍
This is Exactly you must type on terminal to run your project without DEBUG = TRUE
and then you see all assets (static) file is loading correctly On local server .
python manage.py runserver --insecure
--insecure
: it means you can run server without security mode
- [Django]-Django – SQL bulk get_or_create possible?
- [Django]-Django render_to_string missing information
- [Django]-Django rest framework: query parameters in detail_route
4👍
I agree with Marek Sapkota answer; But you can still use django URFConf to reallocate the url, if static file is requested.
Step 1: Define a STATIC_ROOT
path in settings.py
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
Step 2: Then collect the static files
$ python manage.py collectstatic
Step 3: Now define your URLConf that if static is in the beginning of url, access files from the static folder staticfiles
. NOTE: This is your project’s urls.py file:
from django.urls import re_path
from django.views.static import serve
urlpattern += [
re_path(r'^static/(?:.*)$', serve, {'document_root': settings.STATIC_ROOT, })
]
- [Django]-How to get GET request values in Django?
- [Django]-Macros in django templates
- [Django]-Mixin common fields between serializers in Django Rest Framework
4👍
when i make DEBUG = True
my static are doesn’t work.
if i run my project in python manage.py runserver --insecure
. By this i got my static as well.
Solution 1:
python manage.py runserver --insecure
Solution 2:
But I Need Permanent Solution. then i install pip install dj-static==0.0.6
and add some code to my wsgi.py file:
from django.core.wsgi import get_wsgi_application
from dj_static import Cling
application = Cling(get_wsgi_application())
and then i added some in setting.py:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, '/static/')
STATICFILES_DIRS = [
BASE_DIR / "static",
]
- [Django]-Django: Error: You don't have permission to access that port
- [Django]-Determine variable type within django template
- [Django]-Multiple Database Config in Django 1.2
2👍
nginx,settings and url configs
If you’re on linux this may help.
nginx file
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;
}
...........
......
}
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')
.....
....
Ensure to run:
(venv)yourPrj$ ./manage.py collectstatic
yourSys# systemctrl daemon-reload
- [Django]-What is the difference render() and redirect() in Django?
- [Django]-Python Asyncio in Django View
- [Django]-Import data from excel spreadsheet to django model
2👍
This is normal and intended behavior.
Warning
This will only work if DEBUG is True.
you can actually view custom error views until Debug is Off
If Django is just reading from the filesystem and sending out a file, then it has no advantage over a normal web server, all web servers are capable to server the files on it’s own.
Furthermore, if you serve static files with Django, you will keep the Python process busy for the duration of the request and it will be unable to serve the dynamic requests to which it is more suited.
For these reasons, the Django static view is designed only for use during development and will not work if your DEBUG setting is False.
Since during development we only usually have one person accessing the site at a time (the
developer), Django is fine to serve static files.
- [Django]-What is the difference render() and redirect() in Django?
- [Django]-Serializer call is showing an TypeError: Object of type 'ListSerializer' is not JSON serializable?
- [Django]-In django, how do I sort a model on a field and then get the last item?
2👍
I got this problem today and this fixed it while on development, 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
Don’t worry because when in production, this hosting platform (Apache, Heroku E.T.C ) would handle serving the static files for you.
Note: Heroku Doesn’t server static files, you’d want to put it on AWS or MS Azure
- [Django]-How to save pillow image object to Django ImageField?
- [Django]-UUID as default value in Django model
- [Django]-Use Python standard logging in Celery
1👍
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')} ),
)
- [Django]-How to loop over form field choices and display associated model instance fields
- [Django]-*_set attributes on Django Models
- [Django]-Django Rest Framework pagination extremely slow count
1👍
I did the following changes to my project/urls.py and it worked for me
Add this line :
from django.conf.urls import url
and add :
url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT, })
,
in urlpatterns.
- [Django]-Override existing Django Template Tags
- [Django]-Django limit_choices_to for multiple fields with "or" condition
- [Django]-How to get username from Django Rest Framework JWT token
1👍
In production mode, the static files are no longer served by Django, but rather they should be served by Apache or NGINX, and hence you will need to configure them.
On the other hand, in case you wanted to let Django serve them, then the code below helps to let the static files be served by Django when DEBUG=False
.
You can try it by appending the code below to the main urls.py
file:
from django.urls import re_path
from django.views.static import serve
urlpatterns += (
re_path(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}),
re_path(r'^static/(?P<path>.*)$', serve,{'document_root': settings.STATIC_ROOT}),
)
Then, do "collectstatic":
python manage.py collectstatic
Credit to @stathoula. Following her answer along with the remark of @leopd (adding re_path
to her answer).
- [Django]-Django 1.8 KeyError: 'manager' on relationship
- [Django]-Django – Clean permission table
- [Django]-How can I activate the unaccent extension on an already existing model
0👍
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
- [Django]-'staticfiles' is not a valid tag library: Template library staticfiles not found
- [Django]-How to define two fields "unique" as couple
- [Django]-Django {% if forloop.first %} question