0

I would like to host my Flask API in sub-directory on IIS.

MYLAPTOP (IIS Server)
|
|____Sites
     |
     |____Default Web Site (Website)
          |
          |____service (Virtual Directory)
               |
               |____payrollapi (Application)

The URL for the payrollapi is http://localhost/service/payrollapi/

I configured the wfastcgi and and FastCGI settings

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <handlers>
            <add name="FlaskHandler" path="*" verb="*" modules="FastCgiModule" scriptProcessor="c:\annaconda\envs\payroll\python.exe|c:\annaconda\envs\payroll\lib\site-packages\wfastcgi.py" resourceType="Unspecified" />
        </handlers>
    </system.webServer>
    <appSettings>
        <add key="WSGI_HANDLER" value="payroll.app" />
        <add key="PYTHONPATH" value="C:\inetpub\wwwroot\service\payrollapi" />
    </appSettings>
</configuration>

Flask API Script:

from flask import Flask
app = Flask(__name__)

@app.route("/", methods=['GET', 'POST'])
def notes_list():
    return "Welcome to Payroll !"


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

It returns the error code "HTTP Error 403.18 - Forbidden" while on trying to access the API method.

I tried with URL Rewrite also but there is no use

<system.webServer>
  <directoryBrowse enabled="true" />
  <rewrite>
     <rules>
        <rule name="Reverse Proxy to payroll" stopProcessing="true">
            <match url="^service/payrollapi/(.*)" />
            <action type="Rewrite" url="http://localhost:5500/service/payrollapi/{R:1}" />
        </rule>
     </rules>
  </rewrite>

Kindly assist me how to deploy the Flask application in Sub-direcory / sub-application in a website.

Sreedharan
  • 83
  • 1
  • 3
  • 8

1 Answers1

0

With the code below, the app responds on: http://127.0.0.1:5000/service/payrollapi/

Code (slightly modified) from this answer: https://stackoverflow.com/a/36033627/3845545

from flask import Flask

class PrefixMiddleware(object):

    def __init__(self, app, *prefix):
        self.app = app
        self.prefixes = []

        for i in prefix:
            self.prefixes.append(i)


    def __call__(self, environ, start_response):

        for i in self.prefixes:
            if environ['PATH_INFO'].startswith(i):
                environ['PATH_INFO'] = environ['PATH_INFO'][len(i):]
                environ['SCRIPT_NAME'] = i
                return self.app(environ, start_response)

        start_response('404', [('Content-Type', 'text/plain')])
        return ["This url does not belong to the app.".encode()]

app = Flask(__name__)
app.wsgi_app = PrefixMiddleware(app.wsgi_app, '/service/payrollapi')

@app.route("/", methods=['GET', 'POST'])
def notes_list():
    return "Welcome to Payroll !"

if __name__ == "__main__":
    app.run(debug=True)
Nuit
  • 11
  • 1