Ошибка имени: имя «logged» не определено, Flask Python

#python #variables #flask

#python #переменные #flask

Вопрос:

У меня есть код на Python с использованием framework Flask, который проверяет, зарегистрирован ли администратор (logged = True) для отображения страницы администратора, если администратор не зарегистрирован (logged = False), перенаправляя на страницу входа.

 @app.route('/admin_login', methods=['POST', 'GET'])
def admin_login():
    if request.method == 'POST':
        login = request.form['login']
        passsword = request.form['password']

        if (login == 'admin') and (passsword == 'admin_pass'):
            logged = True
            return redirect('/admin_page'), logged
        else:
            return "Wrond login and passsword!"

    else:
        return render_template('admin_login.html')


@app.route('/admin_page')
def admin_page():
    if logged == True:
        return render_template('admin_page.html')
    else:
        return redirect('/admin_login')
  

Но я получаю сообщение об ошибке в if logged == True: NameError: name 'logged' is not defined . Я пытался сделать logged глобальный, но это не помогло. Итак, как я могу logged определить и использовать его в функции admin_page ?

Комментарии:

1. Глобальная переменная на веб-сервере не имеет смысла. Если вы выполнили эту работу, то, если кто -либо вошел в систему как администратор, тогда любой другой может свободно посещать /admin_page !

2. Я знаю это, я просто хочу знать, как использовать возвращенные logged в других функциях

Ответ №1:

Вам следует избегать наличия глобальной logged_in переменной на сервере. Тогда любому будет разрешено использовать ваш веб-сайт после успешного входа в систему! Вместо этого вы должны использовать переменную сеанса.

Данные сеанса хранятся поверх файлов cookie и зашифрованы. Для этого шифрования приложению Flask требуется определенный SECRET_KEY. Объект сеанса также является объектом словаря, содержащим пары ключ-значение.

Добавьте это в начало вашего основного скрипта, если вы его еще не получили:

 from flask import Flask, session, redirect, url_for, escape, request, flash
app = Flask(__name__)
app.secret_key = 'any random string’
  

Затем измените свою функцию admin_login() , чтобы установить переменную сеанса:

 @app.route('/admin_login', methods=['POST', 'GET'])
def admin_login():
    if request.method == 'POST':
        login = request.form['login']
        passsword = request.form['password']

        if not 'logged_in' in session:
            if (login == 'admin') and (passsword == 'admin_pass'):
                session['logged_in'] = True
                return redirect(url_for("admin_page"))
            else:
                flash("Wrong login and passsword!")
                return render_template('admin_login.html')
        else:
            return redirect(url_for("admin_page"))

    else:
        if "logged_in" in session:
            return redirect(url_for("admin_page"))

        return render_template("admin_login.html")
  

Затем измените свою admin_page() функцию, чтобы проверить эту переменную сеанса:

 @app.route('/admin_page')
def admin_page():
    if 'logged_in' in session:
        return render_template('admin_page.html')
    else:
        return redirect(url_for('admin_login'))
  

Вам также потребуется конечная точка выхода из системы, чтобы вывести переменную сеанса:

 @app.route('/logout')
def logout():
   session.pop('logged_in', None)
   return redirect(url_for('index'))