1

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

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

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琳达

4

1 回答 1

0

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

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不再支持的另一个提醒

于 2020-11-17T10:44:18.467 回答