Python 如何让Django使用Gunicorn提供静态文件?
我想在本地主机上运行gunicorn下的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“应用程序”本身提供服务,而静态文件则由静态文件
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
STATICFILES\u存储
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
中间件
(注意,“根据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',
...
]