Flask не получает никаких данных из данных запроса jQuery

У меня есть обработчик URL,

@app.route("/", methods=['POST'])
@crossdomain(origin='*')
def hello():
    ss=str(request.data)
    print ss
    return ss

Обработчик не может получить часть данных запроса. При использовании jQuery:

jQuery.ajax(
   {
      type: "POST",
      dataType: "json",
      data:"adasdasd",
      url: 'http://127.0.0.1:5000/',
      complete: function(xhr, statusText)
      {  alert(xhr.responseText) }})

ничего не возвращается


person Noor    schedule 07.08.2012    source источник
comment
ммм Может что-то и возвращается, но ты ничего с этим не делаешь   -  person wirey00    schedule 07.08.2012
comment
Попробуйте использовать функцию успеха ajax и манипулируйте данными так, как вам нужно success(data, textStatus, jqXHR)Function, Array A function to be called if the request succeeds. The function gets passed three arguments: The data returned from the server, formatted according to the dataType parameter; a string describing the status; and the jqXHR (in jQuery 1.4.x, XMLHttpRequest) object. As of jQuery 1.5, the success setting can accept an array of functions. Each function will be called in turn. This is an Ajax Event.   -  person wirey00    schedule 07.08.2012
comment
но я тестирую его с помощью alert(xhr.responseText) , в responseText ничего нет   -  person Noor    schedule 07.08.2012
comment
Если вы хотите узнать, что находится внутри аргументов, распечатайте console.log(arguments).. это даст вам свойства внутри объекта.. но если вы хотите обработать data, сделайте это внутри функции успеха   -  person wirey00    schedule 07.08.2012
comment
да, я сделал это, текст ответа ''   -  person Noor    schedule 07.08.2012
comment
у вас есть свойство responseText для ваших данных? попробуйте сделать console.log(данные)? или console.log(данные[0]);?   -  person wirey00    schedule 07.08.2012


Ответы (4)


Это сработало для меня.

В Javascript:

$.ajax({
  type: 'POST',
  url: "enter your correct url",
  contentType: "application/json; charset=utf-8",
  data: JSON.stringify({title: 'My Title', article: 'My article'}),
  success: function(result){
    console.log(result)
  }
});

В Python (колба):

 from flask import request
 import json

 @app.route("/", methods=['POST'])
 def home():
   json_data = json.loads(request.data)
   print(json_data)
   return json_data

ПРИМЕЧАНИЕ: точки;

  • JSON.stringify()
  • contentType: "приложение/json; charset=utf-8"
  • json.loads
  • запрос.данные
person Obinna Nnenanya    schedule 03.12.2018

интересно, как оказалось, вы можете использовать request.data только в том случае, если данные были отправлены с MIME-типом, который фляга не может обработать, в противном случае это пустая строка "" Я думаю, документы были не очень ясны, я провел несколько тестов, и это кажется в этом случае вы можете взглянуть на вывод консоли, который генерирует фляга при запуске моих тестов.

Входящие данные запроса

data
Содержит данные входящего запроса в виде строки на случай, если он пришел с MIME-типом, который Flask не обрабатывает.

взято с http://flask.pocoo.org/docs/api/

но поскольку мы делаем стандартный POST с использованием json, flask может справиться с этим довольно хорошо, поэтому вы можете получить доступ к данным из стандартного request.form, этот ss=str(request.form) должен сработать, как я это тестировал.

В качестве примечания @crossdomain(origin='*') это кажется опасным, есть причина, по которой мы не разрешаем межсайтовые ajax-запросы, хотя я уверен, что у вас есть свои причины.

это полный код, который я использовал для тестирования:

from flask import Flask
app = Flask(__name__)

from datetime import timedelta
from flask import make_response, request, current_app
from functools import update_wrapper


