2017-05-27 51 views
0

嗨,我正在處理簡單的瓶子休息api。我在不同的服務器上運行前端和後端。如果我從郵遞員訪問服務器代碼,以下代碼有效。如果存在POST方法請求,則無法接受會話變量

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) 

這裏我無法在'second'方法中打印該方法。我得到的錯誤是'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 

但是,如果我嘗試使用郵遞員,我沒有看到OPTIONS請求。我相信我應該在Python代碼中處理OPTIONS請求。但文件說,燒瓶處理它。

我不知道現在該做什麼。有人能幫我嗎。

+0

它應該工作我已經測試過127.0.0.1 - [27/May/2017 13:38:53]「POST/api/login HTTP/1.1」200 -' '第一個' '127.0 .0.1 - - [27/May/2017 13:39:01]「POST/api/messages HTTP/1.1」200 -' –

回答

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應用程序,然後從這裏,你可以看到會話工作,否則就沒有會話。

+0

不,我從java腳本調用它,它根本不起作用。我先調用第一種方法,稍後再調用其他方法。你使用捲曲嗎? –

+0

那麼問題是會話問題。 –

+0

我已經測試過你的api郵差。 –