本站首页    管理页面    写新日志    退出


«October 2025»
1234
567891011
12131415161718
19202122232425
262728293031


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7627021
建立时间:2006年5月29日




[Django]如何在 mod_python 环境中使用Django
软件技术

lhwork 发表于 2007/1/31 15:32:21

:翻译: 马踏飞燕:联系: honeyday.mj@gmail.com:版本: 0.9:Django版本: 0.95:主页: http://www.honeyday.org:版权: FDL.. contents:: 目录.. section-numbering::Apache_ 配合 `mod_python`_ 目前是Django生产服务器的首选配置。mod_python和 `mod_perl`_ 很象: 它把python嵌入Apache并且在服务器启动的时候加载Python代码。在整个Apache进程的生命期中,代码一直保存在内存里。这对服务器的性能有着很大的提高。Django 使用 Apache 2.x 和 mod_python 3.x, 并且你应该使用 Apache's`prefork MPM`_, 而不是 `worker MPM`_.你可能也对 `如何在FastCGI环境中使用Django`_ 感兴趣。.. _Apache: http://httpd.apache.org/.. _mod_python: http://www.modpython.org/.. _mod_perl: http://perl.apache.org/.. _prefork MPM: http://httpd.apache.org/docs/2.2/mod/prefork.html.. _worker MPM: http://httpd.apache.org/docs/2.2/mod/worker.html.. _如何在FastCGI环境中使用Django: http://www.djangoproject.com/documentation/fastcgi/基本配置===================为了在mod_python上配置django,首先要保证你已经安装了Apache并且已经激活了mod_python模块。接下来编辑 ``httpd.conf`` 并加入下面的内容::    <Location "/mysite/">        SetHandler python-program        PythonHandler django.core.handlers.modpython        SetEnv DJANGO_SETTINGS_MODULE mysite.settings        PythonDebug On    </Location>...用你实际的django的setting文件的路径替换 ``mysite.settings`` 。这告示Apache:“对所有的 '/mysite/' 下面的URL使用mod_python来处理,使用Django的mod_python处理器”。它传入了 ``DJANGO_SETTINGS_MODULE`` 参数,这样mod_python就知道应该使用那个配置文件了。同时,如果你手工修改 ``PYTHONPATH`` 来指向你的Django项目的路径,你需要如下写::    PythonPath "['/path/to/project'] + sys.path"你还可以加一条 ``PythonAutoReload Off`` 指令来提高效率。更多配置选项请参考 `mod_python documentation`_ .注意,你应该为生产服务期设置 ``PythonDebug Off`` 。如果你保留 ``PythonDebug On`` 的话,当mod_python报错的话你将看到一大堆难看的python traceback信息。重启Apache,接下来所有请求在/mysite/下面和其子目录下面的内容都将由Django来服务。注意,Django的URLconf不会去掉"/mysite/" -- 他们获取的是完整的URL。在mod_python上部署Django站点的时候,当你每次修改Python代码之后需要重启Apache来使之生效。在同一个Apache上配置多个Django站点================================================在同一个Apache实例上运行多个Django站点是完全可能的。使用 ``VirtualHost`` 就可以了,如下::    NameVirtualHost *    <VirtualHost *>        ServerName www.example.com        # ...        SetEnv DJANGO_SETTINGS_MODULE mysite.settings    </VirtualHost>    <VirtualHost *>        ServerName www2.example.com        # ...        SetEnv DJANGO_SETTINGS_MODULE mysite.other_settings    </VirtualHost>如果你需要将2个Django站点放到同一个 ``VirtualHost`` 中的话,你需要为每一个Django指定不同的解释器,这是为了避免mod_python的缓存互相干扰。使用 ``PythonInterpreter`` 指令来为每一个不同的 ``<Localtion>`` 来指定不同的解释器::    <VirtualHost *>        ServerName www.example.com        # ...        <Location "/something">            SetEnv DJANGO_SETTINGS_MODULE mysite.settings            PythonInterpreter mysite        </Location>        <Location "/otherthing">            SetEnv DJANGO_SETTINGS_MODULE mysite.other_settings            PythonInterpreter mysite_other        </Location>    </VirtualHost>``PythonInterpreter`` 的值是什么都无所谓的,只要保证他们在2个 ``Location`` 区段中是互不相同的就行了。用 mod_python 建立开发服务器============================如果你想把mod_python作为你的开发服务期,为了避免经常重启Apache,你只要在 ``httpd.conf`` 设定 ``MaxRequestsPerChild 1`` 就可以了。这样的设定将强迫Apache在每一次请求到来的时候都重新加载一切内容。但是绝对不要对一个生产服务器作这个事情,否则我们将收回你的Django权限。如果你是一个喜欢使用 ``print`` 语句来调试程序的程序员的话,请注意, ``print`` 语句在mod_python中不起作用,它不会像你期望的那样在Apache的log文件中输出内容。如果你确实需要在mod_python中打印出调试信息,可以用下面的方法::    assert False, the_value_i_want_to_see或者将调试信息加入到你的页面模板中。.. _mod_python documentation: http://modpython.org/live/current/doc-html/directives.html提供媒体文件服务================Django本身不提供媒体文件的服务,它将这个工作交给了你选择的Web服务器了。我们建议使用分开的Web服务器来做这件事,例如提供媒体文件服务的服务器没有运行着Django。下面是一些好的选项:* `lighttpd`_* `TUX`_* A stripped-down version of `Apache`_然而,如果没有别的选择,必须在同一个Apache的  ``VirtualHost`` 里面提供媒体文件服务的话,可以用下面的语句来关闭mod_python的处理::    <Location "/media/">        SetHandler None    </Location>只要修改 ``Location`` 为你的问题文件的根目录即可。你还可以使用 ``<LocationMatch>`` 来匹配一个正则表达式。下面的例子配置Django站点为根目录,但是明确的对 ``modia`` 子目录和所有以 ``.jpg``, ``.gif`` 和 ``.png`` 结尾的URL不使用Django来处理::    <Location "/">        SetHandler python-program        PythonHandler django.core.handlers.modpython        SetEnv DJANGO_SETTINGS_MODULE mysite.settings    </Location>    <Location "media">        SetHandler None    </Location>    <LocationMatch "\.(jpg|gif|png)$">        SetHandler None    </LocationMatch>.. _lighttpd: http://www.lighttpd.net/.. _TUX: http://en.wikipedia.org/wiki/TUX_web_server.. _Apache: http://httpd.apache.org/提供admin文件服务=======================Django开发服务器已经被自动配置为提供admin界面的媒体文件的服务,但是当你使用任何其他服务器的时候就不是这样了。你必须设置Apache或其他的媒体服务器来为admin的媒体文件提供服务。admin的文件在 (``django/contrib/admin/media``) 下面。这里推荐2个方法:    1. 在你的documentroot目录下创建一个指向admin媒体目录的符号链接。       这个做法的好处就是你的Django本身的文件都在原来的位置上,你可以       svn更新你的django代码等。    2. 或者将admin的媒体文件复制到apache的documentroot目录下面。错误处理==============当使用Apache/mod_python的时候,错误将被Django捕获,也就是说他们不会传播到Apache层面也就不会出现在Apache的 ``error_log`` 里面。当出现异常的时候,可能是Django内部出现了问题。在这种情况下,你将看到一个“内部服务器错误”的信息,并且在Apache的 ``error_log`` 里面有一个完整的traceback信息。这个信息被分成许多行存储在 ``error_log`` 中。(是的,它非常难看也很难阅读,但这就是mod_python做出来的事情。)如果配置出错===============================如果Apache出现了segmentation错误的话,这可能有2种原因,但是任何一个原因都与Django本身无关。    1. 可能是你的Python代码导入了"pyexpat"这个模块,这个模块与Apache内置的版本有冲突。       更详细的信息请参考 `Expat Causing Apache Crash`_.    2. 可能是你在同一个Apache里面同时运行了mod_python和mod_php,并且都以mysql作为后端数据库。       在某些情况下,可能会由于PHP与Python的MySQL后端的冲突所致。       更多信息请参考 `mod_python FAQ entry`_.如果你在设置mod_python的时候还有问题,那么最好是先配置一个完全单独的mod_python环境,并且可以运行的。这样可以较容易的判断出mod_python的问题。可以看 `Getting mod_python Working`_下一步就是编写一个测试代码,并导入一些Django特有的模块,例如你的视图、模型、URLconf等等。把这些代码放到测试文件中,然后用浏览器访问,如果程序崩溃,你就可以判断是因为导入Django代码导致的问题。通常的做法是减少导入的模块的数量,直到崩溃停止,这样就可以找出导致崩溃的特别的模块了。必要的话还可以进入那个模块,看看它导入的其他模块是不是有问题。.. _Expat Causing Apache Crash: http://www.dscpl.com.au/articles/modpython-006.html.. _mod_python FAQ entry: http://modpython.org/FAQ/faqw.py?req=show&file=faq02.013.htp.. _Getting mod_python Working: http://www.dscpl.com.au/articles/modpython-001.html


阅读全文(3266) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144792781 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号