这是将在以下代码块中使用的导入。
from flask import Flask, session
初始代码
# with required imports
# with previous code implemented (such as app=Flask(__name__))
@app.route('/')
def index():
session['name'] = 'username'
session['pwd'] = 'password'
return {
'username': session['name'],
'password': session['pwd']
}
上述代码在浏览器上的输出是
{
"username": "username",
"password": "password"
}
这意味着当前会话存储中有“名称”属性和“ pwd”属性。
但是据我了解,会话存储的结构是这样的
{
"Dx_h18Ux": {
"name": "username",
"pwd": "password"
}
"aqD81K_9": {
"name": "anothername",
"pwd": "anotherpwd"
}
... more users to go
}
会话存储实际上包含多个具有相同结构的字典,但是每个字典都存储在唯一的哈希键下。
所以,这是另一段代码
# with required imports
# with previous code implemented
@app.route('/account')
def account():
if session['name'] == 'username':
return 'You do have access to this page'
return 'You don't have access to this page'
使用此代码,只有在我之前访问过索引页面的情况下,我才能访问帐户页面。
因此,我认为这是可行的,因为我刚刚创建了“ name”和“ pwd”属性,它们存储在此页面的本地位置(与此同时,它们也可能存储在会话存储区中)。我可以在索引页之后访问session['name']
,因为我可以从本地存储中获取数据。
现在,如果实现了app.config['PERMANENT_SESSION_LIFETIME]
,请关闭选项卡并重新打开它,我不应该在本地存储区中保存任何内容,但会话仍然存在,因此数据仅存储在会话存储区中。如果是正确的话,如何从具有给定用户名的会话存储中提取用户的所有数据?
例如我想取出这单个块
"Dx_h18Ux": {
"name": "username",
"pwd": "password"
}
或代码版本
@app.route('/get_session/<username>')
def get_session(username):
''' given a username as a locator,
fetch the whole dictionary that has a name attribute be username
'''
s = the chunk
print(s['name'])
# expected output: username
print(s['pwd'])
# expected output: password
对不起,如果我搞砸了。
答案 0 :(得分:0)
在Flask中使用默认会话时,所有所有数据都存储在Cookie中的用户计算机上。服务器根本不保存它的副本。您可以 实现服务器端会话,但这并不是Flask的即开即用体验。
当用户访问您的网站时,如果他们拥有与您的网站相关联的Cookie,那么他们将在每个页面请求中发送一份Cookie的副本。该Cookie使用您的SECRET_KEY进行了加密签名,以便他们可以打开他们计算机上的cookie,因此他们不能在不使其无效的情况下进行任何更改,因此仅在他们提出请求时才提供。如果他们没有,则将在第一个请求之后创建一个。
从本质上讲,您的服务器在用户访问之前以及在用户的请求周期内都不持有任何卡-服务器只能访问该单个用户的cookie,因此扫描“会话存储库”中的数据的想法不会真的不存在。最好的办法就是查看用户在请求(print(session)
期间移交的会话中的内容。
我对这种会话的想法感到困惑,因为我来自一个PHP背景,尽管我的记忆很模糊-PHP的会话默认为服务器端,而客户端cookie仅存储一个引用/ ID。