Flask未从jQuery请求数据中获取任何数据
我有一个URL的处理程序Flask未从jQuery请求数据中获取任何数据,jquery,python,flask,Jquery,Python,Flask,我有一个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",
@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) }})
没有返回任何内容有趣,因为您只能使用
请求。数据
如果数据是使用flask无法处理的mimetype发布的,否则它是一个空字符串”
我想,文档不是很清楚,我做了一些测试,似乎就是这样,您可以查看运行我的测试时烧瓶生成的控制台输出
传入请求数据
数据以字符串形式包含传入请求数据,以防mimetype Flask无法处理该数据 取自 但是由于我们使用json做了一个标准的
POST
,flask可以很好地处理这个问题,因此您可以从标准的请求中访问数据。form
thisss=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 --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
使用google chrome
Version 20.0.1132.57
我一直在使用类似的功能,在对ajax和python进行了一些修改之后,我想到了python读取ajax数据的方法
JavaScript:
var data = {
data: JSON.stringify({
"value":'asdf'
})
}
};
$.ajax({
url:"/",
type: 'POST',
data: data,
success: function(msg){
alert(msg);
}
})
Python:
from flask import json
@app.route("/", methods=['POST'])
def get_data():
data = json.loads(request.form.get('data'))
ss = data['value']
return str(ss)
嗯,我通过
request.form
获得AJAX请求。我正在使用并指定它,如下所示:
<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 }} ],
} );
} );
usersview是my Grid()对象的一个实例。在本例中,唯一有趣的是如何获取DataTables发送的ajax数据:
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
这对我有用
在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(烧瓶)中:
注:要点如下:
- JSON.stringify()
- contentType:“应用程序/json;字符集=utf-8”
- json.loads
- 请求.数据
ajax
的success函数,并根据需要操作数据success(data,textStatus,jqXHR)函数,在请求成功时数组一个要调用的函数。函数传递三个参数:从服务器返回的数据,根据dataType参数格式化;描述状态的字符串;和jqXHR(在jquery1.4.x中,XMLHttpRequest)对象。从jQuery1.5开始,success设置可以接受一系列函数。每个函数将依次调用。这是一个Ajax事件。
但是我正在用alert(xhr.responseText)测试它,如果您想知道打印出来的参数console.log(arguments)
,responseText中没有任何内容。。它将为您提供对象内部的属性。。但是如果你想处理数据
在success函数中执行它,那么我就是这样做的,响应文本是“”
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
$.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)
}
});
from flask import request
import json
@app.route("/", methods=['POST'])
def home():
json_data = json.loads(request.data)
print(json_data)
return json_data