【问题标题】:Import python from wsgi fails从 wsgi 导入 python 失败
【发布时间】:2013-03-15 08:12:50
【问题描述】:

我在 apache2/flask 服务器上有一个文件夹结构:

/var/www/myapp
/var/www/myapp/routing.py
/var/www/myapp/__init__.py
/var/www/wsgi-scripts/myapp.wsgi

我的应用文件(routing.py)在myapp中,如下:

from flask import Flask, render_template
app = Flask(__name__)


@app.route('/')
def welkom():
    return render_template('welkom.html')


if __name__ == '__main__':
    app.debug = 'True'
    app.run()

我在 wsgi-scripts 中的 myapp.wsgi 是这样的:

import sys
sys.path.insert(0, '/var/www/myapp')
from myapp import routing as application

但是,当我加载页面时,这是在我的日志中:

[Fri Mar 15 08:06:32 2013] [error] [client 192.168.1.11] mod_wsgi (pid=23574): Target WSGI script '/var/www/wsgi-scripts/myapp.wsgi' cannot be loaded as Python module.
[Fri Mar 15 08:06:32 2013] [error] [client 192.168.1.11] mod_wsgi (pid=23574): Exception occurred processing WSGI script '/var/www/wsgi-scripts/myapp.wsgi'.
[Fri Mar 15 08:06:32 2013] [error] [client 192.168.1.11] Traceback (most recent call last):
[Fri Mar 15 08:06:32 2013] [error] [client 192.168.1.11]   File "/var/www/wsgi-scripts/myapp.wsgi", line 3, in <module>
[Fri Mar 15 08:06:32 2013] [error] [client 192.168.1.11]     import myapp.routing as application
[Fri Mar 15 08:06:32 2013] [error] [client 192.168.1.11] ImportError: No module named myapp.routing
[Fri Mar 15 08:06:32 2013] [error] [client 192.168.1.11] mod_wsgi (pid=23575): Target WSGI script '/var/www/wsgi-scripts/myapp.wsgi' cannot be loaded as Python module.
[Fri Mar 15 08:06:32 2013] [error] [client 192.168.1.11] mod_wsgi (pid=23575): Exception occurred processing WSGI script '/var/www/wsgi-scripts/myapp.wsgi'.
[Fri Mar 15 08:06:32 2013] [error] [client 192.168.1.11] Traceback (most recent call last):
[Fri Mar 15 08:06:32 2013] [error] [client 192.168.1.11]   File "/var/www/wsgi-scripts/myapp.wsgi", line 3, in <module>
[Fri Mar 15 08:06:32 2013] [error] [client 192.168.1.11]     import myapp.routing as application
[Fri Mar 15 08:06:32 2013] [error] [client 192.168.1.11] ImportError: No module named myapp.routing
[Fri Mar 15 08:06:33 2013] [error] [client 192.168.1.11] mod_wsgi (pid=23577): Target WSGI script '/var/www/wsgi-scripts/myapp.wsgi' cannot be loaded as Python module.
[Fri Mar 15 08:06:33 2013] [error] [client 192.168.1.11] mod_wsgi (pid=23577): Exception occurred processing WSGI script '/var/www/wsgi-scripts/myapp.wsgi'.
[Fri Mar 15 08:06:33 2013] [error] [client 192.168.1.11] Traceback (most recent call last):
[Fri Mar 15 08:06:33 2013] [error] [client 192.168.1.11]   File "/var/www/wsgi-scripts/myapp.wsgi", line 3, in <module>
[Fri Mar 15 08:06:33 2013] [error] [client 192.168.1.11]     import myapp.routing as application
[Fri Mar 15 08:06:33 2013] [error] [client 192.168.1.11] ImportError: No module named myapp.routing
[Fri Mar 15 08:06:33 2013] [error] [client 192.168.1.11] mod_wsgi (pid=23573): Target WSGI script '/var/www/wsgi-scripts/myapp.wsgi' cannot be loaded as Python module.
[Fri Mar 15 08:06:33 2013] [error] [client 192.168.1.11] mod_wsgi (pid=23573): Exception occurred processing WSGI script '/var/www/wsgi-scripts/myapp.wsgi'.
[Fri Mar 15 08:06:33 2013] [error] [client 192.168.1.11] Traceback (most recent call last):
[Fri Mar 15 08:06:33 2013] [error] [client 192.168.1.11]   File "/var/www/wsgi-scripts/myapp.wsgi", line 3, in <module>
[Fri Mar 15 08:06:33 2013] [error] [client 192.168.1.11]     import myapp.routing as application
[Fri Mar 15 08:06:33 2013] [error] [client 192.168.1.11] ImportError: No module named myapp.routing

WSGI 工作正常,我通过 testapp 验证了这一点。出了什么问题?

【问题讨论】:

  • 我相信你的文件应该是__init__.py而不是init.py,你的路径应该是/var/www/。或者你仍然可以使用/var/www/myapp/(忘记关于__init__.py的部分),但你必须只导入routing

标签: python apache2 flask mod-wsgi


【解决方案1】:

所以你打算从包myapp 中导入一个模块routing 并将其命名为application

  1. 这与您的结构不匹配。如果路径中有/var/www/myapp,则必须直接导入模块routing

  2. 应用程序不是模块,它是模块中定义的可调用对象。看来你必须做类似的事情

    def theapp(<don't remember the argumets by heart>):
        app.debug = 'True'
        app.run()
    

    然后wsgi脚本就可以了

    from routing import theapp as application
    

    但也许我在这里错了,你只需要这样做

    from routing import app as application
    

    因为我没有使用 Flask 的经验。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,用下面的 sn-p 解决了:

    ALLDIRS = ['/var/www/MarkerDB/']
    
    import sys 
    import site 
    
    # Remember original sys.path.
    prev_sys_path = list(sys.path) 
    
    # Add each new site-packages directory.
    for directory in ALLDIRS:
      site.addsitedir(directory)
    
    # Reorder sys.path so new directories at the front.
    new_sys_path = [] 
    for item in list(sys.path): 
        if item not in prev_sys_path: 
            new_sys_path.append(item) 
            sys.path.remove(item) 
    sys.path[:0] = new_sys_pat
    

    来源:http://code.google.com/p/modwsgi/wiki/VirtualEnvironments#Application_Environments

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-13
      相关资源
      最近更新 更多