2013-09-23 7 views
9

Ich habe eine Client-Server-Anwendung. Ich konnte sie über https machen eine Verbindung über SSL-Verschlüsselung mit diesemHttps mit Http in Flask Python

context = SSL.Context(SSL.SSLv3_METHOD) 
    context.use_privatekey_file('/path_to_key/key.key') 
    context.use_certificate_file('/path_to_cert/cert.crt') 
    app.run(use_reloader=True, host='0.0.0.0',port=9020,ssl_context = context) 

Jetzt möchte ich den Server mit HTTP und HTTPS laufen. Gibt es eine Möglichkeit, das zu tun?

Antwort

9

Erste große Sache: Verwenden Sie nicht den eingebauten Webserver in der Flasche, um schweres Heben zu tun. Sie sollten einen echten Webserver wie Apache (mod_wsgi) nginex + gunicore usw. verwenden. Diese Server verfügen über eine Dokumentation, wie Sie http und https gleichzeitig ausführen können.

+0

Nun ich benutze Apache mit mod_wsgi zum Ausführen von Kolben, ich habe es geschafft, Apache zu konfigurieren, beide (http und https) auf verschiedenen Ports 80 und 443 zu verwenden es funktioniert gut mit https aber HTTP-Verbindung funktioniert nicht so lange wie ssl_context ist in Flask aktiviert –

+0

Verwenden Sie nicht app.run, wenn Sie hinter einem echten Server ausgeführt werden. – Tritium21

+0

was soll ich dann benutzen? –

7

Mein Ich schlage vor, das Ausprobieren Flask-SSLify - https://github.com/kennethreitz/flask-sslify

Nutzungs

Die Nutzung ist ganz einfach:

from flask import Flask 
from flask_sslify import SSLify 

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

Wenn Sie eine HTTP-Anforderung zu machen, wird es automatisch umleiten:

$ curl -I http://secure-samurai.herokuapp.com/ 
HTTP/1.1 302 FOUND 
Content-length: 281 
Content-Type: text/html; charset=utf-8 
Date: Sun, 29 Apr 2012 21:39:36 GMT 
Location: https://secure-samurai.herokuapp.com/ 
Server: gunicorn/0.14.2 
Strict-Transport-Security: max-age=31536000 
Connection: keep-alive 

Installieren

Die Installation ist zu einfach:

$ pip install Flask-SSLify 
+2

Dies beantwortet diese Frage nicht. – Tritium21

+0

Dies funktioniert auch nicht zum Erstellen von SSL-fähigen Verbindungen für Slack – chandresh

1

Jetzt will ich den Server laufen sowohl mit http und https gibt es eine Möglichkeit, das zu tun ??

Ich hatte in letzter Zeit ein ähnliches Problem. Um zu testen, ob ein Proxy verwendet wird, nachdem http auf https umgeleitet wird, ich habe gerade angefangen zwei Prozesse auf verschiedenen Ports: einen für http, eine andere für https:

#!/usr/bin/env python3 
"""Serve both http and https. Redirect http to https.""" 
from flask import Flask, abort, redirect, request # $ pip install flask 

app = Flask(__name__) 

@app.route('/') 
def index(): 
    if request.url.startswith('http://'): 
     return redirect(request.url.replace('http', 'https', 1) 
         .replace('080', '443', 1)) 
    elif request.url.startswith('https://'): 
     return 'Hello HTTPS World!' 
    abort(500) 

def https_app(**kwargs): 
    import ssl 
    context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) 
    context.load_cert_chain('server.crt', 'server.key') 
    app.run(ssl_context=context, **kwargs) 


if __name__ == "__main__": 
    from multiprocessing import Process 

    kwargs = dict(host='localhost') 
    Process(target=https_app, kwargs=dict(kwargs, port=7443), 
      daemon=True).start() 
    app.run(port=7080, **kwargs) 

Unnötig zu sagen, ist es nur für die Prüfung/Debugging-Zwecke.