我正在创建一个非常简单的演示网络应用。我想要的只是按下按钮,让消息从前端到后端,然后传回前端。没什么好看的。
我无法获得" data1" (在JS中)可以在Pyhton / Flask中访问。我不确定问题是我是如何从JS发送的,也不是我如何在Python中访问它。根据我读过的其他问题,我似乎正确地做到了。在JS中我使用data : JSON.stringify(data1)
发送,在python中我使用data = request.json
进行访问。那么这里有什么问题?
我尝试使用request.json,request.get_json()访问它,并尝试在没有JSON的情况下进行访问,只是发送"数据",并通过request.form.get访问它(&# 39;字&#39)。但这些似乎都不起作用。
Cmd Line Output:
xxxxxx@ezri:~/Desktop/flaskwebapp$ python webapp_starter.py
* Running on http://127.0.0.1:8000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger pin code: 276-649-445
127.0.0.1 - - [28/May/2017 10:48:49] "GET / HTTP/1.1" 200 -
<Request 'http://127.0.0.1:8000/examplemethod' [POST]>
data None
127.0.0.1 - - [28/May/2017 10:48:54] "POST /examplemethod HTTP/1.1" 500 -
Traceback (most recent call last):
File "/home/castro/anaconda2/lib/python2.7/site-packages/flask/app.py", line 1994, in __call__
return self.wsgi_app(environ, start_response)
File "/home/castro/anaconda2/lib/python2.7/site-packages/flask/app.py", line 1985, in wsgi_app
response = self.handle_exception(e)
File "/home/castro/anaconda2/lib/python2.7/site-packages/flask/app.py", line 1540, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/castro/anaconda2/lib/python2.7/site-packages/flask/app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()
File "/home/castro/anaconda2/lib/python2.7/site-packages/flask/app.py", line 1615, in full_dispatch_request
return self.finalize_request(rv)
File "/home/castro/anaconda2/lib/python2.7/site-packages/flask/app.py", line 1630, in finalize_request
response = self.make_response(rv)
File "/home/castro/anaconda2/lib/python2.7/site-packages/flask/app.py", line 1725, in make_response
raise ValueError('View function did not return a response')
ValueError: View function did not return a response
此错误显然是因为使用request.json通过flask中的赋值始终为数据分配None
。所以真正的错误似乎是将数据从JS正确地提供给Python。
HTML
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
<script type="text/javascript" src="static/example.js"></script>
</head>
<body>
<h1 class="title">Heading</h1>
<p>a paragraph of text bla bla bla</p>
<button id="btn"> CLICK ME! </button>
</body>
</html>
使用Javascript:
"use strict";
console.log("On load");
var main = function() {
var run_method = function(){
var data1 = {"word":"hello"}
console.log("Before " + data1);
$.ajax({
url : "/examplemethod",
type : "POST",
data : JSON.stringify(data1),
contentType: 'application/json; charset=utf-8',
dataType: 'json',
})
.done(function(data){
// Parse out image info
var data = JSON.parse(data);
console.log(data);
});
}
$("#btn").on("click",function(){
//event.preventDefault();
run_method()
})
}
$(document).ready(main);
的Python /烧瓶中:
from flask import Flask, render_template,request
#Init flask server
app = Flask(__name__)
@app.route("/")
def initialize():
'''
Initialize the page
IN: None
OUT: None (loads page)
'''
#render page from html
return render_template('index.html')
@app.route("/examplemethod", methods=['POST', 'GET'])
def example_method():
global data
if request.method == 'POST':
print request
data = request.json
#request.form.get('word')
print "data", data
return data
if __name__ == '__main__':
app.run(host="127.0.0.1", port=int("8000"), debug=True)
答案 0 :(得分:0)
在$ .ajax调用中,数据选项必须是对象,查询字符串或数组。 JSON字符串不起作用。所以只需用data1替换'JSON.stringify(data1)'。
在Flask方面,您似乎需要通过使用request.form ['word']和来自GET方法request.args.get('word')来访问POST方法发送的请求信息。另外,方法和路线需要匹配吗?例如'/ examplemethod'和'def examplemethod'?我不熟悉Flask的命名约定:
#At top of file
from Flask import jsonify
@app.route("/examplemethod", methods=['POST', 'GET'])
def example_method():
global data
if request.method == 'POST':
print request
data = request.form['word']
print "POST", data
elif request.method == 'GET':
print request
data = request.args.get('word')
print "GET", data
return jsonify(data)
您还可能需要在Flask中使用jsonify功能。请参阅有关在Flask中使用jQuery的文档:http://flask.pocoo.org/docs/0.12/patterns/jquery/
答案 1 :(得分:0)
我明白了。
老实说,我并非100%确定我采取了哪些措施来解决这个问题。我将差异检查器中的代码与上面发布的内容进行了比较,但发现所有更改都是打印语句,或者在成功请求后使用/修改数据,因此不知道这些更改是否已修复它。
我邀请其他人试着弄清楚改变了什么。
JS
var run_method = function(){
var data1 = {"word":"hello"}
console.log("Before " + data1["word"]);
$.ajax({
url : "/examplemethod",
type : "POST",
data : JSON.stringify(data1),
contentType: 'application/json; charset=utf-8',
dataType: 'json',
})
.done(function(data){
console.log("After " +data["word"]);
});
}
的Python
@app.route("/examplemethod", methods=['POST', 'GET'])
def example_method():
global data
if request.method == 'POST':
print "POST REQ:", request
data = request.json
print "data", data
data["word"] = "goodbye!"
return JSONEncoder().encode(data)
答案 2 :(得分:0)
试试get_json(force=True)
。它强制并将数据转换为json(dict)格式。浏览器可能没有发送正确的内容类型,因为.json
失败但get_json
给出了正确的结果。
您可以使用request.headers
检查标题。
我刚试过你的代码,我得到了以下结果
使用request.json
{'word': 'hello'}
使用request.form
ImmutableMultiDict([])
get_json(force=True)
{'word': 'hello'}
另外docs说
应该使用get_json()方法。