【问题标题】:Flask Session does not save data across app.routesFlask Session 不会跨 app.routes 保存数据
【发布时间】:2020-06-14 16:03:52
【问题描述】:

长期以来,我一直在努力解决代码中的问题,但我似乎无法弄清楚自己在做什么/出了什么问题。

所以基本上我正在用flask和socket.io制作一个聊天应用程序。我想使用flask session 来保存数据,但是我的数据似乎没有保存。

import os
from flask import Flask, render_template, request, session, redirect
from flask_socketio import SocketIO, emit
from flask_session import Session

app = Flask(__name__)
app.config["SECRET_KEY"] = os.getenv("SECRET_KEY")
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
socketio = SocketIO(app, manage_session=False)
Session(app)


users = []
chatrooms = []


@app.route("/", methods=["GET","POST"])
def index():
    if request.method == "POST":
        displayname = request.form.get("dname")
        for user in users:
            if displayname == user:
                return render_template("index.html", error_message = "Displayname is already taken.")
        session['displayname'] = displayname
        session["logged_in"] = True
        return render_template("main.html", displayname=displayname, chatrooms=chatrooms, users=users)
    if request.method == "GET":
        if 'displayname' in session:
            displayname = session['displayname']
            return redirect("/main")
        return render_template("index.html")


@app.route("/main", methods=["GET", "POST"])
def main():
    if request.method == "GET":
        displayname = request.form.get("goback")
        session['displayname'] = displayname
        if displayname in users:
            users.remove(displayname)
        if 'chatroomname' in session:
            chatroomname = session['chatroomname']
            return redirect("/getchatroom")
        return render_template("main.html", displayname=displayname, chatrooms=chatrooms, users=users)
    if request.method == "POST":
        displayname = request.form.get("makechatroom")
        session['displayname'] = displayname
        chatroomname = request.form.get("chatroomname")
        for chatroom in chatrooms:
            if chatroom == chatroomname:
                error= "This chatroom already exists! Choose another name!"
                return render_template("main.html", displayname=displayname, chatrooms=chatrooms, users=users, error=error)
        chatrooms.append(chatroomname)
        session['chatroomname'] = chatroomname
        users.append(displayname)
        return render_template("chatroom.html", displayname=displayname, chatroomname=chatroomname, users=users)

@app.route("/getchatroom", methods=["POST"])
def getchatroom():
    if request.method == "POST":
        chatroomname = request.form.get("openchatroom")
        session['chatroomname'] = chatroomname
        displayname = request.form.get("disname")
        session['displayname'] = displayname
        users.append(displayname)
        return render_template("chatroom.html", displayname=displayname, chatroomname=chatroomname, users=users)


@app.route("/logout", methods=["GET"])
def logout():
    displayname = request.form.get("logout")
    if displayname in users:
        users.remove(displayname)
    session.pop('username', None)
    session["logged_in"] = False
    return redirect("/")

我真的不知道 HTML 是否相关,因为它似乎与 HTML 无关。

这是我的错误信息:

File "C:\Users\linda\OneDrive\Bureaublad\project2\venv\Lib\site-packages\flask\app.py", line 2464, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Users\linda\OneDrive\Bureaublad\project2\venv\Lib\site-packages\flask_socketio\__init__.py", line 45, in __call__
return super(_SocketIOMiddleware, self).__call__(environ,
File "C:\Users\linda\OneDrive\Bureaublad\project2\venv\Lib\site-packages\engineio\middleware.py", line 74, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Users\linda\OneDrive\Bureaublad\project2\venv\Lib\site-packages\flask\app.py", line 2450, in wsgi_app
response = self.handle_exception(e)
File "C:\Users\linda\OneDrive\Bureaublad\project2\venv\Lib\site-packages\flask\app.py", line 1867, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\linda\OneDrive\Bureaublad\project2\venv\Lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "C:\Users\linda\OneDrive\Bureaublad\project2\venv\Lib\site-packages\flask\app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\linda\OneDrive\Bureaublad\project2\venv\Lib\site-packages\flask\app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\linda\OneDrive\Bureaublad\project2\venv\Lib\site-packages\flask\app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\linda\OneDrive\Bureaublad\project2\venv\Lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "C:\Users\linda\OneDrive\Bureaublad\project2\venv\Lib\site-packages\flask\app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\linda\OneDrive\Bureaublad\project2\venv\Lib\site-packages\flask\app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\linda\OneDrive\Bureaublad\project2\application.py", line 47, in main
displayname = session['displayname']
File "C:\Users\linda\OneDrive\Bureaublad\project2\venv\Lib\site-packages\werkzeug\local.py", line 377, in <lambda>
__getitem__ = lambda x, i: x._get_current_object()[i]
KeyError: 'displayname'

提前感谢所有尝试提供帮助的人!

xx琳达

【问题讨论】:

  • 我认为您需要在返回之前设置会话。

标签: html session flask saving-data flask-session


【解决方案1】:

python 2.7 版本的cachelib 中有一个严重的错误。 异常在lib\site-packages\cachelib\file.py", line 158, in set 中被抑制 有人试图修复这个问题https://github.com/fengsp/flask-session/issues/119,但“修复”更破坏了代码(我的解释器引发 'ModuleException `os` has no attribute `replace`')。 所以,我的解决方案就是替换这样的损坏函数(只需在导入后粘贴):

def _hotfix(old, new):
try:
    os.rename(old, new)
except WindowsError as e:
    if e.errno == 17:
        os.remove(new)
        os.rename(old, new)
    else:
        class UniverseDestructionException(Exception):
            pass
        raise UniverseDestructionException
os.replace = os.rename = _hotfix

另一个提醒,不再支持python2.7

【讨论】:

    猜你喜欢
    • 2021-01-25
    • 2023-03-14
    • 1970-01-01
    • 2013-05-13
    • 2018-06-30
    • 1970-01-01
    • 2020-07-01
    • 2013-01-29
    • 2020-08-22
    相关资源
    最近更新 更多