我想在localhost上的gunicorn下运行我的django项目。我安装并集成了gunicorn。我跑的时候:
python manage.py run_gunicorn
它有效,但没有任何静态文件(css和js)
我在settings.py中禁用了debug和template_debug(使它们成为假),但它仍然是相同的。我错过了什么吗?
我称之为静态:
{{ STATIC_URL }}css/etc....
答案 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;
}
}
}
一些注意事项:
结束时:虽然可以从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;
}
换句话说,关于Gunicorn / Unicorn的coreyward says
并非旨在解决服务中涉及的一系列问题 文件发送给客户
如果您考虑使用其他WSGI服务器(例如uWSGI)而不是Gunicorn,则适用相同的推理方法。在uWSGI documentation
通过uWSGI提供静态文件的效率很低。相反,服务他们 直接从Nginx完全绕过uWSGI
更简单的方法是使用WhiteNoise库通过Python提供静态文件,该库非常易于设置(您可能希望使用CDN,以便大多数请求不会到达Python应用程序)。作为Miguel de Matos says,您只需
收集静态
python manage.py collectstatic
安装白噪声
pip install whitenoise
在settings.py
中添加以下STATICFILES_STORAGE
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
将以下内容添加到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