无法从IIS Web应用程序

时间:2018-03-09 08:09:24

标签: python iis flask

我正在尝试从默认网站下的IIS Web应用程序提供Flask应用程序,但无法使其正常工作。以下是详细信息:

OS: Windows Server 2016 DataCenter Edition
IIS: Installed with all options including CGI
IIS Rewrite Module: Version 2 installed

我采取的步骤:

  1. 使用所有组件(使用CGI)安装IIS
  2. 安装Python 2.7.14
  3. PATH变量
  4. 中添加Python
  5. pip install wfastcgi
  6. wfastcgi-enable
  7. pip install flask
  8. iisreset
  9. 创建目录:C:\inetpub\wwwroot\flask-demo
  10. 点击IIS中的Convert to Application以获取上述目录。
  11. 使用以下内容创建C:\inetpub\wwwroot\flask-demo\myapp.py
  12. from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def hello_world():
        return 'Hello, World!'
    
    if __name__ == "__main__":
        app.run()
    
    1. 使用以下内容创建C:\inetpub\wwwroot\flask-demo\web.config
    2. <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,但它没有帮助。

2 个答案:

答案 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>