3👍
While it is **strongly discouraged* to serve static files from Django in production (and for VERY good reasons), I often need to anyway.
In some cases its perfectly acceptable (low traffic, REST API only server, etc). If you need to do that, this snippet should help out. Adjust the re_path
or use url()
if thats your django flavor.
from django.contrib.staticfiles.views import serve as serve_static
def _static_butler(request, path, **kwargs):
"""
Serve static files using the django static files configuration
WITHOUT collectstatic. This is slower, but very useful for API
only servers where the static files are really just for /admin
Passing insecure=True allows serve_static to process, and ignores
the DEBUG=False setting
"""
return serve_static(request, path, insecure=True, **kwargs)
urlpatterns = [
...,
re_path(r'static/(.+)', _static_butler)
]
4👍
Note: This answer is also correct but I accepted the above answer too (since my app will receive very low traffic.)
Thanks for your comments. They were useful.
This is my new docker compose file:
version: '3.5'
services:
nginx:
image: nginx:latest
ports:
- "8002:8000"
volumes:
- $PWD:/code
- ./config/nginx:/etc/nginx/conf.d
- ./static:/static
depends_on:
- web
networks:
- my_net
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
env_file: .env
volumes:
- $PWD:/code
- ./static:/static
expose:
- "8000"
networks:
- my_net
networks:
my_net:
driver: bridge
And this is the Nginx conf file:
upstream web {
ip_hash;
server web:8000;
}
server {
location /static/ {
autoindex on;
alias /static/;
}
location / {
proxy_pass http://web/;
}
listen 8000;
server_name localhost;
}
You should also add “web” to the allowed hosts:
ALLOWED_HOSTS = ['0.0.0.0', 'localhost', 'web']
Update:
settings.py file:
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
# '/static'
]
STATIC_ROOT = '/static' #os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'
Also as @dirkgroten said you can set an expiry header in the static files your serve.
Another solution would be using Whitenoise (Thanks Daniel Roseman).
- [Django]-Check if each value within list is present in the given Django Model Table in a SINGLE query
- [Django]-Makemigrations does not work after deleting migrations
- [Django]-How to make a model instance read-only after saving it once?
- [Django]-What are some of the core conceptual differences between C# and Python?