2015-09-04 14 views
6

Derzeit meine index.html Datei enthältWie temporäre URL herunterladen in Flask?

<a href="static/file.ext">Download</a> 

Ich möchte, dies ändern, so dass die Download-URL nur gültig für eine bestimmte Zeit ist. Zum Beispiel, wie würde ich es

ändern
<a href="get_file?file=file.ext&token=TEMPORARYTOKEN">Download</a> 

In meiner Flask Datei kann ich dann

@app.route('/get_file') 
def get_file(): 
    filename = request.args.get('file') 
    token = request.args.get('token') 
    if token is valid: # what can be done here 
     return send_from_directory('static', filename) 

Wie kann ich generieren und das Token umgehen? Oder nähere ich mich dem völlig falsch?

+0

Während ich glaube, Ihre Frage richtig ist, wollte ich im Zusammenhang mit dieser eine Sache zu diskutieren. Nur wegen dieser Einschränkung werden wir das Framework (django/flask/RoR) zwingen, die Datei zurück zu streamen, wohingegen ich es geliebt hätte, wenn es eine Lösung gäbe, in der wir nginx/apache bekommen könnten, um sie zu bedienen. – darkryder

+0

Gibt es eine bessere Möglichkeit, temporäre Downloads für Downloads mit nginx oder apache bereitzustellen? Wie würde es mit dem Rest des Programms kommunizieren? – Kootling

+0

Welchen Rahmen verwenden Sie? – darkryder

Antwort

3

Es gibt ein paar Möglichkeiten, wie Sie dies tun können.

  1. Erstellen Sie eine UUID für Ihr Token und speichern Sie es zusammen mit dem gewünschten Verfallsdatum in einer db-Tabelle. Wenn jemand die URL mit dem Token aufruft, können Sie es einfach mit der db auf Gültigkeit und Ablauf überprüfen.

  2. Wenn Sie keine Token zum Speichern der Token verwenden möchten, können Sie GPG verwenden, um eine Zeichenfolge zu verschlüsseln, die das Verfallsdatum enthält, und die resultierende verschlüsselte Zeichenfolge als Token zu verwenden. Das bedeutet, dass Ihr Token viel länger ist als eine UUID, aber Sie würden es vermeiden, eine db zu verwenden.

Ich empfehle die Verwendung von UUID und einer db-Tabelle.

0

Eine andere Möglichkeit wäre es, den Primärschlüssel aus der db in base64 zu kodieren. Normalerweise erhalten die kurzen URL-Dienste im Netz die kurzen URLs. Die db stellt die Eindeutigkeit sicher und da es base64 ist, werden einige Dateien benötigt, bevor die URLs lang werden.

bei jeder Anfrage Sie dann Ihre db überprüfen, um zu sehen, ob der Link noch gültig ist. Wenn es nicht ist, machst du etwas Sinnvolles mit der Anfrage.

3

Vielleicht sollten Sie hmac verwenden.

generieren Link

import hashlib 
import hmac 
import time 
secret = "anything you like" # such as generate from os.urandom(length) 
def generate(filename): 
    current_time = str(int(time.time())) 
    token = hmac.new(secret, current_time, hashlib.sha256).hexdigest() 
    return "get_file?file=%(filename)s&time=%(current_time)s&token=%(token)s" % { 
     "filename": filename, 
     "current_time": current_time, 
     "token": token 
    } 

Überprüfen Link

import hashlib 
import hmac 
import time 
secret = "anything you like" # same as in generate function 
def verify(time_in_link, token_in_link): 
    time_limit = 15 * 60 # maximum time in sec(such as: 15(mins) * 60 (convert them to sec)`enter code here`) that you want them to start download after the link has been generated. 
    if (time.time() - int(time_in_link)) > time_limit: #timeout, return False 
     return False 
    if hmac.new(secret, str(time_in_link), hashlib.sha256).hexdigest() == token_in_link: # Check the token is available or not 
     return True 
    else: 
     return False