将Django部署到用户目录
我想把我的Django小项目部署到我们的学生服务器上。我们有apache2,并且启用了UserDir模块,但我没有权限访问apache2的配置文件。我该怎么部署呢?:-D
我之前是做PHP的,部署PHP脚本的方法是把它们上传到我的public_html
目录,然后一切就会在http://ourserver.com/~myusername上显示出来。我看了Django的文档,上面说我应该在apache的配置文件中添加<Location>一些内容</Location>
。但我没有权限去修改这个文件,所以我尝试把它放在public_html
目录下的.htaccess文件里,但这样也不行。我在网上查了很多资料,似乎看到过说不能在.htaccess里放<Location>
,但现在找不到那个说法了。
所以,有没有人能告诉我,怎么在不打扰apache管理员的情况下,把Django部署到UserDir上呢?
补充:我按照Graham Dumpleton的建议测试了mod_python,发现可以正常使用。此外,我找到了错误日志,下面是当我把<Location>一些内容</Location>
放进.htaccess时,错误日志里显示的内容:
"[Thu Oct 01 21:33:19 2009] [alert] [client 188.129.74.66] /path/to/my/.htaccess: <Location not allowed here"
所以,看起来我真的不能把<Location>
放进.htaccess里。那么,我还有什么选择呢?
5 个回答
你试过用 <Directory>
代替 <Location>
吗?如果本地政策没有阻止你,这样做应该没问题:
<Directory /path/to/your/home/public_html>
# mod_python stuff here
</Directory>
如果你和管理员关系不错,我建议你使用 mod_wsgi
或 fastcgi
。如果是这样的话,你只需要把 mod_wsgi
的配置给你的管理员就行,因为它支持基于更新的重载和以其他用户身份运行。他应该能设置好,让它在你的账户下运行一个单独的 wsgi 文件,可能还需要加上 allow from all
,具体要看安全设置是怎么配置的:
<Directory /home/you/public_html>
WSGIApplicationGroup PROJECT
WSGIDaemonProcess YOU threads=15 processes=2 python-path=/home/YOU/.virtualenvs/PROJECT-env/lib/python2.6/site-packages
WSGIProcessGroup YOUR_GROUP
WSGIScriptAlias / /home/YOU/PROJECT/deploy/PROJECT.wsgi
</Directory>
顺便说一下,上面的内容假设你使用了非常棒、强烈推荐的 virtualenv 和 virtualenvwrapper,这样可以在你的主目录下创建一个本地的 Python 沙箱。这会大大简化你作为非管理员用户的工作,或者当你有多个项目时。如果你不使用 virtualenv,上面的 python-path
可以完全去掉。
你的基础Apache服务器上有没有开启mod_python
或mod_wsgi
?这两个模块至少要开启其中一个。
如果你安装了mod_python,首先要看看你能否在不需要管理员干预的情况下使用它。可以参考这个链接:
http://www.dscpl.com.au/wiki/ModPython/Articles/GettingModPythonWorking
除非你是受信任的用户,或者管理员不太懂,否则他们不应该让你使用mod_python。因为你的代码会以Apache用户的身份运行,如果其他人也以同样的方式运行应用程序,你们的应用和数据可能会互相干扰。换句话说,这样做不安全,不应该在多个用户共享同一个Apache环境的情况下使用。
更新 1
假设你现在已经让mod_python正常工作,你应该可以把mptest.py的内容替换成类似下面的代码:
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
import sys
sys.path.insert(0, '/some/path/to/project/area/mysite')
sys.path.insert(0, '/some/path/to/project/area')
from django.core.handlers.modpython import handler as _handler
def handler(req):
req.get_options()['django.root'] = '/~myusername/mptest.py'
return _handler(req)
显然,里面的路径和数值需要根据你的命名进行更改。
这个网站的访问地址是'/~myusername/mptest.py'。
到这里你会发现,使用mod_python的一个傻逼之处在于你无法控制Apache。这是因为当你在自己的网站上修改代码时,你需要请求管理员重启Apache,才能让你的更改生效。
如果使用mod_wsgi的守护进程模式,并且你是这个进程的拥有者,那会好很多。但如果他们已经在运行mod_python,我不建议同时加载这两个模块,因为mod_python的问题可能会影响mod_wsgi的使用。如果他们没有正确安装Python,你可能会遇到很多问题,所以这样做不值得。
总之,在你无法控制Apache的共享主机环境中使用mod_python是傻的,而且不安全。
尽管如此,我还是记录了如何在每个用户目录下运行Django,因为我认为之前没有人记录过这个。