Adding https support in Flask

Getting a chance to work on Python, my favorite framework is Flask (http://flask.pocoo.org/). It is a micro-framework that lets you create and deploy APIs, websites, and dashboards.

When deploying Flask projects onto a production server, we need to only support HTTPS and redirect HTTP requests to HTTPS. This creates a problem with Flask url_for function, which only outputs HTTP URLs.

Below is one way to achieve this. Following is taken from my production deployment.

import os
from flask import Flask

app = Flask(__name__)

@app.before_request
def before_request():
    if os.environ["PROJECT_ENV"] != "dev":
        from flask import _request_ctx_stack
        if _request_ctx_stack is not None:
            reqctx = _request_ctx_stack.top
            reqctx.url_adapter.url_scheme = "https"

if __name__ == "__main__":
    app.run(port=80, host="0.0.0.0")

 

Update: 8 June 2017

I have found another way of adding https support to flask.

from flask import Flask

class ReverseProxied(object):
        def __init__(self, app):
                self.app = app

        def __call__(self, environ, start_response):
                environ['wsgi.url_scheme'] = 'https'
                return self.app(environ, start_response)

app = Flask(__name__)
app.wsgi_app = ReverseProxied(app.wsgi_app)

if __name__ == "__main__":
    app.run(port=80, host="0.0.0.0")

This was mentioned in stack overflow post:

https://stackoverflow.com/a/37842465

Let me know if you have a better approach to this problem.


Posted

in

by

Comments

2 responses to “Adding https support in Flask”

  1. archer920gmailcom Avatar

    I’m really suprised to hear that Flash doesn’t have better support for HTTPS. Thanks for providing us with a work around!

    Like

    1. chashaam Avatar

      Yeah, this is true. I had to use the workaround for adding https support. P.S. I have updated the article with an alternate approach also.

      Liked by 1 person

Leave a comment