【问题标题】:Multiple django sites on Apache / Windows / mod_wsgi - problem with win32Apache / Windows / mod_wsgi 上的多个 django 站点 - win32 的问题
【发布时间】:2011-08-23 14:28:40
【问题描述】:

我有两个使用同一个数据库并共享一些代码的 django 站点。主要的父站点是员工和承包商的外联网,而第二个站点将一些数据公开给我们的一些合作伙伴。

我已设法设置站点以使其正常工作,但发现如果我启动 Apache 并进入主站点,则合作伙伴站点将无法运行,并返回“内部服务器错误”。如果我重新启动并进入合作伙伴站点,那么主站点将无法运行。

所以我猜他们是在资源上发生冲突。

服务器日志(见底部)显示这是 win32/lib/pywintypes.py 模块的问题,第 114 行。在其他地方,建议注释掉这些行(见下文)。所以我试过这个并且它有效。

我真的不明白代码中发生了什么以及将其注释掉是否会在以后给我带来问题。所以问题是:

是否还有其他原因可能导致此问题?这种软糖“安全”吗?

# py2k and py3k differences:
# On py2k, after doing "imp.load_module('pywintypes')", sys.modules
# is unchanged - ie, sys.modules['pywintypes'] still refers to *this*
# .py module - but the module's __dict__ has *already* need updated
# with the new module's contents.
# However, on py3k, sys.modules *is* changed - sys.modules['pywintypes']
# will be changed to the new module object.
# SO: * on py2k don't need to update any globals.
#     * on py3k we update our module dict with the new module's dict and
#       copy its globals to ours.
old_mod = sys.modules[modname]
# Python can load the module
mod = imp.load_dynamic(modname, found)
# Check the sys.modules[] behaviour we describe above is true...
if sys.version_info < (3,0):
    #The fudge bit !!!!!!!!!!!!!!!!!
    #assert sys.modules[modname] is old_mod 
    #assert mod is old_mod
    pass
else:
    assert sys.modules[modname] is not old_mod
    assert sys.modules[modname] is mod
    # as above - re-reset to the *old* module object then update globs.
    sys.modules[modname] = old_mod
    globs.update(mod.__dict__)

追溯

    mod_wsgi (pid=7164): Exception occurred processing WSGI script 'E:/Programming/django_site/extranet_site/apache/django.wsgi'.
Traceback (most recent call last):              
File "C:\\Python26\\lib\\site-packages\\django\\core\\handlers\\wsgi.py", line 241, in __call__
    response = self.get_response(request)
File "C:\\Python26\\lib\\site-packages\\django\\core\\handlers\\base.py", line 73, in get_response              
        response = middleware_method(request)               
ile "C:\\Python26\\lib\\site-packages\\django\\contrib\\sessions\\middleware.py", line 10, in process_request               
        engine = import_module(settings.SESSION_ENGINE)             
File "C:\\Python26\\lib\\site-packages\\django\\utils\\importlib.py", line 35, in import_module             
        __import__(name)                
File "C:\\Python26\\lib\\site-packages\\django\\contrib\\sessions\\backends\\db.py", line 2, in <module>                
    from django.contrib.sessions.models import Session              
File "C:\\Python26\\lib\\site-packages\\django\\contrib\\sessions\\models.py", line 4, in <module>              
    from django.db import models                
File "C:\\Python26\\lib\\site-packages\\django\\db\\models\\__init__.py", line 12, in <module>              
    from django.db.models.fields.files import FileField, ImageField             
File "C:\\Python26\\lib\\site-packages\\django\\db\\models\\fields\\files.py", line 8, in <module>              
        from django.core.files.storage import default_storage               
File "C:\\Python26\\lib\\site-packages\\django\\core\\files\\storage.py", line 7, in <module>               
    from django.core.files import locks, File               
File "C:\\Python26\\lib\\site-packages\\django\\core\\files\\locks.py", line 25, in <module>                
    import pywintypes               
File "C:\\Python26\\lib\\site-packages\\win32\\lib\\pywintypes.py", line 124, in <module>               
    __import_pywin32_system_module__("pywintypes", globals())               
File "C:\\Python26\\lib\\site-packages\\win32\\lib\\pywintypes.py", line 114, in __import_pywin32_system_module__               
    assert sys.modules[modname   is old_mod         
AssertionError              

【问题讨论】:

    标签: django apache mod-wsgi pywin32


    【解决方案1】:

    安装 pywin32 #212 解决了这个问题。

    【讨论】:

      【解决方案2】:

      删除 pywin32 并使用后它对我有用 WSGIScriptAlias "/aliasname" "c:/wamp/www/project/django.wsgi" 在 httpd.config 也为第一个参数使用引号。

      【讨论】:

        【解决方案3】:

        我在版本 217 上遇到了这个问题,但我需要 pywin32。从这里https://stackoverflow.com/a/10928148/80516 实施修复似乎有效。

        错误已报告,但未解决:

        https://sourceforge.net/tracker/?func=detail&aid=2905909&group_id=78018&atid=551954

        临时解决办法是注释掉两行 win32/lib/pywintypes.py:

        if sys.version_info < (3,0):
            #next two lines are problematic!!!!!
            #assert sys.modules[modname] is old_mod 
            #assert mod is old_mod
            pass
        else:
            assert sys.modules[modname] is not old_mod
            assert sys.modules[modname] is mod
            # as above - re-reset to the *old* module object then update globs.
            sys.modules[modname] = old_mod
            globs.update(mod.__dict__)
        

        【讨论】:

          【解决方案4】:

          我遇到了同样的问题(使用 Python 2.7、Django 1.4.1、Apache 2.2、mod_wsgi 3.3)并通过删除 pywin32(ver.217)解决了这个问题。 Django 尝试从 pywin32 导入,但似乎不需要它。如果您在 Django 站点中需要 pywin32,这不是您的答案,但我只是安装了它并没有使用它。

          编辑:我实际上在我的网站上使用 virtualenv,但我的主要 Python 正在泄漏。如果您在某些方面确实需要 pywin32,请使用 virtualenv,并阅读有关 mod_wsgi 和虚拟环境的此 wiki 页面:

          VirtualEnvironments - mod_wsgi

          【讨论】:

            【解决方案5】:

            在我的情况下,仅在 httpd.conf 中添加引号(如 kiran.gilvaz 所建议)就足以解决问题。我没有删除 pywin32(pywin32 是 218 版)。

            【讨论】:

              猜你喜欢
              • 2012-08-21
              • 1970-01-01
              • 2014-07-25
              • 2021-01-15
              • 2011-05-24
              • 2011-06-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多