Я ударил стену, развернув небольшое приложение Flask к Azure. Приложение работает нормально локально и на Heroku, но возвращает внутреннюю ошибку сервера на Azure. Здесь журнал:
logs.txt
StdErr:
2018-06-15 22:14:38.239395: Unhandled exception in wfastcgi.py: Traceback (most recent call last):
File "D:\home\python353x86\wfastcgi.py", line 791, in main
env, handler = read_wsgi_handler(response.physical_path)
File "D:\home\python353x86\wfastcgi.py", line 633, in read_wsgi_handler
handler = get_wsgi_handler(os.getenv("WSGI_HANDLER"))
File "D:\home\python353x86\wfastcgi.py", line 603, in get_wsgi_handler
handler = getattr(handler, name)
AttributeError: module 'app' has no attribute 'wsgi_app'
2018-06-15 22:14:38.255034: Running on_exit tasks
2018-06-15 22:14:38.270645: wfastcgi.py 3.0.0 closed
Кажется, что проблема связана с конфигурацией WSGI. Это мое первое развертывание Azure, и мне никогда не приходилось много думать о WSGI. В учебнике я использовал Green Unicorn на Heroku, где он был Procfile
в Procfile
requirements.txt
и в Procfile
:
PROCFILE
web: gunicorn app:app
requirements.txt
Flask==0.12.2
Flask-Cors==3.0.3
gunicorn==19.7.1
Однако Azure не использует Procfile, и мне непонятно, работает ли даже пулеметный огонь в среде Azure.
Мои вопросы:
wsgi_app = app.wsgi_app
строки под app
декларации, но это возвращает ошибку, которая приводит меня еще один кроличью нору: TypeError: wsgi_app() missing 2 required positional arguments: 'environ' and 'start_response'
Здесь остальная часть бэкэнда:
app.py
# Dependencies ------------------------
from flask import Flask
from flask_cors import CORS, cross_origin
from flask import render_template
from flask import request
import sqlite3
import json
import os
# Config ------------------------------
app = Flask(__name__)
CORS(app)
# Routes ------------------------------
@app.route("/")
def home():
# Do stuff
web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="WSGI_HANDLER" value="app.wsgi_app()" />
<add key="PYTHONPATH" value="D:\home\site\wwwroot" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
<add name="Python FastCGI" path="handler.fcgi" verb="*" modules="FastCgiModule"
scriptProcessor="D:\home\python353x86\python.exe| D:\home\python353x86\wfastcgi.py"
resourceType="Unspecified" requireAccess="Script" />
</handlers>
<rewrite>
<rules>
<rule name="Configure Python" stopProcessing="true">
<match url="(.*)" ignoreCase="false" />
<conditions>
<add input="{REQUEST_URI}" pattern="^/static/.*" ignoreCase="true" negate="true" />
</conditions>
<action type="Rewrite" url="handler.fcgi/{R:1}" appendQueryString="true" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
На данный момент я просто слепо копирую/вставляя возможные решения, поэтому я очень благодарен за любую помощь. Благодарю.
Попробуйте определить wsgi_app:
app = Flask(__name__)
# define for IIS module registration.
wsgi_app = app.wsgi_app
if __name__ == '__main__':
app.run()
TypeError: wsgi_app() missing 2 required positional arguments: 'environ' and 'start_response'
<add key="WSGI_HANDLER" value="my_app.wsgi_app()" />
на<add key="WSGI_HANDLER" value="my_app.wsgi_app" />
.