两个会话键Flask应用程序,很奇怪

时间:2015-11-24 10:22:17

标签: python session flask

SESSION_KEY = “IDOGN2HHO43NjIVhrIe3i8mrrYtwQL3KsmBmt9En0N6G1n84b8Y1ddb + bGfcHqluL3gYwmkHxf / YiE8tQqTtXA ==”;会话= eyJfcGVybWFuZW50Ijp0cnVlfQ.CTXHug.DBJdQAKPKf2YiQGGTbiDW6DTEmI

从我的标题中可以看出,我的Flask应用程序设置了两个cookie。我无法理解这种行为。 请在下面找到我的烧瓶代码片段。

from flask import Flask, session, jsonify, request, make_response, Response
from base64 import b64encode
import os, dbConnect
from datetime import datetime, timedelta
import json

app = Flask(__name__)
app.config['PROPAGATE_EXCEPTIONS'] = True
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'

conn = dbConnect.connect()
curs=conn.cursor()

@app.route("/py/commandSend", methods=['POST'])
def reverse():
    data = {'a': 10, 'b': [{'c': False, 'd': False}, None]}
    return json.dumps(data)


@app.route("/py/session", methods=['POST'])
def application():
    now = datetime.now()
    token = b64encode(os.urandom(64)).decode('utf-8')
    expiryTime = now + timedelta(0, 450)
    curs.execute("""INSERT INTO sessions (session_id, session_expiry, ip_address) VALUES (%s, %s ,%s) """,(token, expiryTime, request.environ["REMOTE_ADDR"]))
    conn.commit()
    response = make_response()
    response.set_cookie('SESSION_KEY',token)
    session.permanent = True
    return response

@app.route("/py/getClientIP", methods=['POST'])
def getClientIP():
    data = {}
    data['client_ip'] = request.environ["REMOTE_ADDR"]
    js = json.dumps(data)
    resp = Response(js, status=200, mimetype='application/json')
    print(request.environ['HTTP_COOKIE'])

    return resp

@app.route("/py/sessionClose", methods=['POST'])
def sessionClose():
    curs.execute("DELETE FROM sessions")
    conn.commit()
    return 'Done'

if __name__ == "__main__":
    app.run()

甚至Chrome开发人员工具网络标签显示生成了两个cookie,这非常奇怪,无法找到解决方案。帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

根据您在此处编写的代码,您的烧瓶应用设置两个cookie是预期的行为。我会解释一下:

在烧瓶中,您可以使用会话导入向用户会话添加内容:

import session
session['username'] = michael

现在,在用户session Cookie中,将有值username=michael(解密后)。

我认为通过调用session.permanent = true会导致创建一个相对空白的session Cookie。

您可以使用response.set_cookie

在烧瓶中存储Cookie内容的另一种方式
response = make_response()
response.set_cookie('SESSION_KEY',token)
return response

这是创建名为SESSION_KEY的Cookie,其值为token。这就是你看到的第二个cookie来自哪里。

这意味着SESSION_KEY未加密,因为它不是烧瓶管理的会话。我假设您要保护此SESSION_KEY,因此您应该像这样重写代码:

@app.route("/py/session", methods=['POST'])
def application():
    now = datetime.now()
    token = b64encode(os.urandom(64)).decode('utf-8')
    expiryTime = now + timedelta(0, 450)
    curs.execute("""INSERT INTO sessions (session_id, session_expiry, ip_address) VALUES (%s, %s ,%s) """,(token, expiryTime, request.environ["REMOTE_ADDR"]))
    conn.commit()
    session['SESSION_KEY'] = token
    session.permanent = True

这会将您的SESSION_KEY存储在加密的会话Cookie中。