Ошибка ключа: «пользователь», когда я использую сеансы с шаблонами (jinja) — Колба Python

#python #templates #flask #session #jinja2

Вопрос:

Я пытаюсь создать простую навигационную панель шаблона, которая сообщает пользователям, не вошедшим в систему, о входе или регистрации, и сообщает зарегистрированным пользователям о выходе из системы, но при этом я получаю ошибку «Ошибка ключа:» пользователь»». Я понятия не имею, почему это происходит, так как это работало у меня раньше.

Если бы кто-нибудь мог помочь мне в этом, я был бы очень признателен!

Шаблон

                 {% if session['logged_in'] %}
                    <a href="/logout" class="w3-bar-item w3-button w3-hover-none w3-text-light-grey w3-hover-text-light-grey w3-right">Log out</a>
                    <a href="#" class="w3-bar-item w3-button w3-hover-none w3-text-light-grey w3-hover-text-light-grey w3-right">{{SESSION_USERNAME}}</a>
                {% else %}
                    <a href="#" class="w3-bar-item w3-button w3-hover-none w3-text-light-grey w3-hover-text-light-grey w3-right">Login / Signup</a>
                {% endif %}
 

Шаблон Маршрута

 @app.route('/')
def index():
    return render_template('index.html', PAGE_TITLE = "Home :: ImageHub", SESSION_USERNAME=session['user'])
 

Маршрут входа в систему

 @app.route('/login', methods=["POST", "GET"])
def login():
    if(request.method == "POST"):
        username = request.form['input-username']
        password = request.form['input-password']

        user = db.users.find_one({'username': username, 'password': password})

        session['user'] = user['username']
        session['logged_in'] = True;

        return redirect(url_for('index'))
    elif(request.method == "GET"):
        return render_template('login.html', PAGE_TITLE = "Login :: ImageHub")

 

Я знаю, что маршрут входа в систему очень прост, но сейчас я просто хочу, чтобы система входа работала.

Редактировать: Могу ли я добавить, что это работает, когда сеанс[‘logged_in’] установлен в значение true, но прерывается, когда он выскакивает.

Ошибка

 [2021-05-31 17:23:24,850] ERROR in app: Exception on / [GET]
Traceback (most recent call last):
  File "C:UsersgabriAppDataLocalProgramsPythonPython39libsite-packagesflaskapp.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "C:UsersgabriAppDataLocalProgramsPythonPython39libsite-packagesflaskapp.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:UsersgabriAppDataLocalProgramsPythonPython39libsite-packagesflaskapp.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:UsersgabriAppDataLocalProgramsPythonPython39libsite-packagesflask_compat.py", line 39, in reraise
    raise value
  File "C:UsersgabriAppDataLocalProgramsPythonPython39libsite-packagesflaskapp.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:UsersgabriAppDataLocalProgramsPythonPython39libsite-packagesflaskapp.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "D:Github RepositoriesRepositoriesImagehubserver.py", line 17, in index
    return render_template('index.html', PAGE_TITLE = "Home :: ImageHub", SESSION_USERNAME=session['user'])
  File "C:UsersgabriAppDataLocalProgramsPythonPython39libsite-packageswerkzeuglocal.py", line 377, in <lambda>
    __getitem__ = lambda x, i: x._get_current_object()[i]
  File "C:UsersgabriAppDataLocalProgramsPythonPython39libsite-packagesflasksessions.py", line 84, in __getitem__
    return super(SecureCookieSession, self).__getitem__(key)
KeyError: 'user'
 

Ответ №1:

Ошибка KeyError: 'user' означает, что ваш объект сеанса не содержит ключа user . В разделе РЕДАКТИРОВАНИЯ проблема та же, у вас отсутствует ключ в объекте словаря. Вам нужно добавить user ключ к объекту сеанса:

 def add_to_dict(dict_obj, key, value):
    # Check if key exist in dict or not
    if key in dict_obj:
        # Key exist in dict.
        # Check if type of value of key is list or not
        if not isinstance(dict_obj[key], list):
            # If type is not list then make it list
            dict_obj[key] = [dict_obj[key]]
        # Append the value in list
        dict_obj[key].append(value)
    else:
        # As key is not in dict,
        # so, add key-value pair
        dict_obj[key] = value

@app.route('/login', methods=["POST", "GET"])
def login():
    if(request.method == "POST"):
        username = request.form['input-username']
        password = request.form['input-password']

        user = db.users.find_one({'username': username, 'password': password})

        # You probably want to do some checks on user object here :)
        add_to_dict(session, 'user', user['username'])
        add_to_dict(session, 'logged_in', True)

        return redirect(url_for('index'))
    elif(request.method == "GET"):
        return render_template('login.html', PAGE_TITLE = "Login :: ImageHub")

 

add_to_dict это вспомогательная функция, которая добавляет значение ключа к объекту словаря только в том случае, если оно еще не существует в вашем объекте словаря, иначе оно просто обновит значение с помощью ключа.