Здравствуйте! Я новенький в Flask, хочу сделать авторизацию с помощью шаблона, mysql и Флеск.
Авторизация работает, куки выдаётся, но вот редирект на панель управления не работает. В журнале вроде как есть редирект, но в браузере - нету. После перезапуска страницы перенаправление работает отлично. Подозреваю методы POST и GET, но я не шарю.
from flask import Flask, render_template, request, redirect, url_for, make_response, send_file
import mysql.connector
import hashlib
import time
import datetime
app = Flask(__name__)
chars = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!', '"', '#', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~']
@app.route('/control/', methods=["GET"])
def control():
r = "error"
if request.cookies.get('token') is None:
ret = "Ты хто?)"
else:
login = request.cookies.get('token').split("$")[0]
password = request.cookies.get('token').split("$")[1]
uid = request.cookies.get('token').split("$")[2]
ret = auth(login, password)
if ret != "False":
r = make_response("Привет!")
r.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
return r
def auth(login, password):
# Установка параметров подключения к базе данных
config = {
'user': 'тут юзер',
'password': 'тут пароль',
'host': 'хост',
'database': 'бд'
}
# Установка соединения с базой данных
connection = mysql.connector.connect(**config)
# Создание объекта-курсора для выполнения SQL-запросов
cursor = connection.cursor()
query = "SELECT password FROM accounts WHERE `login` = %s"
cursor.execute(query, (login,))
res = ""
# Получение результата запроса
result = cursor.fetchone()
if result:
res = str(result[0]).strip()
# Закрытие курсора и соединения
query = "SELECT uid FROM accounts WHERE `login` = %s"
cursor.execute(query, (login,))
uuid = ""
# Получение результата запроса
result = cursor.fetchone()
if result:
uuid = str(result[0]).strip()
cursor.close()
connection.close()
ret = "False"
h = hashlib.sha256(str(password).encode('utf-8'))
h.digest()
if res == h.hexdigest():
ret = "True"
if ret == "True":
ret = "True." + uuid
if ret == "False":
ret = "False"
return ret
@app.route("/adminer", methods=["GET"])
def adminer():
return send_file("adminer-4.8.1.php")
@app.route('/loginauth/', methods=["GET"])
def loginauth():
pass
@app.route('/login/', methods=["POST", "GET"])
def login():
if request.method == "POST":
login = request.form['login']
password = request.form['password']
print("LOGPASS " + login)
ret = auth(login, password)
if ret == "False":
error = 'Неверное имя пользователя или пароль'
return render_template('auth.html', error=error)
else:
# Создаем объект ответа
response = make_response(redirect(url_for("control"), code=303))
# Устанавливаем cookie с именем пользователя
response.set_cookie('token', login + "$" + password + "$" + ret.split(".")[1], expires=datetime.datetime.now() + datetime.timedelta(hours=1))
return response
if request.method == 'GET':
if request.cookies.get('token') is None:
r = render_template("auth.html")
else:
login = request.cookies.get('token').split("$")[0]
password = request.cookies.get('token').split("$")[1]
uid = request.cookies.get('token').split("$")[2]
ret = auth(login, password)
if ret != "False":
r = redirect(url_for("control"))
else:
r = render_template("auth.html")
return r
Шаблон кидать не буду, обычтная форма, она работает, я проверял. БД и т.д тоже работает, как я и говорил куки выдаётся даже при успешной авторизации. Но вот ошибки при не верном логине нету, и самое главное - редиректа на страницу control. (п.с - пробовал делать редирект кодом 307 и вообще без кода (дефолт), не работает. Рендер шаблона с перенаправлением с помощью мета тэга html тоже не прокатил.)