Вы находитесь на странице: 1из 26

Урок № 3

Авторизация
пользователя.
Форма для ввода логина
и пароля на Python

СОДЕРЖАНИЕ
Введение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Файлы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Модуль pickle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Форма регистрации и авторизации . . . . . . . . . . . . . . . 10

Материалы к уроку прикреплены к данному PDF-файлу.


Д ля доступа к материалам необходимо открыть урок
в программе Adobe Acrobat Reader.
Авторизация пользователя. Форма для ввода логина и пароля на Python

Введение
Формы регистрации и авторизации являют-
ся важными элементами сайтов и приложений.
Корректно заполнив их, пользователи получают до-
ступ к личному кабинету, функционалу или материалам
ресурса.
Если представить общую структуру формы реги-
страции или авторизации, то она состоит минимум из
двух полей. Первое предназначено для ввода логина,
а второе – для ввода пароля.
К примеру, чтобы размещать свои проекты на
ресурсе GitHub, требуется пройти регистрацию, а затем
авторизацию, то есть ввести логин и пароль для входа.
Иначе пользователь не получит доступ к личному каби-
нету, а также репозиторию (рис. 1).

Рисунок 1

3
Урок № 3

Ресурс для игрового обучения CheckIo не предоста-


вит доступ к игре до тех пор, пока пользователь не вой-
дет в систему (рис. 2).

Рисунок 2

Также необходимо ввести данные аккаунта для вхо-


да в сервис для игр Steam, чтобы скачать приобретен-
ную игру (рис. 3).

Рисунок 3

На этом занятии нам предстоит разработать соб-


ственную форму регистрации и авторизации на язы-
ке Python.
4
Авторизация пользователя. Форма для ввода логина и пароля на Python

Файлы
В процессе разработки программы потребуется
сохранять логин и пароль. Для этого подойдет файл
типа .txt.
Язык Python имеет огромный набор инструментов
для работы с кодом. Помимо внешних модулей, которые
мы импортировали с помощью инструкции import, су-
ществуют установленные по умолчанию функции. Так,
в языке Python есть встроенные средства для чтения,
изменения и записи файлов.
Создайте в папке с проектом файл test.txt. Добавь-
те в этот файл текст, например, названия динозавров
(рис. 4):
Anzu
Iguanacolossus
Gigantoraptor
Triceratops

Рисунок 4

5
Урок № 3

Теперь считаем этот файл и выведем в консоль со-


держимое.
Обратиться к документу можно с помощью функ-
ции open(). После того как файл будет открыт, к нему
можно применять разные методы, например, чтение
read() или запись write(). Выполнив все необхо-
димые действия с документом, его нужно закрыть, ис-
пользуя функцию close():
f = open('test.txt')
dino = f.read()
print(dino)
f.close()

В результате в консоль будет выведено все содержи-


мое файла:
Anzu
Iguanacolossus
Gigantoraptor
Triceratops
Файл можно открыть только для чтения, для чтения
и записи, а также для чтения и записи в двоичном режи-
ме. Для этого существуют дополнительные аргументы,
с помощью которых можно указать режим, например,
для чтения указываем после имени файла 'r':
f = open('test.txt', 'r')
while True:
dino = f.read(1024)
print(dino)

6
Авторизация пользователя. Форма для ввода логина и пароля на Python

if not dino:
break
f.close()

Результат будет аналогичным:


Anzu
Iguanacolossus
Gigantoraptor
Triceratops
В файл также можно записывать данные. К примеру,
файл можно открыть для записи 'w' или для чтения и
записи 'r+'. Можно добавлять значения в конец, ука-
зав режим 'a+'.
Добавим в конец несколько строк:
f = open('test.txt', 'a+')
for i in range(3):
f.write('\nnew line' + str(i))
f.close()

Применяя различные методы, можно выполнять


любые операции с файлами.

Модуль pickle
Модуль pickle является полезным инструментом
для работы с данными, хотя и имеет достаточно забав-
ное название (в переводе с английского pickle – это кон-
сервированный огурец).

7
Урок № 3

Библиотека позволяет выполнять сериализа-


цию и десериализацию структуры данных (pickling/
unpickling), дословно  –  консервация и расконсервация
(рис. 5).

Рисунок 5

Подробнее разберемся, что выполняет данная би-


