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(data)? หรือ console.log (ข้อมูล [0]);?   -  person wirey00    schedule 07.08.2012


คำตอบ (4)


สิ่งนี้ได้ผลสำหรับฉัน

ในจาวาสคริปต์:

$.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()
  • ประเภทเนื้อหา: "application/json; charset=utf-8"
  • json.โหลด
  • ขอข้อมูล
person Obinna Nnenanya    schedule 03.12.2018

น่าสนใจ เนื่องจากปรากฎว่าคุณสามารถใช้ request.data ได้ก็ต่อเมื่อมีการโพสต์ข้อมูลด้วยประเภท mime ที่ flask ไม่สามารถจัดการได้ ไม่เช่นนั้นจะเป็นสตริงว่าง "" ฉันคิดว่าเอกสารไม่ชัดเจนมาก ฉันทำการทดสอบบางอย่างแล้วและดูเหมือนว่า ในกรณีนี้ คุณสามารถดูคอนโซลเอาต์พุตที่ขวดสร้างขึ้นเมื่อคุณรันการทดสอบของฉัน

ข้อมูลคำขอที่เข้ามา

data
ประกอบด้วยข้อมูลคำขอขาเข้าเป็นสตริงในกรณีที่มาพร้อมกับ mimetype 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

จาวาสคริปต์:

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()

usersview เป็นตัวอย่างของวัตถุ 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