Django heroku 静态目录
Posted
技术标签:
【中文标题】Django heroku 静态目录【英文标题】:Django heroku static dir 【发布时间】:2012-06-05 05:29:27 【问题描述】:我是 heroku 的新手,我尝试了一个没有 css 的简单 django 应用程序。
但我只是在我的应用程序中添加了一个 css 文件,当我这样做时:
git push heroku master
静态文件收集失败:
[...]
-----> Collecting static files
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/tmp/build_2unndirli15s7/.heroku/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
utility.execute()
File "/tmp/build_2unndirli15s7/.heroku/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/tmp/build_2unndirli15s7/.heroku/venv/lib/python2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv
self.execute(*args, **options.__dict__)
File "/tmp/build_2unndirli15s7/.heroku/venv/lib/python2.7/site-packages/django/core/management/base.py", line 232, in execute
output = self.handle(*args, **options)
File "/tmp/build_2unndirli15s7/.heroku/venv/lib/python2.7/site-packages/django/core/management/base.py", line 371, in handle
return self.handle_noargs(**options)
File "/tmp/build_2unndirli15s7/.heroku/venv/lib/python2.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 163, in handle_noargs
collected = self.collect()
File "/tmp/build_2unndirli15s7/.heroku/venv/lib/python2.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 104, in collect
for path, storage in finder.list(self.ignore_patterns):
File "/tmp/build_2unndirli15s7/.heroku/venv/lib/python2.7/site-packages/django/contrib/staticfiles/finders.py", line 105, in list
for path in utils.get_files(storage, ignore_patterns):
File "/tmp/build_2unndirli15s7/.heroku/venv/lib/python2.7/site-packages/django/contrib/staticfiles/utils.py", line 25, in get_files
directories, files = storage.listdir(location)
File "/tmp/build_2unndirli15s7/.heroku/venv/lib/python2.7/site-packages/django/core/files/storage.py", line 235, in listdir
for entry in os.listdir(path):
OSError: [Errno 2] No such file or directory: '/home/kevin/web/django/appheroku/blogapp/static'
! Heroku push rejected, failed to compile Python/django app
To git@heroku.com:[...]
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'git@heroku.com:[...]'
这是我的 settings.py:
[...]
STATIC_ROOT = '/home/kevin/web/django/appheroku/staticfiles'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
'/home/kevin/web/django/appheroku/blogapp/static',
)
[...]
urls.py:
[...]
if settings.DEBUG:
urlpatterns += staticfiles_urlpatterns()
过程文件:
web: python appheroku/manage.py collectstatic --noinput; bin/gunicorn_django --workers=4 --bind=0.0.0.0:$PORT appheroku/monblog/settings.py
似乎甚至'/home/kevin/web/django/appheroku/blogapp/static'目录都存在,它没有被检测到,我不知道为什么。 :(
请帮帮我^^
编辑:
现在我的 settings.py 看起来像这样:
import os
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
PROJECT_DIR = os.path.join(PROJECT_ROOT,'../blogapp')
[...]
STATIC_ROOT = os.path.join(PROJECT_ROOT,'staticfiles/')
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(PROJECT_DIR,'static/'),
)
[...]
现在静态文件收集步骤似乎运行良好:
-----> Collecting static files
74 static files copied.
还有一个问题: 在我的 procfile 中,找不到 'appheroku/manage.py' 、 'bin/gunicorn_django' 和 'appheroku/monblog/settings.py' 。 我修复了它,现在我的 procfile 看起来像这样:
web: python manage.py collectstatic --noinput; gunicorn_django --workers=4 --bind=0.0.0.0:$PORT monblog.settings
应用程序不再崩溃,但仍然没有 CSS。 这是日志:
'2012-05-31T17:35:16+00:00 heroku[router]: GET xxxx-xxxx-number.herokuapp.com/ dyno=web.1 queue=0 wait=0ms service=85ms status=200 bytes=1054
2012-05-31T17:35:17+00:00 heroku[router]: GET xxxx-xxxx-number.herokuapp.com/static/css/style.css dyno=web.1 queue=0 wait=0ms service=5ms status=404 bytes=2088
2012-05-31T17:35:17+00:00 heroku[router]: GET xxxx-xxxx-number.herokuapp.com/static/js/jquery-1.7.2.min.js dyno=web.1 queue=0 wait=0ms service=5ms status=404 bytes=2115'
EDIT3:
是的!它有效^^ 问题出在我的 urls.py 中。我写道:
[...]
if not settings.DEBUG:
urlpatterns += staticfiles_urlpatterns()
而不是
[...]
if settings.DEBUG:
urlpatterns += staticfiles_urlpatterns()
我的消息中没有错误。是的,真的很难帮助我。 (对不起)我觉得自己好笨^^'
【问题讨论】:
【参考方案1】:你正在路上。发生的情况是 Heroku 正在尝试使用您的机器上本地存在但 Heroku 服务器上不存在的 STATICFILES_DIRS 设置 (/home/kevin/web/django/appheroku/blogapp/static)。
一个简单的解决方案是从 staticfiles_dir 变量中删除该行,这样你就有了:
STATICFILES_DIRS = ()
然后您的默认 STATICFILES_FINDERS 将启动,您应该可以在本地运行您的应用程序以及部署在 Heroku 上。
【讨论】:
谢谢,我现在明白了。您的解决方案使“没有这样的文件或目录”错误消失,但现在出现如下错误:“Traceback(最近一次调用最后一次):OSError:[Errno 30]只读文件系统:'/home/kevin' 所以新的错误应该在 Kay Zhu 的建议下修复。关于没有显示 CSS,当您尝试直接转到 CSS 页面时,heroku 日志中的错误是什么?您可以在命令行上使用“heroku logs --tail”来跟踪日志,以更好地处理挂起是什么 GET xxx-xxx-number.herokuapp.com/static/css/style.css dyno=web.1 queue=0 wait=0ms service=6ms status=404 bytes=2088 终于,它工作了。再次感谢你,我正要放弃,你的信息让我重新思考这个问题。 =) 感谢您的回答。我确实有同样的烦恼......只是在线添加静态文件是多么困难!花了几个小时后的某个时候,我告诉自己我应该坚持使用 php【参考方案2】:问题是在 Heroku 服务器中找不到您用于 STATIC_ROOT
的绝对路径。
要解决它,请考虑以下方法。
在你的 settings.py 中:
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
STATIC_ROOT= os.path.join(PROJECT_DIR,'staticfiles/')
STATICFILES_DIRS = (
os.path.join(PROJECT_ROOT,'static/'),
)
【讨论】:
现在我使用这种方法进行了一些修改,如我的编辑中所述。 (因为我的静态目录('static/')在我的应用程序目录('blogapp/')中)。它解决了我的问题(即使现在我和另一个 -_-)blogapp/
是否在此设置文件的父目录中? blogapp,
似乎更有可能与设置文件位于同一目录中,这意味着您应该加入 blogapp/
而不是 ../blogapp
。
appheroku/ 包含 monblog/ 目录、 blogapp/ 目录和 staticfiles 目录。 blogapp/ 目录包含 models.py 文件、views.py 文件、admin.py、..(等)和 static/ 目录。 monblog/ 目录包含 settings.py、urls.py 等...【参考方案3】:
对于像我一样进来的人:
就像@eliotk 暗示的那样,
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
STATIC_ROOT= os.path.join(PROJECT_DIR,'staticfiles/')
STATICFILES_DIRS = ()
这是您要避免FileNotFoundError: [Errno 2] No such file or directory:
错误或OSError: [Errno 30] Read-only file system:
错误的配置。
【讨论】:
以上是关于Django heroku 静态目录的主要内容,如果未能解决你的问题,请参考以下文章