django-admin.py 和在 Dotcloud 上正确更改 PYTHONPATH 的方法?

0 投票
2 回答
887 浏览
提问于 2025-04-17 19:01

我没有一个 manage.py 文件,而是使用不同的设置来切换开发和生产环境,分别通过 DJANGO_SETTINGS_MODULEdjango-admin.py。这是 Django 文档和 pydanny 在《2 Scoops of Django》一书中推荐的做法。

我的项目放在 /home/dotcloud/current/bipolar 这个路径下。我的设置文件在 /home/dotcloud/current/bipolar/bipolar/settings/dotcloud.py,这是按照 Django 1.5 的目录结构来的。DJANGO_SETTINGS_MODULEdotcloud.yml 文件中设置为 bipolar.settings.dotcloud

我在使用 Dotcloud 时遇到了一些麻烦。当我只是跟着示例教程走的时候,我已经需要在 postinstall 脚本中添加一行 export PYTHONPATH=/home/dotcloud/current/(hellodjango|bipolar):$PYTHONPATH

当我用 supervisor 启动 celery 的时候,事情变得更加复杂。我试着运行命令 django-admin.py celery worker。但是无论我怎么设置 PYTHONPATH/home/dotcloud/current/bipolar,它都没有被识别。我尝试了以下两种方法:

command = "PYTHONPATH=/home/dotcloud/current/bipolar:$PYTHONPATH django-admin.py celery worker --loglevel=INFO -E"

还有

environment=PYTHONPATH="/home/dotcloud/current/bipolar"

在 supervisord.conf 文件中都没有效果。我还尝试把这些内容放到一个 shell 脚本中,在运行之前设置路径……这在 postinstall 时是有效的!而且在 shell 中运行时也能正常工作,但在机器部署后就不行了。

所以,任何帮助都非常欢迎!

补充:我尝试了很多方法。我重新添加了一个 manage.py 文件,它同时设置了正确的 sys.pathDJANGO_SETTINGS_MODULE,但还是没有效果。最后,我添加了一个 python-worker 服务,但除了失败的次数增加了两倍外,没有任何成效(supervisord.conf 在两个服务中都被读取,对吧?)。

2 个回答

0

我知道这样做可能不行,但你试过这个吗:

command = "cd /home/dotcloud/current/bipolar && django-admin.py celery worker --loglevel=INFO -E"
0

结果发现文档写错了。在supervisord.conf文件里,不能把directory = $HOME/current/这样写。你需要把它改成/home/dotcloud/current/,这样就没问题了。

我还是没法让django-admin.py正常工作;我猜它是用虚拟环境外的Python来调用的。我觉得manage.py有点不太好用;有没有更好的方法呢?

这是我能用的supervisord.conf

[program:celery_beat]
directory = /home/dotcloud/current/bipolar/
stderr_logfile = /var/log/supervisor/%(program_name)s_error.log
stdout_logfile = /var/log/supervisor/%(program_name)s.log
command = /home/dotcloud/env/bin/python manage.py celery beat --loglevel=INFO

[program:celery_worker]
directory = /home/dotcloud/current/bipolar/
stderr_logfile = /var/log/supervisor/%(program_name)s_error.log
stdout_logfile = /var/log/supervisor/%(program_name)s.log
command = /home/dotcloud/env/bin/python manage.py celery worker -E --loglevel=INFO

撰写回答