将Django部署到用户目录

0 投票
5 回答
1754 浏览
提问于 2025-04-15 14:40

我想把我的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 个回答

0

你试过用 <Directory> 代替 <Location> 吗?如果本地政策没有阻止你,这样做应该没问题:

<Directory /path/to/your/home/public_html>
# mod_python stuff here
</Directory>

如果你和管理员关系不错,我建议你使用 mod_wsgifastcgi。如果是这样的话,你只需要把 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>

顺便说一下,上面的内容假设你使用了非常棒、强烈推荐的 virtualenvvirtualenvwrapper,这样可以在你的主目录下创建一个本地的 Python 沙箱。这会大大简化你作为非管理员用户的工作,或者当你有多个项目时。如果你不使用 virtualenv,上面的 python-path 可以完全去掉。

0

你的基础Apache服务器上有没有开启mod_pythonmod_wsgi?这两个模块至少要开启其中一个。

1

如果你安装了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,因为我认为之前没有人记录过这个。

撰写回答