Python从wsgi导入失败的问题解决方法

Written by

in

文章目录
  • 问题的原因是Python从wsgi导入失败,可能是因为以下原因: myapp.routing模块没有被正确导入。 myapp.routing模块没有被正确定义。
  • 目录
    • 解决方案
      • 方法一:
      • 方法二:

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

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

    myapp文件夹中的应用程序文件(routing.py)如下:

    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
    

    问题的原因是Python从wsgi导入失败,可能是因为以下原因:

    • myapp.routing模块没有被正确导入。
    • myapp.routing模块没有被正确定义。

    第一个答案中给出的解决方案是:

    • 直接导入routing模块,而不是myapp.routing模块。
    • 将application定义为一个函数,而不是一个模块。

    代码示例:

    # myapp.wsgi
    import sys
    sys.path.insert(0, '/var/www/myapp')
    
    from routing import app as application
    
    # routing.py
    def app(environ, start_response):
        app.debug = 'True'
        app.run()
    

    第二个答案中给出的解决方案是:

    • 使用site.addsitedir()函数将myapp目录添加到Python的包路径中。
    • 使用sys.path[:] = new_sys_path将新路径放在Python的包路径的前面。

    代码示例:

    # myapp.wsgi
    ALLDIRS = ['/var/www/myapp/']
    
    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.

     到此这篇关于Python从wsgi导入失败的问题解决方法的文章就介绍到这了,更多相关Python wsgi导入失败内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • Python Web开发通信协议WSGI uWSGI uwsgi使用对比全面介绍
    • Python安装和配置uWSGI的详细过程
    • 通过Python中的CGI接口讲解什么是WSGI
    • django生产环境搭建(uWSGI+django+nginx+python+MySQL)
    • Python WSGI 规范简介
    • 浅析Python 中的 WSGI 接口和 WSGI 服务的运行
    • Docker构建python Flask+ nginx+uwsgi容器
    • python web框架 django wsgi原理解析
    • Python开发之Nginx+uWSGI+virtualenv多项目部署教程

    站内搜索