блиотека.
Сериализация – это перевод данных в последова-
тельность байтов. Десериализация  –  обратный про-
цесс, то есть восстановление структуры данных из по-
следовательности байтов.
Байт – это единица измерения объема памяти, ко-
торая использует для описания информации только
две цифры – 0 и 1.
Подобная система счисления называется двоич-
ной, поскольку оперирует двумя символами. С помо-
щью комбинации нулей и единиц можно описать раз-
личные числа. К примеру, числу 0 будет соответствовать
запись 0000, а число 4 в двоичной системе будет пред-
ставлено комбинацией 0100.
Создадим словарь, содержащий названия городов
и соответствующих штатов. Используя модуль pickle,
выполним сериализацию и десериализацию данных, а
результат выведем в консоль:
8
Авторизация пользователя. Форма для ввода логина и пароля на Python

import pickle

original = {'Illinois': 'Aurora',


'Massachusetts': 'Boston',
'Florida': 'Orlando'}
pickled = pickle.dumps(original)
identical = pickle.loads(pickled)

print('Original: ', original,


'\nPicked: ', pickled,
'\nIdentical: ', identical)

В консоль будет выведена следующая информация:


Original: {'Illinois': 'Aurora', 'Massachusetts':
'Boston', 'Florida': 'Orlando'}
Picked:
b'\x80\x03}q\x00(X\x08\x00\x00\x00Illinoisq\
x01X\x06\x00\x00\x00Auroraq\x02X\r\x00\x00\
x00Massachusettsq\x03X\x06\x00\x00\x00Bostonq\
x04X\x07\x00\x00\x00Floridaq\x05X\x07\x00\x00\
x00Orlandoq\x06u.'
Identical: {'Illinois': 'Aurora', 'Massachusetts':
'Boston', 'Florida': 'Orlando'}
Соответственно, данные до и после сериализации
не отличаются. Из этого следует, что данный процесс не
влияет на исходную информацию.
Преобразование данных в поток байтов позволит
записывать данные в файл, в нашем случае это будет ло-
гин и пароль. В связи с этим модуль pickle часто ис-
пользуют для сохранения и загрузки сложных объектов.
9
Урок № 3

Форма
регистрации и авторизации
Перейдем к разработке собственной формы реги-
страции и авторизации на Python.
Установим фоновое изображение для окна, а также
оформим виджеты (рис. 6-7).

Рисунок 6

10
Авторизация пользователя. Форма для ввода логина и пароля на Python

Рисунок 7

Подключим модуль tkinter и pickle прежде, чем


начнем писать основной код программы:
from tkinter import *
from tkinter import messagebox
import pickle

11
Урок № 3

Также создадим две переменные, с помощью кото-


рых будем устанавливать высоту и ширину экрана:
HEIGHT = 550
WIDTH = 550

Затем будут следовать функции. Объявим их, а к на-


полнению перейдем позже:
def registration():

def signup():

def save():

def login_form():

def login_pass():

Создадим новое окно и укажем его название. Зада-


дим высоту и ширину окна, воспользовавшись перемен-
ными. Запретим пользователю самостоятельно менять
размер окна с помощью метода resizable(False,
False):
root = Tk()
root.title('Login Form')
root.geometry("%dx%d" % (WIDTH, HEIGHT))
root.resizable(False, False)

12
Авторизация пользователя. Форма для ввода логина и пароля на Python

По умолчанию для всех виджетов задан определен-


ный стиль оформления, однако его с легкостью можно
изменить.
Вызовем метод option_add(), который позволяет
задать пользовательский шрифт и цвет фона:
root.option_add('*Font', 'Calibri')
root.option_add('*Background', 'white')

Теперь шрифтом всех элементов будет 'Calibri', а


белый будет цветом фона для меток и кнопок.
Установим для главного окна программы фоновое
изображение. Подберем подходящее изображение и
переместим файл с бэкграундом вместе с проектом в
папку img. Изображение будет расположено в виджете
Label, разместим его в окне помощью метода place().
Метод указывает виджету его положение относи-
тельно родительского элемента, то есть главного окна:
img = PhotoImage(file='img/bg2.gif')
background_label = Label(root, image=img)
background_label.place(relwidth=1, relheight=1)

В метод place() передали параметры relwidth=1,


relheight=1. Первый из них задает ширину, а вто-
рой – высоту относительно родительского элемента, то
есть изображение займет все пространство окна (см.
рис. 8 на стр. 14).

