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?
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)
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?
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
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
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.