如果我对SESSION_FILE_DIR使用mkdtemp(),则烧瓶会话不起作用

时间:2019-01-30 03:44:55

标签: python-3.x flask

我在尝试创建会话的过程中有一个flask应用程序,但仅适用于管理路由,因此除管理路由外,其他任何地方都可以访问,事情在我的本地主机上一切正常,但是,实时运行服务器,当我登录时就创建了会话,但是当我尝试调用session.get(“ user_id”)来检查会话是否存在时,它不会创建。就像如果会话不是持久创建的。今天我已经阅读了10个小时,我终于找到了为什么它不起作用,但是我真的不理解为什么它会发生。我面临的问题位于app.config [“ SESSION_FILE_DIR”] = mkdtemp(),如果我在本地主机上使用此文件,但不在实时服务器中使用,并且如果我忽略了这一行,则它可以在实时服务器。这是我的代码:

from flask import Flask, flash, redirect, render_template, request, session, jsonify, url_for
from flask_session import Session
from functools import wraps
from werkzeug.security import check_password_hash, generate_password_hash
from tempfile import mkdtemp # used to create a temp directory
from helpers import login_required
import os

# Configure application as flask app
app = Flask(__name__)

# Ensure templates are auto-reloaded
app.config["TEMPLATES_AUTO_RELOAD"] = True

# 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"
app.secret_key = 'superkey'

# function to login admin
@app.route("/login", methods=["GET", "POST"])
def login():
"""Log admin in"""

# Forget any user_id
session.clear()

# User reached route via POST (as by submitting a form via POST)
if request.method == "POST":

    # Ensure username was submitted
    if not request.form.get("username"):
        flash ("must provide username")
        return render_template('/login.html')

    # Ensure password was submitted
    elif not request.form.get("password"):
        flash ("must provide password")
        return render_template('/login.html')

    # Query database for username
    username = request.form.get("username")
    username = str.lower(username)
    db = dbConnection()
    db.execute("SELECT * FROM identities WHERE user_name = ?", [username])
    rows = db.fetchall()

    # Ensure username exists and password is correct
    if len(rows) == 1:
        uid, name, pass_hash = rows[0]
    if len(rows) != 1 or not check_password_hash(pass_hash, request.form.get("password")):
        flash ("invalid username and/or password")
        return render_template('/login.html')

    # Remember which user has logged in
    session["user_id"] = uid

    # Redirect user to home page
    return redirect("/adminForms")

# User reached route via GET (as by clicking a link or via redirect)
else:
    return render_template("login.html")

# function as decorator to ensure the user was logged in before 
# can go to a protected page
def login_required(f):

    @wraps(f)
    def decorated_function(*args, **kwargs):
        # if session don't return a value, then the user needs to log in
        if session.get("user_id") is None:
            return redirect("/login")
        return f(*args, **kwargs)
    return decorated_function

0 个答案:

没有答案