Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何让Django使用Gunicorn提供静态文件?_Python_Django_Gunicorn - Fatal编程技术网

Python 如何让Django使用Gunicorn提供静态文件?

Python 如何让Django使用Gunicorn提供静态文件?,python,django,gunicorn,Python,Django,Gunicorn,我想在本地主机上运行gunicorn下的django项目。我安装并集成了gunicorn。当我跑步时: python manage.py run_gunicorn 它可以工作,但没有任何静态文件(css和js) 我在settings.py中禁用了debug和template_debug(使其为false),但仍然是一样的。我错过什么了吗 我称静态为: {{ STATIC_URL }}css/etc.... gunicorn应该用于为python“应用程序”本身提供服务,而静态文件则由静态文件

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

python manage.py run_gunicorn
它可以工作,但没有任何静态文件(css和js)

我在settings.py中禁用了debug和template_debug(使其为false),但仍然是一样的。我错过什么了吗

我称静态为:

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

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;
        }
    }
}
上游应用程序\服务器\应用程序{
服务器本地主机:8000失败\u超时=0;
}
服务器{
收听<服务器端口转到此处>;
服务器名称<此处有服务器名称>;
access_log/var/log/nginx/guni-access.log;
错误日志/var/log/nginx/guni-error.log信息;
保持激活超时5;
root<应用程序根目录转到此处>;
位置/静态{
自动索引;
别名;
}
地点/媒体{
自动索引;
alias<用户上传的媒体文件目录转到此处>;
}
地点/{
proxy\u set\u header X-Forwarded-For$proxy\u add\u X\u Forwarded\u For;
代理设置头主机$http\U主机;
代理_重定向关闭;
如果(!-f$request\u文件名){
代理通行证http://app_server_djangoapp;
打破
}
}
}
一些注意事项:

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

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

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

from django.contrib.staticfiles.urls import staticfiles_urlpatterns

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

urlpatterns += staticfiles_urlpatterns()
更多信息

制作中你永远不会把枪角放在最前面。相反,你使用 像nginx这样的服务器,它向gunicorn工作人员池发送请求,并提供静态文件


请参见白噪声

第4.0版之后

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

v4.0之前的版本

Heroku在以下位置推荐此方法:

您的应用程序现在将在生产中直接从Gunicorn提供静态资产。这对于大多数应用程序来说是完全足够的,但是顶级应用程序可能希望探索使用带有Django存储的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上测试。

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


然后运行
gunicorn myapp.wsgi
。但是,它在运行静态文件时不会运行任何中间件。

因为Django 1.3有Django/conf/url/static.py在调试模式下处理静态文件:

来自django.conf导入设置的

从django.conf.url.static导入静态
URL模式=[
#…你的URLconf的其余部分都在这里。。。
]+静态(settings.MEDIA\u URL,document\u root=settings.MEDIA\u root)

阅读更多

以提供静态文件,因为通常使用Nginx将所有请求路由到/static/中

location /statis/ {

    alias /path/to/static/files;

}

换言之,关于Gunicorn/独角兽

不是为了解决服务过程中的一系列问题而设计的 向客户发送文件

相同的推理线适用于如果你考虑其他的WSGi服务器,比如UWSGi而不是GuniCon。在

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


更简单的方法是使用非常容易设置的Python库为静态文件提供服务(您可能希望使用CDN,以便大多数请求不会到达Python应用程序)。就像,你只需要

  • 收集静电

     python manage.py collectstatic
    
  • 安装白噪声

     pip install whitenoise
    
  • 在settings.py中添加以下
    STATICFILES\u存储

     STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
    

  • 将以下内容添加到settings.py中的
    中间件
    (注意,“根据whitenoise文档,您应该将中间件放在
    django.MIDDLEWARE.security.SecurityMiddleware
    )之后)


  • 当我重新启用调试和模板调试时,它开始正常工作。把这些行放到url.py中并不重要。但是现在我看不到自定义的404和500错误页面。在生产中;我是否应该进行假调试和模板调试?@drTerminal我更新了我的答案,并包含了我引用的django链接的具体措辞。自定义404/500页仅在DEBUG=False时显示。请阅读具体的链接,我想它会回答你的大部分问题。虽然我使用Django 1.6,但这对我来说很有效。在文档中,对于1.6有不同的URL模式用法,但对我来说没有结果。所以我成功地使用了1.4解决方案。@binki-Argh!你让我搜索:P所以。。。因为我有模糊的记忆,你实际上可以做到这一点,我搜索了一点。如果你下载这个pdf,这是我的答案所指的过时版本,你会发现你的应用服务器能不能都没关系,因为Django是为你做的。当然,这是非常低效的,但仍然可行。我不知道这是否还有可能,如果有,怎么做。啊,看起来可能会
     STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
    
     `MIDDLEWARE = [
       'django.middleware.security.SecurityMiddleware',
       'whitenoise.middleware.WhiteNoiseMiddleware',
       ...
     ]