除了烧瓶应用程序的 url 之外,Flask 会话在另一个 url 中不起作用

Posted

技术标签:

【中文标题】除了烧瓶应用程序的 url 之外,Flask 会话在另一个 url 中不起作用【英文标题】:Flask session doesn't work in anoter url apart from the url of the flask app 【发布时间】:2022-01-05 06:58:28 【问题描述】:

我有 Flask 应用和 React 应用。 我在烧瓶应用程序上有会话。 我希望烧瓶会话也在我的 React 应用程序中。 这是烧瓶应用程序的一部分

@views.route("/login/<email>/<password>")
def log(email,password):
    user = User.query.filter_by(email=email).first()
    if user:
        if check_password_hash(user.password, password):
            session.permanent = True
            session["user"] = email
            infor_user = user
            user_infor = "name": infor_user.username, "email": infor_user.email
            return jsonify("success": user_infor)
        else:
            return jsonify("error": "Password is incorrect")
    else:
        return jsonify("error": "User doesn't exist")


@views.route("/checkuser")
def check_user():
    if "user" in session:
        user = session["user"]
        infor_user = User.query.filter_by(email=user).first()
        user_infor = "name": infor_user.username, "email": infor_user.email
        return jsonify("user": user_infor)
    else:
        return jsonify("user": )

@views.route("/out")
def out():
    session.pop("user",None)
    return jsonify"message": "logged out""

这就是 React 应用程序。

import useContext,useState from "react"
import username from "./username"



function Login()

const [infor,setInfor] = useContext(username)
const [inusername, setInusername] = useState("")
const [password, setPassword] = useState("")
const [error, setError] = useState("")

if(infor)
    return (
        <div>You are already Logged in!!!</div>
    )


const checkLogin = () => 

    if(!inusername || !password)
        setError("Those parts need to be writen")
    
    else
        console.log(`http://127.0.0.1:5000/log/$inusername/$password`)
    fetch(`http://127.0.0.1:5000/log/$inusername/$password`)
    .then((response) => response.json())
    .then((data) =>  
        if ("error" in data)
            setError(data["error"])
        

        else
           setInfor(data["seccess"])
        
    );
        
    


return(
    <div>
        <p>error ? error : ""</p>
        <input type="text" onChange=(e) => setInusername(e.target.value)/>
        <input type="password" onChange=(e) => setPassword(e.target.value)/>
        <button onClick=checkLogin>Login!</button>
    </div>
)
    


export default Login

我试图让会话在 React 应用程序中,但由于某种原因,它总是对我说会话不存在。 我该怎么办?

【问题讨论】:

【参考方案1】:

“会话”是什么意思?如果你说的是 cookie,那可能是因为 cookie 是 http-only,这意味着客户端 JS 无法访问它。即使你改变了它,会话 cookie 也应该是“加密的”,这样只有服务器可以读取和修改它,而客户端不会对其进行修改。

【讨论】:

也许它只是 http-only,所以如果它是 http-only 我该如何解决?

以上是关于除了烧瓶应用程序的 url 之外,Flask 会话在另一个 url 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在两个烧瓶服务器之间共享会话

烧瓶 url 处理器

会话不可用,因为没有设置密钥。将应用程序上的 secret_key 设置为唯一且机密的东西。烧瓶/Heroku

是否有一种简单的方法可以在烧瓶中使会话超时?

RuntimeError:在应用程序上下文之外工作。烧瓶 - 邮件

烧瓶永久会话:在哪里定义它们?