我正在尝试从默认网站下的IIS Web应用程序提供Flask应用程序,但无法使其正常工作。以下是详细信息:
OS: Windows Server 2016 DataCenter Edition
IIS: Installed with all options including CGI
IIS Rewrite Module: Version 2 installed
我采取的步骤:
PATH
变量pip install wfastcgi
wfastcgi-enable
pip install flask
iisreset
C:\inetpub\wwwroot\flask-demo
Convert to Application
以获取上述目录。C:\inetpub\wwwroot\flask-demo\myapp.py
:from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, World!' if __name__ == "__main__": app.run()
C:\inetpub\wwwroot\flask-demo\web.config
:<configuration> <system.webServer> <handlers> <remove name="Python FastCGI" /> <add name="Python FastCGI" path="*" verb="*" modules="FastCgiModule" scriptProcessor="C:\Python27\python.exe|C:\Python27\Lib\site-packages\wfastcgi.pyc" resourceType="Unspecified" requireAccess="Script" /> </handlers> <rewrite> <rules> <rule name="asset-url-rewrite" stopProcessing="true"> <match url="static" /> <conditions> </conditions> <action type="Rewrite" url="flask-demo/{R:0}" /> </rule> <rule name="app-url-rewrite" stopProcessing="true"> <match url="[a-zA-Z]+" /> <conditions> </conditions> <action type="Rewrite" url="flask-demo/" /> </rule> </rules> </rewrite> </system.webServer> <appSettings> <add key="WSGI_HANDLER" value="myapp.app" /> <add key="PYTHONPATH" value="C:\inetpub\wwwroot\flask-demo" /> </appSettings> </configuration>
问题
当我尝试以http://localhost/flask-demo
方式访问网页时,我获得了404.但如果我将myapp.py
中的第二行从@app.route('/')
更改为@app.route('/flask-demo')
flask-demo
是放置Python文件的IIS Web应用程序的名称,它可以工作。
我希望在没有编写放置Python烧瓶应用程序的IIS Web应用程序的flask-demo
/名称的情况下提供Python网页。我无法做到这一点。
我尝试使用app.config['APPLICATION_ROOT'] = '/flask-demo'
,但它没有用。
让这项工作最好的方法是什么?随后的文章https://medium.com/@bilalbayasut/deploying-python-web-app-flask-in-windows-server-iis-using-fastcgi-6c1873ae0ad8,但它没有帮助。
答案 0 :(得分:0)
网址包含flask-demo
,因此Flask看到它并且使用它是正常的。
有一些解决方法,例如:
Add a prefix to all Flask routes(在此网站上)。
一般来说:你想要什么? URL比底层技术重要得多(URL也应该是稳定的,当你改变实现时也是如此)。我建议不要在URL中使用flask-demo
(并且从不使用测试和演示的东西,不管怎么说,不幸的是,演示是永久保留的)。所以我会修改ISS,以便将所有动态页面重定向到flask-demo
。
答案 1 :(得分:0)
经过多次尝试,我已经联系了以下解决方案。
解决方案警告
这假设Python应用程序仅在IIS网站的第一个深度级别托管。以下解决方案不支持二级部门。
新myapp.py
from flask import Flask
import os
app = Flask(__name__)
ROOT_PREFIX = '/' + os.path.dirname(os.path.realpath(__file__)).rsplit('\\', 1)[-1]
@app.route(ROOT_PREFIX + '/')
def hello_world():
return 'Hello, World!'
if __name__ == "__main__":
app.run()
新建web.config
<configuration>
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
<add name="Python FastCGI"
path="*"
verb="*"
modules="FastCgiModule"
scriptProcessor="C:\Python27\python.exe|C:\Python27\Lib\site-packages\wfastcgi.pyc"
resourceType="Unspecified"
requireAccess="Script" />
</handlers>
</system.webServer>
<appSettings>
<add key="WSGI_HANDLER" value="myapp.app" />
<add key="PYTHONPATH" value="C:\inetpub\wwwroot\flask-demo" />
</appSettings>
</configuration>