Компилятор выдаёт ошибку на обьявление session['userLogged'] во Flask
пишу пет-проект на flask, пытаюсь сделать примитивную регистрацию, но сайт выдаёт ошибку на обьявление session['userLogged'] Мой код:
from flask import Flask, render_template, url_for, request, flash, get_flashed_messages, redirect, session
from sqlite3 import *
app=Flask(__name__)
app.secret_key='key123456789'
urls=[
{"name":"Добавить запись", "url":"/add"},
{"name":"динамический просмотр", "url":"/view/<int:id>"}
]
session['userLogged'] = False
@app.route('/login', methods=['POST', 'GET'])
def login():
if request.method=='POST':
if len(request.form['username'])>3 and len(request.form['password'])>5:
username=request.form['username']
passw=request.form['password']
db = connect('database.db')
cur = db.cursor()
cur.execute("SELECT * FROM user")
db.commit()
users = cur.fetchall()
db.close()
name_in_db=False
for i in users:
if i[1]==username and i[2]==passw:
session['userLogged']=True
else:
flash('юзернейм должен быть длиннее 3 символов, а пароль - длиннее 5!')
return render_template('log.html')
@app.route("/")
def index():
db = connect('database.db')
cur = db.cursor()
cur.execute("SELECT * FROM article")
db.commit()
articles = cur.fetchall()
db.close()
if session['userLogged']!=True:
return redirect('/login')
return render_template('index.html', title="news", urls=urls, articles=articles)
@app.route("/add", methods=['POST', 'GET'])
def add():
logged = session.get('userLogged')
if session['userLogged'] != True:
return redirect('/login')
if request.method=='POST':
if len(request.form['header']) > 3 and len(request.form['text'])>10:
db = connect('database.db')
cur = db.cursor()
cur.execute(f"INSERT INTO article (name, text) VALUES ('{request.form['header']}', '{request.form['text']}');")
db.commit()
db.close()
flash(f"все ок, статья {request.form['header']} добавлена")
else:
flash('ошибка, некорректные данные')
return render_template('add.html')
@app.route("/view/<int:id>")
def detailview(id):
logged = session.get('userLogged')
if session['userLogged'] != True:
return redirect('/login')
db = connect('database.db')
cur = db.cursor()
cur.execute(f"SELECT * FROM article WHERE id={id};")
db.commit()
article = cur.fetchone()
db.close()
return render_template('detailview.html', article=article)
@app.route("/delete/<int:id>")
def delete(id):
logged = session.get('userLogged')
if session['userLogged'] != True:
return redirect('/login')
db = connect('database.db')
cur = db.cursor()
cur.execute(f"DELETE FROM article WHERE id={id};")
db.commit()
db.close()
return redirect("/")
@app.route("/update/<int:id>", methods=['POST', 'GET'])
def update(id):
logged = session.get('userLogged')
if session['userLogged'] != True:
return redirect('/login')
db = connect('database.db')
cur = db.cursor()
cur.execute(f"SELECT * FROM article WHERE id={id};")
db.commit()
article = cur.fetchone()
db.close()
if request.method == 'POST':
if len(request.form['header']) > 3 and len(request.form['text']) > 10:
db = connect('database.db')
cur = db.cursor()
cur.execute(f"UPDATE article SET name='{request.form['header']}', text='{request.form['text']}' WHERE id={id};")
db.commit()
db.close()
flash(f"все ок, статья '{request.form['header']}' обновлена")
else:
flash('ошибка, некорректные данные')
return render_template('update.html', article=article)
@app.errorhandler(404)
def pagenotfound(error):
return render_template('error.html')
db = connect('database.db')
cur = db.cursor()
cur.execute("SELECT * FROM user")
db.commit()
users = cur.fetchall()
db.close()
for i in users:
print(i[0], i[1], i[2])
# with app.test_request_context():
# print(url_for("page", user="i"))
if __name__=="__main__":
app.run(debug=True)
Ошибка:
Traceback (most recent call last):
File "C:\projects\firstflask20-03-2024\projectflask\main.py", line 16, in <module>
session['userLogged'] = False
~~~~~~~^^^^^^^^^^^^^^
File "C:\projects\firstflask20-03-2024\projectflask\.venv\Lib\site-packages\werkzeug\local.py", line 311, in __get__
obj = instance._get_current_object()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\projects\firstflask20-03-2024\projectflask\.venv\Lib\site-packages\werkzeug\local.py", line 508, in _get_current_object
raise RuntimeError(unbound_message) from None
RuntimeError: Working outside of request context.
Я также пробовал во вью-функциях проверять session.get('userLogged') is None но там какая-то неизвестная ошибка была и ломалась программа, не менялось session['userLogged'] и меня отовсюду кидало на регистрацию