Serving static files can be tricky. But if the below steps are followed should be simple and working as expected.
- Note
- Create a folder called static in your app and maintain the static files in the folder. if maintained in other places the file will not be server.
- In testing environment make sure the url.py is appended with url required for serving static files.
Django Documentation
Websites generally need to serve additional files such as images, JavaScript, or CSS. In Django, we refer to these files as “static files”. Django provides django.contrib.staticfiles
to help you manage them.
This page describes how you can serve these static files.
Configuring static files¶
- Make sure that
django.contrib.staticfiles
is included in yourINSTALLED_APPS
. - In your settings file, define
STATIC_URL
, for example:STATIC_URL = “static/” - In your templates, use the
static
template tag to build the URL for the given relative path using the configuredstaticfiles
STORAGES
alias.{% load static %} <img src=“{% static ‘my_app/example.jpg’ %}” alt=“My image”> - Store your static files in a folder called
static
in your app. For examplemy_app/static/my_app/example.jpg
.
Serving the files
In addition to these configuration steps, you’ll also need to actually serve the static files.
During development, if you use django.contrib.staticfiles
, this will be done automatically by runserver
when DEBUG
is set to True
(see django.contrib.staticfiles.views.serve()
).
This method is grossly inefficient and probably insecure, so it is unsuitable for production.
See How to deploy static files for proper strategies to serve static files in production environments.
Your project will probably also have static assets that aren’t tied to a particular app. In addition to using a static/
directory inside your apps, you can define a list of directories (STATICFILES_DIRS
) in your settings file where Django will also look for static files. For example:STATICFILES_DIRS = [ BASE_DIR / “static”, “/var/www/static/”, ]
See the documentation for the STATICFILES_FINDERS
setting for details on how staticfiles
finds your files.
Static file namespacing
Now we might be able to get away with putting our static files directly in my_app/static/
(rather than creating another my_app
subdirectory), but it would actually be a bad idea. Django will use the first static file it finds whose name matches, and if you had a static file with the same name in a different application, Django would be unable to distinguish between them. We need to be able to point Django at the right one, and the best way to ensure this is by namespacing them. That is, by putting those static files inside another directory named for the application itself.
You can namespace static assets in STATICFILES_DIRS
by specifying prefixes.
Serving static files during development¶
If you use django.contrib.staticfiles
as explained above, runserver
will do this automatically when DEBUG
is set to True
. If you don’t have django.contrib.staticfiles
in INSTALLED_APPS
, you can still manually serve static files using the django.views.static.serve()
view.
This is not suitable for production use! For some common deployment strategies, see How to deploy static files.
For example, if your STATIC_URL
is defined as static/
, you can do this by adding the following snippet to your urls.py
:fromdjango.confimport settings fromdjango.conf.urls.staticimport static urlpatterns = [ # … the rest of your URLconf goes here … ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Note
This helper function works only in debug mode and only if the given prefix is local (e.g. static/
) and not a URL (e.g. http://static.example.com/
).
Also this helper function only serves the actual STATIC_ROOT
folder; it doesn’t perform static files discovery like django.contrib.staticfiles
.
Finally, static files are served via a wrapper at the WSGI application layer. As a consequence, static files requests do not pass through the normal middleware chain.
Sample urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('equity.urls')),
]
from django.conf import settings
from django.contrib.staticfiles import views
from django.urls import re_path
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
if settings.DEBUG:
urlpatterns += [
re_path(r"^static/(?P<path>.*)$", views.serve),
]
#urlpatterns += staticfiles_urlpatterns()
0 Comments