我想在localhost的gunicorn下运行django项目。我安装并集成了Gunicorn。当我跑步时:
python manage.py run_gunicorn
它可以工作,但是没有任何静态文件(css和js)
我在settings.py中禁用了debug和template_debug(将它们设置为false),但是仍然相同。我想念什么吗?
我称静态为:
{{ STATIC_URL }}css/etc....
Answers:
django.views.static.serve
现代文档中仍然会存在这种情况。但是从1.4文档中基本上没有改变,但警告相同:“此视图未用于生产用途,应仅用作开发辅助工具”。措辞不强。因此,使用纯django甚至可以记录下来,都是可行的,只是我猜它是“不受支持的”用法。仅该serve
功能始终可用,但static
辅助功能会在生产中自动禁用。
白噪声
后v4.0
http://whitenoise.evans.io/en/stable/changelog.html#v4-0
Django的WSGI集成选项(涉及编辑wsgi.py)已被删除。相反,您应该将WhiteNoise添加到settings.py的中间件列表中,并从wsgi.py中删除对WhiteNoise的任何引用。有关更多详细信息,请参见文档。(纯WSGI集成仍可用于非Django应用。)
v4.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上测试。
pip freeze > requirements.txt
将覆盖以前的要求,我建议pip freeze | grep whitenoise >> requirements.txt
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;
}
}
}
一些注意事项:
最后:虽然可以从gunicorn提供静态文件(通过启用仅调试的静态文件提供视图),但这在生产中被认为是不好的做法。
我已经在我的开发环境(使用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的答案,但是,在运行静态文件,当它不运行任何中间件。
为了提供静态文件,正如Jamie Hewland所说,通常一个使用Nginx将所有请求路由到/ static /
location /statis/ {
alias /path/to/static/files;
}
换句话说,正如Coreyward所说,关于Gunicorn / Unicorn
并非旨在解决向客户提供文件方面的一系列问题
如果您考虑使用其他WSGI服务器(例如uWSGI)而不是Gunicorn,则适用相同的推理方法。在uWSGI文档中
通过uWSGI服务静态文件效率低下。相反,直接从Nginx提供服务并完全绕过uWSGI
更简单的方法是使用WhiteNoise库通过Python提供静态文件,该库非常易于设置(您可能希望使用CDN,以便大多数请求不会到达Python应用程序)。正如Miguel de Matos所说,您只需要
收集静态
python manage.py collectstatic
安装白噪声
pip install whitenoise
STATICFILES_STORAGE
在settings.py中添加以下内容
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
将以下内容添加到您MIDDLEWARE
的settings.py中
`MIDDLEWARE = [
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.middleware.security.SecurityMiddleware',
...
]
从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