postgres - django with nginx and gunicorn
¿Cómo hacer que Django sirva archivos estáticos con Gunicorn? (5)
Cuando esté en modo de desarrollo y cuando esté utilizando algún otro servidor para el desarrollo local, agregue esto a su url.py
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
# ... the rest of your URLconf goes here ...
urlpatterns += staticfiles_urlpatterns()
Más información here
Cuando estás en producción nunca, nunca pones un gunicornio al frente. En su lugar, utiliza un servidor como nginx que envía solicitudes a un grupo de trabajadores de gunicornio y también sirve los archivos estáticos.
Mira here
Quiero ejecutar mi proyecto django bajo gunicornio en localhost. Instalé e integré el gunicornio. Cuando corro:
python manage.py run_gunicorn
Funciona pero no hay ningún archivo estático (css y js)
Inhabilité debug y template_debug en settings.py (los hice falsos), pero sigue siendo el mismo. ¿Me estoy perdiendo de algo?
Llamo a la estática como:
{{ STATIC_URL }}css/etc....
Desde Django 1.3 hay django / conf / urls / static.py que manejan archivos estáticos en el modo DEBUG:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Leer más https://docs.djangoproject.com/en/2.0/howto/static-files/#serving-static-files-during-development
El gunicornio debería usarse para servir a la "aplicación" python, mientras que los archivos estáticos son servidos por un servidor de archivos estático (como Nginx).
Aquí hay una buena guía: http://honza.ca/2011/05/deploying-django-with-nginx-and-gunicorn
Este es un extracto de una de mis configuraciones:
upstream app_server_djangoapp {
server localhost:8000 fail_timeout=0;
}
server {
listen < server port goes here >;
server_name < server name goes here >;
access_log /var/log/nginx/guni-access.log;
error_log /var/log/nginx/guni-error.log info;
keepalive_timeout 5;
root < application root directory goes here >;
location /static {
autoindex on;
alias < static folder directory goes here >;
}
location /media {
autoindex on;
alias < user uploaded media file directory goes here >;
}
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://app_server_djangoapp;
break;
}
}
}
Algunas notas:
- La raíz estática, la raíz de medios, el prefijo de ruta de archivos estáticos y el prefijo de ruta de archivos multimedia están configurados en settings.py
- Una vez que tiene nginx configurado para servir desde el directorio de contenido estático, debe ejecutar "python manage.py collectstatic" en la raíz del proyecto para que los archivos estáticos en las diversas aplicaciones puedan copiarse a la carpeta estática
Para finalizar: si bien es posible servir archivos estáticos de gunicorn (habilitando una vista de publicación de archivos estáticos de solo depuración), eso se considera una mala práctica en la producción.
Lo he usado para mi entorno de desarrollo (que usa gunicornio):
from django.conf import settings
from django.contrib.staticfiles.handlers import StaticFilesHandler
from django.core.wsgi import get_wsgi_application
if settings.DEBUG:
application = StaticFilesHandler(get_wsgi_application())
else:
application = get_wsgi_application()
Y luego ejecuta gunicorn myapp.wsgi
. Esto funciona de manera similar a la respuesta de @rantanplan , sin embargo, no ejecuta ningún middleware cuando se ejecutan archivos estáticos.
Ruido blanco
Heroku recomienda este método en: https://devcenter.heroku.com/articles/django-assets :
Su aplicación ahora servirá activos estáticos directamente de Gunicorn en producción. Esto será perfectamente adecuado para la mayoría de las aplicaciones, pero es posible que las aplicaciones de nivel superior quieran explorar usando un CDN con Django-Storages.
Instalar con:
pip install whitenoise
pip freeze > requirements.txt
wsgi.py
:
import os
from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "free_books.settings")
application = get_wsgi_application()
application = DjangoWhiteNoise(application)
Probado en Django 1.9.