I’ve been experimenting with Caddy and gunicorn for running multiple python apps under subdirectories. The idea is to them running in subdirectories
e.g.
website
|- /app1/ → gunicorn → flask
|- /app2/ → gunicorn → flask
To do this I just set up a proxy directive according to the following:
proxy /gunicorn/ unix:/var/www/python/gunicorn/hello.sock {
transparent
header_upstream SCRIPT_NAME /gunicorn
}
This works pretty well but I’ve discovered that because of the rewriting of trailing slashes all routes must use a trailing slash e.g. /page2/ otherwise gunicorn errors out with parsing the request. This is not a huge deal but it would be nice to have the option or in some way be able to use /page2 instead.
I’ve tried a few other combinations of just /gunicorn as the proxy path and also using the ‘without’ parameter but the above seems to be the only combination that works.
For interested parties who’d like to recreate the issue, the actual test Flask app is as simple as it gets.
Omitting the trailing slash for ‘/page2/’ causes the issue to occur. Is there a way to achieve having routes omitting the trailing slash? e.g. just ‘/page2’
from flask import Flask, render_template, url_for
app = Flask(__name__)
@app.route("/")
def hello():
return render_template('hello.html')
@app.route("/page2/")
def page_two():
return render_template('page2.html')
if __name__ == "__main__":
app.run(debug=True)
template is:
<p><a href="{{ url_for('page_two') }}">Link to page2</a></p>
and the gunicorn command is:
pipenv run gunicorn -w 2 -b unix:hello.sock hello:app --reload --access-logfile /var/log/python/gunicorn_access.log --error-logfile /var/log/python/gunicorn_error.log --log-level debug