2017-08-16 5 views
1

Ich habe zwei Server, wo man versucht, eine Datei von der anderen zu bekommen. Ich benutze Flask Get Requests, um einfache Daten hin und her zu senden (Strings, Listen, JSON-Objekte, etc.).Python Flask: Datei und Variable senden

Ich weiß auch, wie man nur eine Datei sendet, aber ich muss einen Fehlercode mit meinen Daten senden.

ich etwas entlang der folgenden Zeilen bin mit:

Server 1:

req = requests.post('https://www.otherserver.com/_download_file', data = {'filename':filename}) 

Server 2:

@app.route('/_download_file', methods = ['POST']) 
def download_file(): 
    filename = requests.form.get('filename') 

    file_data = codecs.open(filename, 'rb').read() 
    return file_data 

Server 1:

with codecs.open('new_file.xyz', 'w') as f: 
    f.write(req.content) 

... alles funktioniert gut. Ich möchte jedoch eine Fehlercodevariable zusammen mit file_data senden, damit Server 1 den Status (und nicht den HTTP-Status, sondern einen internen Statuscode) kennt.

Jede Hilfe wird geschätzt.

+0

Gibt es einen besonderen Grund, warum HTTP-Fehlercodes Ihre Anforderungen nicht erfüllen? – wanderlust

+0

Es gibt, aber noch wichtiger, ich möchte auch Informationen senden, die kein Fehlercode sind, sondern nur zusätzliche Daten. – pshep123

Antwort

4

Eine Lösung, die mir in den Sinn kommt, ist die Verwendung eines benutzerdefinierten HTTP-Headers.

Hier ist ein Beispiel Server und Client-Implementierung.

Natürlich können Sie den Namen und den Wert des benutzerdefinierten Headers beliebig ändern.

Server

from flask import Flask, send_from_directory 

app = Flask(__name__) 

@app.route('/', methods=['POST']) 
def index(): 
    response = send_from_directory(directory='your-directory', filename='your-file-name') 
    response.headers['my-custom-header'] = 'my-custom-status-0' 
    return response 

if __name__ == '__main__': 
    app.run(debug=True) 

Client

import requests 

r = requests.post(url) 

status = r.headers['my-custom-header'] 

# do what you want with status 

UPDATE

Hier ist eine andere Version des Servers basiert auf der Implementierung

import codecs 

from flask import Flask, request, make_response 

app = Flask(__name__) 

@app.route('/', methods=['POST']) 
def index(): 
    filename = request.form.get('filename') 

    file_data = codecs.open(filename, 'rb').read() 
    response = make_response() 
    response.headers['my-custom-header'] = 'my-custom-status-0' 
    response.data = file_data 
    return response 

if __name__ == '__main__': 
    app.run(debug=True) 
+0

Ich versuche das jetzt in meinen Live-Code zu implementieren. Wie auch immer, das ist sehr hilfreich. Danke – pshep123

+0

gut zu sehen es hat dir geholfen. Ich habe die Antwort so bearbeitet, dass sie eine weitere Implementierung enthält, die auf Ihrer basiert. – ohannes

Verwandte Themen