為IIS + wfastcgi + flask + python3.6 應用添加URL前綴

前言

筆者搭建環境 IIS + wfastcgi + flask + python3.6,因為flask作為主站的一個應用程序,故訪問諸如:http://localhost/flaskweb時,app.route('/')會發生404錯誤。

  • 網站結構
Site
  |-Appliction_via_aspnet
  |-Appliction_via_php
  |-flaskweb
    |-app.py
    |-web.config
  • app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return "Hello from FastCGI via IIS!"

@app.errorhandler(404)
def not_found(error):
    return "not found page"

if __name__ == "__main__":
    app.run()
  • web.config
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <handlers>
            <add name="Python FastCGI" path="*" verb="*" modules="FastCgiModule" scriptProcessor="C:\Python36\python.exe|C:\flaskweb\wfastcgi.py" resourceType="Unspecified" />
        </handlers>
    </system.webServer>
    <appSettings>
        <add key="WSGI_HANDLER" value="app.app" />   
        <add key="PYTHONPATH" value="D:\flaskweb" />
        <add key="WSGI_LOG" value="D:\flaskweb\web.log" />
    </appSettings>
</configuration>

解決方法出自Stack Overflow: https://stackoverflow.com/a/36033627
添加middleware解決 flask 的 url prefix / subpath 問題。

from flask import Flask

class PrefixMiddleware(object):

    def __init__(self, app, prefix=''):
        self.app = app
        self.prefix = prefix

    def __call__(self, environ, start_response):

        if environ['PATH_INFO'].startswith(self.prefix):
            environ['PATH_INFO'] = environ['PATH_INFO'][len(self.prefix):]
            environ['SCRIPT_NAME'] = self.prefix
            return self.app(environ, start_response)
        else:
            start_response('404', [('Content-Type', 'text/plain')])
            return ["This url does not belong to the app.".encode()]

prefix = '/flaskweb'  # 改成你需要的URL前綴
app = Flask(__name__)
app.wsgi_app = PrefixMiddleware(app.wsgi_app, prefix=prefix)

@app.route('/')
def index():
    return "Hello from FastCGI via IIS!"

@app.errorhandler(404)
def not_found(error):
    return "not found page"

if __name__ == "__main__":
    app.run()

以上

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容