我注意到当并行运行的请求修改Flask时session,只记录了一些键.使用Flask的默认cookie会话和使用Redis后端的Flask-Session都会发生这种情况.该项目并不是新的,但只有在同一会议同时发生许多请求时,这才会变得明显.
import time
from flask import Flask, session
from flask_session import Session
app = Flask(__name__)
app.secret_key = "example"
app.config["SESSION_TYPE"] = "redis"
Session(app)
@app.route("/set/<value>")
def set_value(value):
"""Simulate long running task."""
time.sleep(1)
session[value] = "done"
return "ok\n"
@app.route("/keys")
def keys():
return str(session.keys()) + "\n"
Run Code Online (Sandbox Code Playgroud)
以下shell脚本演示了此问题.请注意,所有请求都已完成,但最终列表中只有一个键,并且测试运行之间不同.
#!/bin/bash
# set session
curl -c 'cookie' http://localhost:5007/keys
# run parallel
curl -b 'cookie' http://localhost:5007/set/key1 && echo "done1" &
curl -b 'cookie' http://localhost:5007/set/key2 && echo "done2" &
curl -b 'cookie' http://localhost:5007/set/key3 && echo "done3" & …Run Code Online (Sandbox Code Playgroud) 我得到的确切错误是:
flask.cli.NoAppException: While importing "application", an ImportError was raised:Traceback (most recent call last):
File "/home/harshit/.local/lib/python3.6/site-packages/flask/cli.py", line 240, in locate_app
__import__(module_name)
File "/home/harshit/Documents/project1/application.py", line 18, in <module>
Session(app)
File "/home/harshit/.local/lib/python3.6/site-packages/flask_session/__init__.py", line 54, in __init__
self.init_app(app)
File "/home/harshit/.local/lib/python3.6/site-packages/flask_session/__init__.py", line 61, in init_app
app.session_interface = self._get_interface(app)
File "/home/harshit/.local/lib/python3.6/site-packages/flask_session/__init__.py", line 93, in _get_interface
config['SESSION_USE_SIGNER'], config['SESSION_PERMANENT'])
File "/home/harshit/.local/lib/python3.6/site-packages/flask_session/sessions.py", line 313, in __init__
from werkzeug.contrib.cache import FileSystemCache
ModuleNotFoundError: No module named 'werkzeug.contrib'
Run Code Online (Sandbox Code Playgroud)
我正在尝试从 Flask 导入会话
我有一个烧瓶视图,执行该视图以在生成器中加载一些信息(我正在使用生成器,以便我可以不断生成进度 - 已加载多少信息)。视图如下所示:
@app.route("/progress", methods=['GET'])
def progress():
gen = get_user_saved_tracks(session['token'], session['spotify_id'], session)
return Response(gen, mimetype= 'text/event-stream')
def get_user_saved_tracks(token, id, session):
#load information and keep yielding
session['info'] = info
Run Code Online (Sandbox Code Playgroud)
我想存储在生成器内的会话变量中加载的信息(该生成器函数在请求上下文之外的不同文件中定义)。但是当我尝试访问会话变量时,出现以下错误:
运行时错误:在请求上下文之外工作。
那么,有没有办法通过这种方式将信息写入到session中呢?我现在正在使用 FileSystemSessionInterface,但愿意使用 redis 会话(如果这能解决我的问题)。
更新:
根据 Sraw 的建议,我尝试了以下更改:
from flask import current_app
app = current_app._get_current_object()
def get_user_saved_tracks(token, id,session):
with app.app_context():
session['info'] = info
Run Code Online (Sandbox Code Playgroud)
但我仍然遇到同样的错误。
更新2:
因此,我需要使用实际的应用程序实例而不是使用 current_app (应用程序对象正在不同的文件中创建 - app.py)
from app import app
def get_user_saved_tracks(token, id,session):
with app.app_context():
session['info'] = info
Run Code Online (Sandbox Code Playgroud)
这样做时,我得到同样的错误:
运行时错误:在请求上下文之外工作。
更新3:
以下是 get_user_saved_tracks 的代码:
def get_user_saved_tracks(token, …Run Code Online (Sandbox Code Playgroud) 我选择使用 Flask-Session 对 Flask 使用服务器端会话管理。
我使用filesystem并按预期存储数据,这些文件存储/flask_session在我的 config 目录中的文件夹下。
这是我如何在我的 __init__.py
# __init__.py
from flask_session import Session
[...]
app.config['SESSION_TYPE'] = 'filesystem'
app.config['SECRET_KEY'] = config.SECRET_KEY
sess = Session()
sess.init_app(app)
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,会话文件生成并存储在 /flask_session
? flask_session/
1695e5cbf9b4edbbbb82a8ef1fad89ae
192761f7ce8e3cbf3ca11665133b7794
2029240f6d1128be89ddc32729463129
...
Run Code Online (Sandbox Code Playgroud)
问题是:这些文件是否会flask_session在特定时间后自动删除(即作为会话存储在客户端)?如果是,是否可以减少/增加这个时间?
我在使用 chrome 和 SameSite 时遇到问题。我在 shopify iframe 中提供一个网页,当使用 Flask-login 设置会话时,chrome 告诉我:
与 URL 上的跨站点资源关联的 cookie 设置为没有该
SameSite属性。它已被阻止,因为 Chrome 现在仅在设置了SameSite=None和 的情况下才提供具有跨站点请求的 cookieSecure。
安全已设置,但我尝试以所有可能的方式设置 SameSite,但没有效果。
我试过设置
app.config['SESSION_COOKIE_SAMESITE'] = "无"
我试过了,改变了库的行为,我厌倦了在 set_cookie() 中设置属性,但似乎没有任何效果。我看到的响应没有 SameSite 属性。
(我有最新版本的flask、flask-login、flask-security 和werkzeug)
你能帮助我吗?
谢谢
我正在开发一个网络应用程序,用户将上传一个 .csv 文件,该文件在下一页呈现为 html。然后,需要在下一页使用相同的 .csv 文件(或导入它的 Pandas 数据框)。所以我需要在@app.routes之间移动这个对象。我的理解是这session是在 Flask 中做到这一点的正确方法。但是,会话要求对象被序列化。
那会很好,除了在将 json 转换回 Pandas 时,会删除下划线。显然这是因为它被视为_扮演逗号角色的数字对象,并且开发人员表示他们不打算为此提供修复程序。
我制作了一个简单的应用程序来演示这个问题:
控制器.py
#!/usr/bin/env python3
import pandas as pd
from flask import Flask, render_template, session
import os
app = Flask(__name__)
app.secret_key = os.urandom(28)
@app.route('/first_page', methods=['GET', 'POST'])
def first_page():
d = {'products': ['pencils', 'pens', 'erasers'], 'id_code': ['1_2', '10_7', '12_11']}
df = pd.DataFrame(d)
print(df)
session["data"] = df.to_json()
return render_template('/private/test_page1.html')
@app.route('/second_page', methods=['GET', 'POST'])
def second_page():
dat = session.get('data')
dat = pd.read_json(dat) …Run Code Online (Sandbox Code Playgroud) 在曾经工作的应用程序上初始化时,我不断收到错误“Flask”对象没有属性“session_cookie_name”。
我构建了一个较小的测试应用程序来测试它,并注意到如果删除该行,app.config["SESSION_TYPE"] = "filesystem"错误就会消失。问题是我需要在 Flask 应用程序中使用会话,并且由于它是用于测试,我更愿意使用文件系统来存储会话数据。这是我用于测试的小程序...我不知道我错过了什么,这曾经工作正常,在线代码示例完全按照这种方式执行,但我不断收到相同的错误。
from flask import Flask, render_template,redirect, url_for, request, session
from flask_session import Session
app = Flask(__name__)
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
Session(app)
@app.route("/")
def index():
session["test"] = "test"
return render_template ('index.html')
Run Code Online (Sandbox Code Playgroud)
这以前有效。突然就不行了。我尝试安装不同版本的 Flask_Session。我尝试在 Session(app) 之前将“SESSION_COOKIE_NAME”添加到 app.config 中,尽管我知道它的默认值是会话。到目前为止,没有任何效果或改变了错误消息。
我正在尝试在我的 python 应用程序中实现 Flask-Session。我在文档中读到,建议使用另一个接口,例如 ,而SqlAlchemySessionInterface不是NullSessionInterface在未向配置密钥提供任何内容时使用的默认接口SESSION_TYPE。
从 Session 类下的flask_session/ init .py 文件中读取
默认情况下 Flask-Session 将使用 :class:
NullSessionInterface,您确实应该配置您的应用程序以使用不同的 SessionInterface。
SESSION_TYPE将配置键设置为后"sqlalchemy"出现错误
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) relation "sessions" does not exist
Run Code Online (Sandbox Code Playgroud)
这表明 Flask-Session 正在寻找在我的数据库模型中使用名为“sessions”的表,但我在 Flask-Session 文档中找不到任何地方指出应该创建一个表以及它应该具有哪些字段。
有人可以建议解决这个问题吗?