如何让Django与Gunicorn一起提供静态文件?

时间:2012-10-09 13:13:17

标签: python django gunicorn

我想在localhost上的gunicorn下运行我的django项目。我安装并集成了gunicorn。我跑的时候:

python manage.py run_gunicorn

它有效,但没有任何静态文件(css和js)

我在settings.py中禁用了debug和template_debug(使它们成为假),但它仍然是相同的。我错过了什么吗?

我称之为静态:

{{ STATIC_URL }}css/etc....

6 个答案:

答案 0 :(得分:135)

开发模式下以及使用其他服务器进行本地开发时将此添加到您的url.py

from django.contrib.staticfiles.urls import staticfiles_urlpatterns

# ... the rest of your URLconf goes here ...

urlpatterns += staticfiles_urlpatterns()

更多信息here

制作时,你永远不会把枪声放在前面。相反,你使用 像nginx这样的服务器,它将请求分派给一个gunicorn工作者池,并提供静态文件。

请参阅here

答案 1 :(得分:18)

<强>白噪声

发布v4.0

http://whitenoise.evans.io/en/stable/changelog.html#v4-0

  

Django的WSGI集成选项(涉及编辑wsgi.py)已被删除。相反,您应该将WhiteNoise添加到settings.py中的中间件列表中,并从wsgi.py中删除对WhiteNoise的任何引用。有关详细信息,请参阅文档。   (纯WSGI集成仍可用于非Django应用程序。)

Pre v4.0

Heroku建议使用此方法:https://devcenter.heroku.com/articles/django-assets

  

您的应用程序现在将直接从Gunicorn生产静态资产。这对于大多数应用程序来说都是完全足够的,但顶层应用程序可能希望使用带有Django-Storage的CDN进行探索。

安装时:

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)

在Django 1.9上测试。

答案 2 :(得分:12)

应该使用gunicorn为python“应用程序”本身提供服务,而静态文件由静态文件服务器(如Nginx)提供。

这里有一个很好的指南:http://honza.ca/2011/05/deploying-django-with-nginx-and-gunicorn

这是我的一个配置的摘录:

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;
        }
    }
}

一些注意事项:

  • 静态根,媒体根,静态文件路径前缀和媒体文件路径前缀在settings.py
  • 中设置
  • 一旦你将nginx设置为从静态内容目录提供服务,你需要在项目根目录中运行“python manage.py collectstatic”,以便可以将各种应用程序中的静态文件复制到静态文件夹中

结束时:虽然可以从gunicorn提供静态文件(通过启用仅调试静态文件服务视图),但这在生产中被认为是不好的做法。

答案 3 :(得分:5)

我已将此用于我的开发环境(使用gunicorn):

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()

然后运行gunicorn myapp.wsgi。这与<{3}}的类似有效,但是,在运行静态文件时,它不会运行任何中间件。

答案 4 :(得分:2)

为了提供静态文件(例如Jamie Hewland says),通常使用Nginx将所有请求路由到/ static/。

location /statis/ {

    alias /path/to/static/files;

}

Nginx + Gunicorn + Django

换句话说,关于Gunicorn / Unicorn的coreyward says

并非旨在解决服务中涉及的一系列问题 文件发送给客户

如果您考虑使用其他WSGI服务器(例如uWSGI)而不是Gunicorn,则适用相同的推理方法。在uWSGI documentation

通过uWSGI提供静态文件的效率很低。相反,服务他们 直接从Nginx完全绕过uWSGI


更简单的方法是使用WhiteNoise库通过Python提供静态文件,该库非常易于设置(您可能希望使用CDN,以便大多数请求不会到达Python应用程序)。作为Miguel de Matos says,您只需

  1. 收集静态

    python manage.py collectstatic
    
  2. 安装白噪声

    pip install whitenoise
    
  3. 在settings.py

    中添加以下STATICFILES_STORAGE
    STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
    
  4. 将以下内容添加到settings.py中的MIDDLEWARE

    `MIDDLEWARE = [
      'whitenoise.middleware.WhiteNoiseMiddleware',
      'django.middleware.security.SecurityMiddleware',
      ...
    ]
    

答案 5 :(得分:1)

由于Django 1.3有django / conf / urls / static.py在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)

了解更多https://docs.djangoproject.com/en/2.0/howto/static-files/#serving-static-files-during-development