如何让Django为Gunicorn提供静态文件?

egmofgnx  于 2022-11-18  发布在  Go
关注(0)|答案(7)|浏览(254)

我想在本地主机上的gunicorn下运行我的django项目。我安装并集成了gunicorn。当我运行:

python manage.py run_gunicorn

它工作,但没有任何静态文件(css和js)
我在www.example.com中禁用了debug和template_debugsettings.py(使它们为false),但它仍然是一样的。我是否遗漏了什么?
我把静电称为:

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

tgabmvqs1#

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

from django.contrib.staticfiles.urls import staticfiles_urlpatterns

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

urlpatterns += staticfiles_urlpatterns()

此处提供更多信息
在生产过程中,你从来没有把gunicorn放在前面,而是使用nginx这样的服务器,它把请求分配给gunicorn工作者池,同时也提供静态文件。
请参阅here

5kgi1eie

5kgi1eie2#

白噪音
4.0版之后

http://whitenoise.evans.io/en/stable/changelog.html#v4-0
Django的WSGI集成选项(涉及到编辑wsgi.py)已经被移除。相反,您应该将WhiteNoise添加到www.example.com中的中间件列表中settings.py,并从wsgi.py中移除对WhiteNoise的任何引用。更多细节请参见文档。(纯WSGI集成仍然适用于非Django应用。

4.0版之前

Heroku在以下网址推荐此方法:https://devcenter.heroku.com/articles/django-assets
您的应用程序现在可以直接从Gunicorn提供静态资产。这对于大多数应用程序来说是完全足够的,但是顶层应用程序可能需要使用CDN和Django-Storages。
安装方式:

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上测试。

bihw5rsg

bihw5rsg3#

我在开发环境(使用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。这与@rantanplan的答案 * 类似 *,但是,它在运行静态文件时不运行任何中间件。

pcrecxhr

pcrecxhr4#

gunicorn应该用于为python“应用程序”本身提供服务,而静态文件由静态文件服务器(如Nginx)提供服务。
这是我的一个配置的摘录:

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

一些注意事项:

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

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

bq3bfh9z

bq3bfh9z5#

虽然你可以在开发模式下使用Django来为应用django.contrib.staticfiles提供静态文件,但这并不适合生产使用。
为了提供静态文件(如Jamie Hewland says),通常使用Nginx将所有请求路由到/static/

location /static/ {

    alias /path/to/static/files;

}

还有,和关于Gunicorn / Unicorn的coreyward says一样
并不是为了解决向客户端提供文件所涉及的一系列问题而设计的
同样的道理也适用于其他WSGI服务器,比如uWSGI而不是Gunicorn。
通过uWSGI提供静态文件效率很低。相反,直接从Nginx提供静态文件,完全绕过uWSGI
因此,在生产环境中提供静态文件是NGINX的工作,而不是Django或其他WSGI服务器。
另一种方法是在生产环境中使用WhiteNoise库来处理静态文件,它非常容易设置(您可能希望使用CDN,这样大多数请求就不会到达Python应用程序)。
1.收集静态

python manage.py collectstatic

1.安装白噪声

pip install whitenoise

1.在www.example.com中添加以下STATICFILES_STORAGEsettings.py

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

1.将以下内容添加到www.example.com中的MIDDLEWAREsettings.py(如mracette所述,“根据白噪声文档,您应该将中间件放在django.middleware.security.SecurityMiddleware之后“)

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

wnvonmuf6#

从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

2ul0zpep

2ul0zpep7#

如果您使用Apache/Gunicorn,那么下面是我如何设置我的。
1.在你的Django根目录中(使用manage.py),创建目录mkdir -p django_static/static
1.在项目settings.py中设置以下内容:

DEBUG = False
INSTALLED_APPS = [..., 'django.contrib.staticfiles', ...]
STATIC_URL = 'static/'
STATIC_ROOT = os.path.join(BASE_DIR, "django_static", "static")

1.运行python manage.py collectstatic。这将把静态内容输出到django_static/static
1.使用gunicorn your_project_name.wsgi启动您的gunicorn服务器(外加选项)
1.假设您有默认的全局Apache设置,您需要创建一个从/var/www到静态目录的软链接:sudo ln -s /path/to/your_django_project/django_static /var/www/your_django_project_static
1.对于您希望指向Django应用的域www.example.com,在apache中配置以下虚拟主机,以便将所有提交到https://www.example.com的请求代理到127.0.0.1:8000上**,除了**www.example.com/static/路由(在这种情况下,将文件服务于来自django_static的此类请求):

<VirtualHost *:443>
    ServerName www.example.com
    DocumentRoot /var/www/your_django_project_static
    <Location "/">
        ProxyPreserveHost On
        ProxyPass http://127.0.0.1:8000/
        ProxyPassReverse http://127.0.0.1:8000/
    </Location>
    <Location "/static/">
        ProxyPass "!"
    </Location>
</VirtualHost>

瞧!

相关问题