def crossdomain(origin=None, methods=None, headers=None,
                max_age=21600, attach_to_all=True,
                automatic_options=True):
    if methods is not None:
        methods = ', '.join(sorted(x.upper() for x in methods))
    if headers is not None and not isinstance(headers, basestring):
        headers = ', '.join(x.upper() for x in headers)
    if not isinstance(origin, basestring):
        origin = ', '.join(origin)
    if isinstance(max_age, timedelta):
        max_age = max_age.total_seconds()

    def get_methods():
        if methods is not None:
            return methods

        options_resp = current_app.make_default_options_response()
        return options_resp.headers['allow']

    def decorator(f):
        def wrapped_function(*args, **kwargs):
            if automatic_options and request.method == 'OPTIONS':
                resp = current_app.make_default_options_response()
            else:
                resp = make_response(f(*args, **kwargs))
            if not attach_to_all and request.method != 'OPTIONS':
                return resp

            h = resp.headers

            h['Access-Control-Allow-Origin'] = origin
            h['Access-Control-Allow-Methods'] = get_methods()
            h['Access-Control-Max-Age'] = str(max_age)
            if headers is not None:
                h['Access-Control-Allow-Headers'] = headers
            return resp

        f.provide_automatic_options = False
        return update_wrapper(wrapped_function, f)
    return decorator



@app.route("/", methods=['POST'])
@crossdomain(origin='*')
def hello():
    ss=str(request.form)

    print 'ss: ' + ss + ' request.data: ' + str(request.data)
    return ss


@app.route("/test/")
def t():
    return """
<html><head></head><body>
<script src="http://code.jquery.com/jquery.min.js" type="text/javascript"></script>
<script type='text/javascript'>
jQuery.ajax(
   {
      type: "POST",
      dataType: "json",
      data: "adasdasd",
    url: 'http://127.0.0.1:5000/',
complete: function(xhr, statusText)
      {  alert(xhr.responseText) }})

var oReq = new XMLHttpRequest();
oReq.open("POST", "/", false);
oReq.setRequestHeader("Content-Type", "unknown");
oReq.send('sync call');
alert(oReq.responseXML);
</script></body></html>
"""

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

выход:

$ python test.py 
 * Running on http://127.0.0.1:5000/
127.0.0.1 - - [07/Aug/2012 02:45:28] "GET /test/ HTTP/1.1" 200 -
ss: ImmutableMultiDict([('adasdasd', u'')]) request.data: 
127.0.0.1 - - [07/Aug/2012 02:45:28] "POST / HTTP/1.1" 200 -
ss: ImmutableMultiDict([]) request.data: sync call
127.0.0.1 - - [07/Aug/2012 02:45:28] "POST / HTTP/1.1" 200 -
127.0.0.1 - - [07/Aug/2012 02:45:29] "GET /favicon.ico HTTP/1.1" 404 -

и моя система:

$ python --version
Python 2.6.1

$ python -c 'import flask; print flask.__version__;'
0.8

$ uname -a
Darwin 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun  7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386

с помощью гугл хром Version 20.0.1132.57

person Samy Vilar    schedule 07.08.2012

Я работал с аналогичной функциональностью, и после того, как я немного повозился с ajax и python, это то, что я придумал для python, читающего данные ajax.

JavaScript:

var data = {
      data: JSON.stringify({
                        "value":'asdf'
                    })
   }
};

$.ajax({
   url:"/",
   type: 'POST',
   data: data,
   success: function(msg){
              alert(msg);
            }
})

Питон:

from flask import json
@app.route("/", methods=['POST'])
def get_data():
    data = json.loads(request.form.get('data'))
    ss = data['value']
    return str(ss)
person Wondercricket    schedule 11.07.2013

Хм, я получаю запросы AJAX через request.form. Я использую DataTables и указываю это следующим образом:

<script type="text/javascript">
$(document).ready( function() {
        $('#mgmtdata').dataTable( {
                "bServerSide": true,
                "sAjaxSource": "{{url_for('.xhr')|safe}}",
                "sServerMethod": "POST",
                "bDeferRender": true,  
                "bFilter": {{ info.filter if info.filter else "false" }},
                "aoColumnDefs": [ {{ info.columndefs|safe if info.columndefs }} ],
        } );
} );

Функция xhr() проста:

@usersview.route('/xhr', methods=["POST"])
def xhr():
    if not 'usersview' in g:   
        g.usersview = UsersDatatableView()
    return g.usersview.render()

userview — это экземпляр объекта my Grid(). В этом случае интересно только, как он попадает в данные ajax, отправленные DataTables:

def render(self):
    q = self.getQuery()

    # add filtering
    if 'sSearch' in request.form and request.form['sSearch']:
        q = self.applyFilter(q, request.form['sSearch'])

    # add sorting
    if 'iSortingCols' in request.form:
       # and so on
person HolgerSchurig    schedule 24.07.2013