2012-04-25 41 views
21

Istnieje potrzeba wykonania żądania POST od strony serwera w kolbie.Czy można wysłać żądanie POST w kolbie?

Wyobraźmy sobie, że mamy:

@app.route("/test", methods=["POST"]) 
def test(): 
    test = request.form["test"] 
    return "TEST: %s" % test 

@app.route("/index") 
def index(): 
    # Is there something_like_this method in Flask to perform the POST request? 
    return something_like_this("/test", { "test" : "My Test Data" }) 

nie znalazłem nic konkretnego w dokumentacji kolby. Niektórzy twierdzą, że problemem jest urllib2.urlopen, ale nie udało mi się połączyć Flask i urlopen. Czy to naprawdę możliwe?

Z góry dziękuję!

Odpowiedz

21

Tak, aby wysłać zapytanie POST, można użyć numeru urllib2, patrz: documentation.

Zalecam jednak zamiast tego użycie modułu requests.

EDIT:

Proponuję byłaby kod, aby wyodrębnić wspólny funkcjonalność:

@app.route("/test", methods=["POST"]) 
def test(): 
    return _test(request.form["test"]) 

@app.route("/index") 
def index(): 
    return _test("My Test Data") 

def _test(argument): 
    return "TEST: %s" % argument 
+0

Hmmm, tak. W rzeczywistości wymagałoby to podania żądania sieci z niewielkiego powodu. Jestem pewien, że jest lepszy sposób na zrobienie tego. – brice

+0

Nie zdawałem sobie sprawy, że chciał (a) Pan (i) złożyć "wniosek" do swojej aplikacji, zaktualizowałem moją odpowiedź. – codeape

+1

Refaktoryzacja w celu wydobycia funkcjonalności to dobra rada i rozwiązuje ten problem, zwiększając elastyczność kodu +1 – brice

13

Dla przypomnienia, oto ogólny kod, aby złożyć zamówienie post od Python:

#make a POST request 
import requests 
dictToSend = {'question':'what is the answer?'} 
res = requests.post('http://localhost:5000/tests/endpoint', json=dictToSend) 
print 'response from server:',res.text 
dictFromServer = res.json() 

Zauważ, że przechodzimy w Dict Python za pomocą opcji json=. Ten dogodnie mówi bibliotekę wnioski zrobić dwie rzeczy:

  1. serializacji DICT do JSON
  2. napisać poprawny typ MIME ('application/json') w nagłówku HTTP

A oto Aplikacja Flask, która otrzyma i odpowie na to żądanie POST:

#handle a POST request 
from flask import Flask, render_template, request, url_for, jsonify 
app = Flask(__name__) 

@app.route('/tests/endpoint', methods=['POST']) 
def my_test_endpoint(): 
    input_json = request.get_json(force=True) 
    # force=True, above, is necessary if another developer 
    # forgot to set the MIME type to 'application/json' 
    print 'data from client:', input_json 
    dictToReturn = {'answer':42} 
    return jsonify(dictToReturn) 

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

Chciałbym skomentować, jak ważna jest część 'json =' wspomniana w odpowiedzi @ Luke'a. Walczyłem z tym przez wiele godzin. Znaleziono odpowiedź tutaj. – user2326079

Powiązane problemy