如果有POST方法请求,则无法获取会话变量

时间:2017-05-27 05:31:30

标签: python flask flask-restful

您好我正在研究一个简单的烧瓶休息api。我在不同的服务器上运行前端和后端。如果我从邮递员访问服务器代码,以下代码可以工作。

from flask import Flask, jsonify, session, request
import os

app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)

@app.route('/api/login', methods=['POST'])
def first():
    session['this_one'] = 'first'
    return jsonify({'message': 'hello', 'success':1})


@app.route('/api/messages', methods=['POST'])
def second():
    print session['this_one']

    # args = request.json
    return jsonify({'message':'fdsafd'})


if __name__ == '__main__':
    app.run(debug=True)

在这里,我无法在第二个'中打印方法。方法。我得到的错误是' KeyError'

KeyError: 'this_one'

但是,如果我删除POST方法,它工作正常。我在没有会话变量的情况下进行了双重检查,代码运行得很好。谁能帮我这个。我们还在响应中使用标头。但我不是在这里粘贴代码。

非常感谢。

我发布了我用过的HTML代码。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script>

        $(document).ready(function () {


    $( "#login" ).click(function() {
        console.log("1")
            $.ajax({
                 type: "POST",
                 url: "http://127.0.0.1:5000/api/login",
                 data: JSON.stringify ({user: 'bbb'}),
                 contentType: "application/json",
                 dataType:"json",
                 crossDomain:true,

                 success: function (data, status, jqXHR) {
                     console.log("success "+data['message']);
                 },

                 error: function (jqXHR, status) {
                     // error handler
                     console.log(jqXHR);
                     console.log('fail' + status.code);
                 }
          });
    });

    $( "#go" ).click(function() {
        console.log("2")
        $.ajax({
                 type: "POST",
                 url: "http://127.0.0.1:5000/api/messages",
                 data: JSON.stringify ({user: 'aaa'}),
                 contentType: "application/json",
                 dataType:"json",
                 crossDomain:true,

                 success: function (data, status, jqXHR) {
                     console.log("success "+data['message']);
                 },

                 error: function (jqXHR, status) {
                     // error handler
                     console.log(jqXHR);
                     console.log('fail' + status.code);
                 }
          });
    });

});


    </script>
</head>
<body>
    <button id="login">aaa</button>
    <button id="go">bbb</button>
</body>
</html>

这是我得到的日志。 jquery正在发送OPTIONS请求。

127.0.0.1 - - [27/May/2017 16:09:45] "OPTIONS /api/login HTTP/1.1" 200 -
first
127.0.0.1 - - [27/May/2017 16:09:45] "POST /api/login HTTP/1.1" 200 -
127.0.0.1 - - [27/May/2017 16:09:52] "OPTIONS /api/messages HTTP/1.1" 200 -
127.0.0.1 - - [27/May/2017 16:09:52] "POST /api/messages HTTP/1.1" 500 - KeyError

但如果我和Postman一起尝试,我没有看到OPTIONS请求。我相信我应该在python代码中处理OPTIONS请求。但文档说,烧瓶处理它。

我不知道现在该做什么。有人可以帮助我。

1 个答案:

答案 0 :(得分:1)

它应该有用,我已经验证了你的代码:

127.0.0.1 - - [27/May/2017 13:38:53] "POST /api/login HTTP/1.1" 200 -
first
127.0.0.1 - - [27/May/2017 13:39:01] "POST /api/messages HTTP/1.1" 200 -

我认为你第一次POST /api/messages HTTP/1.1,然后它会引发错误,因为session['this_one']没有初始化。您应"POST /api/login HTTP/1.1"先设置session['this_one'] = 'first',然后才能在会话中使用它。

<强>更新

from flask import Flask, jsonify, session, request
from flask import render_template
import os

app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)

@app.route('/')
def index():
    return render_template('index.html') #your html goes here

@app.route('/api/login', methods=['POST'])
def first():
    session['this_one'] = 'first'
    return jsonify({'message': 'hello', 'success':1})


@app.route('/api/messages', methods=['POST'])
def second():
    print(session['this_one'])

    # args = request.json
    return jsonify({'message':'fdsafd'})


if __name__ == '__main__':
    app.run(debug=True)

然后运行烧瓶应用程序,你应该保持html运行作为烧瓶应用程序,然后它将是一个Web应用程序,然后从这里,你可以看到会话正在工作,否则没有会话。