1

我正在开发一个部署在 heroku 上的 Flask 应用程序。
该应用程序使用Flask-Session我需要帮助才能正确配置服务器端会话存储。

我首先将其配置为使用 Flask-Session configuration = "SESSION_FILE_DIR" = mkdtemp() 在服务器端存储会话。但是,在这种情况下,Heroku 不能以这种方式正常运行。Heroku 不会存储会话,用户只会随机注销。我已经看到将会话存储在数据库中而不是服务器临时文件夹中的建议。

我尝试使用“SESSION_TYPE”=“sqlalchemy”将会话转移到数据库存储。我还不能正确运行它以在 locahost 上运行。

按照这个如何在 Postgres 数据库中保存会话?也是,但没有成功...

"""application.py"""

import os, datetime

from tempfile import mkdtemp
from werkzeug.exceptions import default_exceptions, HTTPException, InternalServerError
from werkzeug.security import check_password_hash, generate_password_hash
from flask import Flask, flash, jsonify, redirect, render_template, request, session
from flask_session import Session

# Import my package modules
from helpers import apology, login_required, status_mapper
from class_h import *

# Configure application
app = Flask(__name__)

# Ensure responses aren't cached
@app.after_request
def after_request(response):
    response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
    response.headers["Expires"] = 0
    response.headers["Pragma"] = "no-cache"
    return response

原始会话配置 ->

# # Configure session to use filesystem (instead of signed cookies)
# app.config["SESSION_FILE_DIR"] = mkdtemp()
# app.config["SESSION_PERMANENT"] = False
# app.config["SESSION_TYPE"] = "filesystem"
# Session(app)

我在主文件中导入的 class_h.py 模型文件,创建 db 实例,在 application.py 中初始化

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

# create a db but using flask_sqlalchemy syntax
db = SQLAlchemy()

Flask-SQLAlchemy 配置,Heroku Postgres 数据库

app.config["SQLALCHEMY_DATABASE_URI"] = os.getenv("DATABASE_URL")
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
db.init_app(app)

配置 flask_session 以使用 SQLAlchemy(而不是签名的 cookie)

app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "sqlalchemy"
Session(app)

在我对 session.py 文件应用 [此修复] ( https://github.com/mnbf9rca/flask-session/commit/9ad4b23e946beba1fdbd23dc406058a77dac6676 ) 后,会话记录不会在数据库中创建。如果未应用修复,则使用 None 值创建会话。

试过

from flask_sessionstore import Session

但我得到相同的行为。

尝试过:

["SESSION_PERMANENT"] = True

使用 Null 到期创建会话(而不是未创建)。

感谢您的帮助!花了几天时间研究这个。

4

0 回答 0