2012-04-25 2 views
21

Необходимо сделать запрос POST с серверной стороны в Flask.Возможно ли сделать запрос POST в Flask?

Давайте представим, что мы имеем:

@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" }) 

Я ничего конкретного в Колба документации не найдено. Некоторые говорят, что urllib2.urlopen проблема, но мне не удалось совместить Flask и urlopen. Это действительно возможно?

Заранее благодарен!

ответ

21

Да, чтобы сделать запрос POST, вы можете использовать urllib2, см. documentation.

Я бы рекомендовал вместо этого использовать модуль requests.

EDIT:

Я предлагаю вам реорганизовать ваш код, чтобы извлечь общие функциональные возможности:

@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

Хммм, да. Это на самом деле предполагает создание сетевого запроса по небольшой причине. Я уверен, что есть лучший способ сделать это. – brice

+0

Я не понимал, что вы хотите сделать «запрос» к своему собственному приложению, я обновил свой ответ. – codeape

+1

Рефакторинг для извлечения функциональности - это хороший совет, и он обходит проблему, делая код более гибким. +1 – brice

13

Для записи, вот общий код, чтобы сделать запрос POST от 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() 

Обратите внимание, что мы передаем фикцию Python с помощью опции json=. Это удобно говорит библиотеку запросов, чтобы сделать две вещи:

  1. сериализовать Dict в формате JSON
  2. написать правильный тип MIME («приложение/JSon») в заголовке HTTP

И вот Приложение к фляге, которое получит и ответит на этот запрос 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

Я хотел бы прокомментировать, насколько важна часть 'json =', упомянутая в ответе @ Luke. Я боролся с этим часами. Нашел ответ здесь. – user2326079

Смежные вопросы