将 Flask App 部署到 Azure 时出现 WSGI 错误
Error with WSGI when deploying Flask App to Azure
我在使用 Flask 部署 Azure Web 时不断收到以下错误:
Unhandled exception in wfastcgi.py: Traceback (most recent call last):
File "D:\home\python364x64\wfastcgi.py", line 791, in main
env, handler = read_wsgi_handler(response.physical_path)
File "D:\home\python364x64\wfastcgi.py", line 633, in read_wsgi_handler
handler = get_wsgi_handler(os.getenv("WSGI_HANDLER"))
File "D:\home\python364x64\wfastcgi.py", line 603, in get_wsgi_handler
handler = getattr(handler, name)
AttributeError: module 'app' has no attribute 'app'
这是我的应用程序的结构:
|-app
|- __init__.py
|- mod1
|- mod2
|-config.py
|-runserver.py
|-web.config
这是我的 web.config 文件:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="WSGI_HANDLER" value="app.app"/>
<add key="PYTHONPATH" value="D:\home\site\wwwroot"/>
<add key="WSGI_LOG" value="D:\home\LogFiles\wfastcgi.log"/>
</appSettings>
<system.webServer>
<handlers>
<add name="PythonHandler" path="*" verb="*" modules="FastCgiModule" scriptProcessor="D:\home\python364x64\python.exe|D:\home\python364x64\wfastcgi.py" resourceType="Unspecified" requireAccess="Script"/>
</handlers>
</system.webServer>
</configuration>
config.py:
import os
app_dir = os.path.abspath(os.path.dirname(__file__))
class BaseConfig:
SECRET_KEY = os.environ.get('SECRET_KEY') or 'A SECRET KEY'
class DevelopementConfig(BaseConfig):
DEBUG = True
runserver.py:
import os
from app import db, create_app
app = create_app(os.getenv('FLASK_ENV') or 'config.DevelopementConfig')
if __name__ == '__main__':
app.run()
和 app.init.py:
from flask import Flask
def create_app(config):
app = Flask(__name__)
app.config.from_object(config)
return app
我尝试将 wsgi.py 包含在:
from app import app as application
与runserver.py处于同一级别,但仍然出现上述错误。我在这里错过了什么?
那么,WSGI 是如何工作的呢?它启动,导入您的应用程序并调用它的方法来处理请求。 <add key="WSGI_HANDLER" value="app.app"/>
对于 WSGI 意味着 导入模块 app 并从中获取变量 app。但是在导入你的 app.__init__.py 之后只有 Flask
和 create_app
变量,有 Flask-class 和 create_app-function。因此,您应该在 WSGI_HANDLER 中设置指向 Flask 应用程序的值,runserver.app
或 app.create_app()
(我不知道 Azure 如何使用正确的语法将应用程序作为函数处理,但它surely can).
我在使用 Flask 部署 Azure Web 时不断收到以下错误:
Unhandled exception in wfastcgi.py: Traceback (most recent call last):
File "D:\home\python364x64\wfastcgi.py", line 791, in main
env, handler = read_wsgi_handler(response.physical_path)
File "D:\home\python364x64\wfastcgi.py", line 633, in read_wsgi_handler
handler = get_wsgi_handler(os.getenv("WSGI_HANDLER"))
File "D:\home\python364x64\wfastcgi.py", line 603, in get_wsgi_handler
handler = getattr(handler, name)
AttributeError: module 'app' has no attribute 'app'
这是我的应用程序的结构:
|-app
|- __init__.py
|- mod1
|- mod2
|-config.py
|-runserver.py
|-web.config
这是我的 web.config 文件:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="WSGI_HANDLER" value="app.app"/>
<add key="PYTHONPATH" value="D:\home\site\wwwroot"/>
<add key="WSGI_LOG" value="D:\home\LogFiles\wfastcgi.log"/>
</appSettings>
<system.webServer>
<handlers>
<add name="PythonHandler" path="*" verb="*" modules="FastCgiModule" scriptProcessor="D:\home\python364x64\python.exe|D:\home\python364x64\wfastcgi.py" resourceType="Unspecified" requireAccess="Script"/>
</handlers>
</system.webServer>
</configuration>
config.py:
import os
app_dir = os.path.abspath(os.path.dirname(__file__))
class BaseConfig:
SECRET_KEY = os.environ.get('SECRET_KEY') or 'A SECRET KEY'
class DevelopementConfig(BaseConfig):
DEBUG = True
runserver.py:
import os
from app import db, create_app
app = create_app(os.getenv('FLASK_ENV') or 'config.DevelopementConfig')
if __name__ == '__main__':
app.run()
和 app.init.py:
from flask import Flask
def create_app(config):
app = Flask(__name__)
app.config.from_object(config)
return app
我尝试将 wsgi.py 包含在:
from app import app as application
与runserver.py处于同一级别,但仍然出现上述错误。我在这里错过了什么?
那么,WSGI 是如何工作的呢?它启动,导入您的应用程序并调用它的方法来处理请求。 <add key="WSGI_HANDLER" value="app.app"/>
对于 WSGI 意味着 导入模块 app 并从中获取变量 app。但是在导入你的 app.__init__.py 之后只有 Flask
和 create_app
变量,有 Flask-class 和 create_app-function。因此,您应该在 WSGI_HANDLER 中设置指向 Flask 应用程序的值,runserver.app
或 app.create_app()
(我不知道 Azure 如何使用正确的语法将应用程序作为函数处理,但它surely can).