python - 后端通过 Flask 中的 Ajax 从前端接收 JSON 后渲染模板
问题描述
我试图在通过 Ajax 接收 Post quest(JSON 文件)后渲染模板,但它不起作用,除了当我进入页面http://localhost:5000/distance_comuting时,它可以显示结果数据['lat']*数据['lng']
这是我的代码
@main.route('/distance_computing', methods = ['GET','POST'])
def distance_computing():
data = request.get_json()
return render_template('main/test.html', result = data['lat']*data['lng'])
错误是:
Traceback (most recent call last):
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/flask/app.py", line 2309, in __call__
return self.wsgi_app(environ, start_response)
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/werkzeug/contrib/fixers.py", line 152, in __call__
return self.app(environ, start_response)
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/flask/app.py", line 2295, in wsgi_app
response = self.handle_exception(e)
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/flask/app.py", line 1741, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
raise value
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
raise value
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "/Users/user/PycharmProjects/website/venv/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/user/Document/Python/User.github.io/Code/app/main/views.py", line 34, in distance_computing
return render_template('main/test.html', result = data['lat']*data['lng'])
TypeError: 'NoneType' object is not subscriptable
然后我尝试print(data)
第一次是None,然后接收到Ajax就转成JSON数据。但它已经用 None 呈现模板...
<!DOCTYPE html>
<html>
<head>
<title></title>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
</head>
<body>
<div id = 'omg'></div>
<script type="text/javascript">
navigator.geolocation.getCurrentPosition(function (position) {
var pos = {
lat: position.coords.latitude
lng: position.coords.longitude
};
req = $.ajax({
type: 'POST',
url: 'http://localhost:5000/distance_computing',
data: JSON.stringify(pos),
contentType: 'application/json; charset=UTF-8',
dataType: 'json',
success: function (data) {
console.log(data);
$('#omg').html(data)
},
error: function(xhr, status, error)
{ console.log(error) }
});
});
</script>
</body>
</html>
解决方案
你可以试试这个:
@main.route('/distance_computing', methods = ['GET','POST'])
def distance_computing():
data = request.get_json() if request.get_json() is not None and request.method == "POST" else {'lat': 0, 'lng': 0}
return render_template('main/test.html', result = data['lat']*data['lng'])
也不需要使用JSON.stringify()
,只需按原样发布对象即可。
推荐阅读
- php - PHP IF ELSE 语句未正确执行
- javascript - 如何使用具有相同 id 但不同 onclick 元素的 VBA 在 IE 上单击第二个按钮
- gitignore - 如何使用带有星号的 gitignore?
- java - 解释查询时出错 [更新学生集 Student.email=:email];这可能表示语义(用户查询)问题或解析器中的错误
- tsql - 添加一个作为两个查询结果的列
- pandas - 如何修复显示“DataFrame”对象不可调用的计算错误
- python - 根据数据集动态设置图层单位
- javascript - 在整个页面截图中包含开放层截图
- tensorflow - 使用 tf.keras.Model 作为定义 RNN Cell 的基类
- java - 如何使用 Mockito 进行系统测试?我们应该吗?