我正在重构一个我自己用作学习工具的项目,这是一个HTML5画布游戏,我有一个用javascript对象和画布构建的六边形网格。一切都存储在javascript对象结构中。
我正在尝试更多地了解Python。我设置了一个基本的Python Flask路由,能够将一个AJAX请求从javascript发送到Flask路由,能够提交给Redis,能够从Redis中检索...但我似乎无法弄清楚是什么因为将信息从Python传递回javascript对象而丢失了。
HTML:
<head>
<script type=text/javascript src="{{ url_for('static', filename='jquery-2.2.0.min.js') }}"></script>
</head>
<script type="text/javascript">
$(function() {
var data =
{
row: '3',
col: '3',
};
$('#sendBtn').click(function() {
$.ajax({
type: 'POST',
url: '/saveMap',
contentType: "application/json; charset=utf-8",
data: JSON.stringify(data),
success: function(response) {
console.log(response.row)
},
error: function(error) {
console.log(error);
}
});
});
});
</script>
<body>
<button id="sendBtn" class="btn btn-lg btn-primary btn-block" type="button">Send</button>
</body>
</html>
的Python: 来自flask导入Flask,render_template,json,request import redis
app = Flask(__name__)
r = redis.Redis("localhost")
@app.route("/")
def main():
return render_template('index.html')
@app.route('/saveMap',methods=['POST'])
def saveMap():
if request.method == "POST":
r.set("test", request.json)
result = r.get("test")
return result
if __name__ == "__main__":
app.run(debug=True)
因此,当点击#sendBtn时,请求会通过,返回,在“网络”标签中显示为响应
{u'col': u'3', u'row': u'3'}
但是在AJAX调用的成功部分中,当我尝试调用response.row时,它给了我一个“未定义”。
我觉得我太近了,我在这里错过了什么?
答案 0 :(得分:1)
问题在于,r.get("test")
会返回str
看起来像jsonify
,pickle.dumps
和pickle.loads
可以解决您的问题。
from flask import Flask, render_template, request, jsonify
import redis, pickle
app = Flask(__name__)
r = redis.Redis("localhost")
@app.route("/")
def main():
return render_template('index.html')
@app.route('/saveMap',methods=['POST'])
def saveMap():
if request.method == "POST":
r.set("test", pickle.dumps(request.json))
result = pickle.loads(r.get("test"))
return jsonify(result)
if __name__ == "__main__":
app.run(debug=True)
修改:从使用eval
更改为使用pickle
只是为了安全,因为提到了reptilicus
答案 1 :(得分:0)
尝试console.log(response)
查看实际回来的内容。如果返回JSON,您可能仍需要解析它,然后才能像对象一样访问它,并且可能会以某种方式进行包装,具体取决于您的服务器处理中是否涉及中间件。