13
Урок № 3

Рисунок 8

Разместим в главном окне две кнопки, с помощью


которых сможем переключаться между двумя формами.
Одна из них предназначена для создания учетной запи-
си, а вторая – для входа.
Кнопки можно разместить как угодно, воспользо-
вавшись для этого методом place():
button_signup = Button(root, text='SIGN UP',
bg='gold', command=registration)
button_signup.place(relx=0.2, rely=0.1,
relwidth=0.3)

button_signin = Button(root, text='SIGN IN',


bg='gold', command=login_form)
button_signin.place(relx=0.5, rely=0.1,
relwidth=0.3)

В данном коде мы создали кнопки главного окна.


Для первой из них указали параметр relx=0.2, задали
14
Авторизация пользователя. Форма для ввода логина и пароля на Python

положение элемента относительно оси X. Важно заме-


тить, что данное значение может быть от 0 до 1, то есть
0.1, 0.2, 0.25 и т. д. По оси Y мы разместили элемент с
помощью параметра rely=0.1. Наконец, указали ши-
рину для кнопки с помощью параметра relwidth=0.3.
По нажатию на кнопку должна открываться соответ-
ствующая форма, для этого мы задали две команды:
command=registration и command=login_form.
Затем вызываем метод mainloop(), который вы-
зывает главный цикл программы и отображает главное
окно программы:
root.mainloop()

Созданное окно будет выглядеть, как на рисунке 9.

Рисунок 9

15
Урок № 3

Приступим к созданию функций, одна из кото-


рых будет реализовывать процесс регистрации, а вто-
рая – авторизации.
Начнем с регистрации пользователя. Чтобы фор-
ма органично выглядела в окне, создадим фрейм. Все
виджеты, среди которых текстовые метки, поле ввода и
кнопки, будут расположены внутри этого фрейма. По-
скольку мы изменили цвет фона, то для всех виджетов
он будет белым:
def registration():
label_error = None

frame = Frame(root, bd=10)


frame.place(relx=0.5, rely=0.2, relwidth=0.7,
relheight=0.6, anchor='n')

# Sign in text label


label = Label(frame, text='Sign Up', font='16')
label.place(relwidth=1, relheight=0.1)

# Login
label_login = Label(frame, text='Login: ')
label_login.place(rely=0.2, relwidth=0.35,
relheight=0.1)

login_register = Entry(frame)
login_register.place(relx=0.4, rely=0.2,
relheight=0.1, relwidth=0.55)

16
Авторизация пользователя. Форма для ввода логина и пароля на Python

# Password
label_password1 = Label(frame, text='Password: ')
label_password1.place(rely=0.4, relwidth=0.35,
relheight=0.1)

password1 = Entry(frame, show='*')


password1.place(relx=0.4, rely=0.4,
relheight=0.1, relwidth=0.55)

