web-dev-qa-db-fra.com

flacon python rediriger vers https depuis http

J'ai un site Web construit en utilisant python3.4 et flask ... J'ai généré mon propre certificat auto-signé et je teste actuellement mon site Web par le biais de localhost. 

J'utilise le module python ssl avec cette extension flask: https://github.com/kennethreitz/flask-sslify

context = ('my-cert.pem', 'my-key.pem')
app = Flask(__name__)
sslify = SSLify(app)

...

if __== '__main__':
    app.debug = False
    app.run(
    Host="127.0.0.1",
    port=int("5000"),
    ssl_context=context
)

Cela ne semble pas fonctionner cependant. J'ai jeté un œil dans le code source de sslify et cette ligne ne semble pas fonctionner

def init_app(self, app):
    """Configures the configured Flask app to enforce SSL."""
    app.before_request(self.redirect_to_ssl)
    app.after_request(self.set_hsts_header)

Plus précisément, l'appel de fonction à redirect_to_ssl (j'ai ajouté ma propre instruction print sous la fonction redirect_to_ssl et celle-ci n'a jamais été imprimée)

def redirect_to_ssl(self):
    print("THIS IS WORKING")
    """Redirect incoming requests to HTTPS."""
    Should we redirect?
    criteria = [
        request.is_secure,
        current_app.debug,
        request.headers.get('X-Forwarded-Proto', 'http') == 'https'
    ]

    if not any(criteria) and not self.skip:
        if request.url.startswith('http://'):
            url = request.url.replace('http://', 'https://', 1)
            code = 302
            if self.permanent:
                code = 301
            r = redirect(url, code=code)
            return r

Je suis assez nouveau pour python. Des idées?

10
David Yuan

Pour moi, il semble que vous rendiez les choses plus compliquées que nécessaire. Voici le code que j'utilise dans mon script views.py pour forcer l'utilisateur à se connecter à HTTPS:

@app.before_request
def before_request():
    if request.url.startswith('http://'):
        url = request.url.replace('http://', 'https://', 1)
        code = 301
        return redirect(url, code=code)
26

Selon le docs , après pip install Flask-SSLify, il vous suffit d’insérer le code suivant:

from flask import Flask
from flask_sslify import SSLify

app = Flask(__name__)
sslify = SSLify(app)

Je l'ai fait et ça marche très bien. Est-ce que je manque quelque chose dans la discussion?

10
Rodolfo Alvarez

La solution standard consiste à encapsuler la demande avec un décorateur enforce_ssl qui, après avoir vérifié certains indicateurs dans la configuration de l'application (que vous pouvez définir en fonction de vos besoins de débogage), modifie l'URL de la demande avec request.url

Comme il est écrit ici .

Vous pouvez modifier le code pour le faire fonctionner avec before_request comme suggéré par @ kelly-keller-heikkila

4
tuned

J'utilise l'application Cloud Foundry Python qui se trouve derrière un équilibreur de charge (comme https://stackoverflow.com/users/5270172/kelly-keller-heikkila dit). Cette résolution m'a aidé en ajoutant (_external et _Scheme à la fonction url_for). https://github.com/pallets/flask/issues/773

0
MohanBabu

Merci de répondre à Kelly Keller-Heikkila et au commentaire de jaysqrd J'ai fini par le faire dans mon application Flask:

from flask import request, redirect
...

@app.before_request
def before_request():
    if not request.is_secure and app.env != "development":
        url = request.url.replace("http://", "https://", 1)
        code = 301
        return redirect(url, code=code)

J'ai essayé la solution flask_sslify proposée par Rodolfo Alvarez mais j'ai rencontré ce problème et j'ai opté pour la solution ci-dessus.

La vérification app.env permet de laisser les tests unitaires et le développement local s’exécuter sans https.

0
anulaibar