从Javascript到Redis(通过Python)往返传递数据?

时间:2016-02-23 13:53:23

标签: javascript python ajax flask redis

我正在重构一个我自己用作学习工具的项目,这是一个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时,它给了我一个“未定义”。

我觉得我太近了,我在这里错过了什么?

2 个答案:

答案 0 :(得分:1)

问题在于,r.get("test")会返回str 看起来像一样的。使用jsonifypickle.dumpspickle.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,您可能仍需要解析它,然后才能像对象一样访问它,并且可能会以某种方式进行包装,具体取决于您的服务器处理中是否涉及中间件。