# Confirm password
label_password2 = Label(frame, text='Confirm
password: ')
label_password2.place(rely=0.6, relwidth=0.35,
relheight=0.1)

password2 = Entry(frame, show='*')


password2.place(relx=0.4, rely=0.6,
relheight=0.1, relwidth=0.55)

# Button
button = Button(frame, text='Sign up',
command=lambda: signup())
button.place(relx=0.3, rely=0.8, relheight=0.15,
relwidth=0.5)

Переменная label_error понадобится, чтобы вы-


водить информацию об ошибках. Ее мы будем исполь-
зовать немного позже.
17
Урок № 3

На данном этапе мы создали форму регистрации.


Благодаря параметру show='*' во время ввода пароля
в поле Entry пользователь увидит только символ *.
При нажатии кнопки 'Sign up', должна быть вы-
звана функция signup(). Данная функция будет вы-
полнять проверку данных, который ввел пользователь.
Мы должны проверить, введен ли логин, содержит ли
пароль более 6 символов, а также совпадают ли пароль
1 и пароль 2. Если все введено корректно, сохраняем па-
роль в файл, иначе сообщаем об ошибке (рис. 10):
def signup():
nonlocal label_error
error = ''

if label_error:
label_error.destroy()

# Error label
if len(login_register.get()) == 0:
error = '*login error'
elif len(password1.get()) < 6:
error = '*your password needs to be at least
6 character'
elif not password1.get() == password2.get():
error = '*password error'
else:
save()
label_error = Label(frame, text=error, fg='red')
label_error.place(rely=0.7)

18
Авторизация пользователя. Форма для ввода логина и пароля на Python

Рисунок 10

Как только все данные введены правильно, сохраня-


ем пароль в текстовый документ.
Логин и пароль будем хранить в этом файле:
def save():
data = dict()
data[login_register.get()] = password1.get()
f = open('login.txt', 'wb')
pickle.dump(data, f)
f.close()
login_form()

19
Урок № 3

Таким же образом создаем форму входа. Для данной


формы понадобятся поля для логина и пароля:
def login_form():
frame = Frame(root, bd=10)
frame.place(relx=0.5, rely=0.2, relwidth=0.7,
relheight=0.6, anchor='n')

# Sign in text label


label = Label(frame, text='Sign In', font='16')
label.place(relwidth=1, relheight=0.1)

# Login
label_login = Label(frame, text='Login: ')
label_login.place(rely=0.2, relwidth=0.35,
relheight=0.1)

enter_login = Entry(frame)
enter_login.place(relx=0.4, rely=0.2,
relheight=0.1, relwidth=0.55)

# Password
label_password = Label(frame, text='Password: ')
label_password.place(rely=0.4, relwidth=0.35,
relheight=0.1)

enter_password = Entry(frame, show='*')


enter_password.place(relx=0.4, rely=0.4,
relheight=0.1, relwidth=0.55)

20
Авторизация пользователя. Форма для ввода логина и пароля на Python

button = Button(frame, text='Sign in',


command=lambda: login_pass())
button.place(relx=0.3, rely=0.8, relheight=0.15,
relwidth=0.5)

Форма готова! Теперь пользователь может ввести


логин и пароль (рис. 11).

Рисунок 11

Как только пользователь нажмет кнопку 'Sign


in', нужно будет проверить, присутствуют ли введен-
ные данные в базе.

21
Урок № 3

В зависимости от результата проверки, нужно вы-


вести информационное окно. Такое окно создается с
помощью модуля messagebox. Отдельно импортируем
данный модуль несмотря на то, что он встроен в пакет
tkinter.
Модуль messagebox содержит несколько методов
для создания диалоговых окон. К примеру, showinfo()
создаст новое информационное окно, а showerror()
позволит сообщить об ошибке (рис. 12-13).
def login_pass():
f = open('login.txt', 'rb')
a = pickle.load(f)
f.close()
if enter_login.get() in a and enter_password.
get() == a[enter_login.get()]:
messagebox.showinfo('Welcome', 'Welcome
to the Game.')
else:
messagebox.showerror('Error!', 'Invalid
login or password')

Рисунок 12

22
Авторизация пользователя. Форма для ввода логина и пароля на Python

Рисунок 13

Подобную форму вы можете кастомизировать,


изменив стили и оформление.

Только взгляните, какие интересные формы автори-


зации были разработаны для различных приложений и
игр (рис. 14-16)!

Рисунок 14

23
Урок № 3

Рисунок 15

Рисунок 16

24
Урок № 3
Авторизация пользователя.
Форма для ввода логина и пароля
на Python

© Компьютерная Академия ШАГ


www.itstep.org

Все права на охраняемые авторским правом фото-, аудио- и видеопроизведения,


фрагменты которых использованы в материале, принадлежат их законным владель-
цам. Фрагменты произведений используются в иллюстративных целях в объёме,
оправданном поставленной задачей, в рамках учебного процесса и в учебных целях,
в соответствии со ст. 1274 ч. 4 ГК РФ и ст. 21 и 23 Закона Украины «Про авторське
право і суміжні права». Объём и способ цитируемых произведений соответствует
принятым нормам, не наносит ущерба нормальному использованию объектов
авторского права и не ущемляет законные интересы автора и правообладателей.
Цитируемые фрагменты произведений на момент использования не могут быть
заменены альтернативными, не охраняемыми авторским правом аналогами, и
как таковые соответствуют критериям добросовестного использования и честного
использования.
Все права защищены. Полное или частичное копирование материалов запрещено.
Согласование использования произведений или их фрагментов производится
с авторами и правообладателями. Согласованное использование материалов
возможно только при указании источника.
Ответственность за несанкционированное копирование и коммерческое исполь-
зование материалов определяется действующим законодательством Украины.

Вам также может понравиться