Как сделать проверку пользователя в базе данных Sql Python
Всем привет такой вопрос я создал бота в телеграмм и хочу чтобы данные из бота были доступны только авторизированным пользователям. Я сделал бота в котором при вводе команды /start выдаётся две кнопки 1)(Зарегистрироваться 2) Войти
Регистрация проходит нормально и всё добавляется в базу SQL по такому коду
А вот когда нажимаешь войти бот должен проверить есть ли такой пользователь по user_id в бд если есть то выдать дальнейшие действия бота а если нет то просто выдать ошибку. Это я расписал вот так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
user_data = {} @bot.message_handler(commands=['Войти']) def process_description_step(message): try: user_id = message.from_user.id user = user_data[user_id] user.description = message.text # Проверка есть ли пользователь в БД sql = "SELECT * FROM users WHERE user_id = ".format(user_id) cursor.execute(sql) existsUser = cursor.fetchone() markup = types.ReplyKeyboardRemove(selective=False) bot.send_message(message.chat.id, "Вы успешно вошли в базу бота") bot.register_next_step_handler(msg, process_baza_step) except Exception as e: bot.reply_to(message, 'oooops')
а вот так выглядит база данных
Как реализовать авторизацию в sql на питон?
Здраствуйте, хочу реализовать авторизацию в SQLite 3 на питон, но не знаю как проверить принадлежит ли пароль к пользователю, если да то пустить в систему, а если нет то отправить сообщение что пароль не верный
import sqlite3 from random import randint global enter help = "Command List: /help - Show full list of commands, /new_user - Create new user, /login - Login to user, /casino - Play casino" global db global sql db = sqlite3.connect('data.db') sql = db.cursor() sql.execute("""CREATE TABLE IF NOT EXISTS users ( login TEXT, password TEXT, birthday_year BEGIN, birthday_month BEGIN, user_birthday_day BEGIN, gender TEXT, cash BEGIN )""") def login(): user_login = input("Enter login: ") user_password = input("Enter password: ") sql.execute(f"SELECT login FROM users WHERE login = ''") if sql.fetchone() is None: print("This user does not exist") main() elif sql.execute(f"SELECT login FROM users WHERE login = ''") != sql.fetchone() is None: print('1') def reg(): user_login = input("Enter login: ") user_password = input("Enter password: ") user_birthday_year = int(input("Enter birthday year: ")) user_birthday_month = int(input("Enter birthday month: ")) user_birthday_day = int(input("Enter birthday day: ")) user_gender = input("Enter gender (f-female or m-male): ") if user_birthday_year > 1897 and user_birthday_year < 2022: if user_birthday_month >0 and user_birthday_month < 13: if user_birthday_day >0 and user_birthday_day < 32: if user_gender == 'f' or user_gender == 'm': abc(user_login, user_password, user_birthday_year, user_birthday_month, user_birthday_day, user_gender) else: print('Carefully check the correctness of the data you entered') reg() db.commit() def main(): print(help) enter = input("Enter the command: ") if enter == '/help': print(help) elif enter == '/new_user': reg() elif enter == '/login': login def abc (user_login, user_password,user_birthday_year, user_birthday_month, user_birthday_day, user_gender): sql.execute(f"SELECT login FROM users WHERE login = ''") if sql.fetchone() is None: sql.execute(f"INSERT INTO users VALUES (?, ?, ?, ?, ?, ?, ?)", (user_login, user_password, user_birthday_year, user_birthday_month, user_birthday_day, user_gender, 0)) db.commit() print('You have successfully registered') main() else: print('Such a record already exists') main() main()
Проверка пароля и подтверждение регистрации
Метод authenticate ищет пользователя по всем бэкендам авторизации по переданным параметрам. Вообще если заглянуть в документацию, то можно увидеть, что по умолчанию туда должен передаваться username и password (это для бэкенда ModelBackend, если вы ничего не меняли в этом плане, то ваш код не заработает).
У вас же я предполагаю, что в базе хранится некоторый email_check_code, который является, ну скажем, случайной строкой из N символов. Вы отправляете на почту пользователю некоторую ссылку, которая содержит в себе этот email_check_code, а для соответствующего пользователя записываете это значение в базу. Перешедший по этой ссылке пользователь должен увидеть сообщение, что его email подтверждён.
Из схемы выше понятно, что входными параметрами у нас являются только email_check_code (и никак не пароль). Соответственно метод authenticate нам не подходит.
Идём дальше. Реализовать это можно достаточно просто. Допустим, что вы создали некоторую related таблицу на таблицу пользователей и храните там два значения - user и email_check_code, а у пользователя пока он не подтвердит email выставляется is_active = False (ну чтоб он войти не смог). Соответственно во вьюхе нам надо проверить email_check_code, найти этого пользователя и поставить ему is_active = True. Ну и для пущего комфорта удалить инстанс этой модели с кодом (чтоб второй раз не переходил по этой же ссылке).
from django.contrib.auth import get_user_model from .models import EmailCodeModel def confirm_user(request): if request.method == 'POST': code_instance = EmailCodeModel.objects.filter(email_check_code=request.GET.get('email_check_code')).first() if code_instance: code_instance.user.is_active = True code_instance.user.save() code_instance.delete() print('Всё хорошо') # тут можно сделать, например, redirect на страницу успеха return render(request, 'check.html')
Всё ещё не уверены? Посмотрите как это реализовано в django-registration-redux. А ещё лучше не утруждайте себя этим и используйте это дополнение - для простейших случаев регистрации и подтверждения email это прям то, что вам нужно (используйте backend default).