1, установить подушку и подготовить validatecode.py
от PIL импорта изображения, ImageFont, ImageDraw, ImageFilter импорт случайных Защиту validate_picture (): всего = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345789' # Размер изображения 130x50 ширина = 130 высота = 50 Г-н в новый объект картинка # IM = Image.new ( 'RGB', (ширина, высота), 'белый') # Установить шрифт шрифт = ImageFont.truetype ( 'C: \\ Windows, \\ Fonts \\ Calibri.ttf', 50) # Шрифт = ImageFont.load_default (). Шрифт # Создание рисованных объектов нарисовать = ImageDraw.Draw (им) str1 = '' Каждый ввод текста # для элемента в диапазоне (5): Текст = random.choice (всего) str1 + = текст draw.text ((5 + random.randint (4, 7) + 20 * Пункт, 5 + random.randint (3, 7)), текст = текст, заполнить = 'синий', шрифт = шрифт) # Нарисуйте несколько линий помех для пит в диапазоне (8): x1 = random.randint (0, ширина / 2) y1 = random.randint (0, высота / 2) x2 = random.randint (0, ширина) у2 = random.randint (высота / 2, высота) draw.line (((x1, y1), (х2, у2)), заполняют = 'черный', ширина = 1) Под # нечеткой, добавить фильтры IM = im.filter (ImageFilter.FIND_EDGES) вернуться IM, str1 если __name__ == '__main__': им, str1 = validate_picture () печать (str1)
2, подготовка функции зрения
@ Admin.route ( '/ Войти / код /') Защиту get_code (): образ, str1 = validate_picture () # Скажите капча изображение в памяти в виде двоичного кода, чтобы предотвратить фотографии помещаются в папку, занимая дисковое пространство ЬиЕ = BytesIO () image.save (ЬиЕ, 'JPEG') buf_str = buf.getvalue () # Binary как ответ отправлен обратно на фронт и установить поле заголовка ответ = make_response (buf_str) response.headers [ 'Content-Type'] = 'изображение / GIF' # Строки Верификация кода хранятся в seesion сессия [ 'изображение'] = str1 обратный ответ
3, HTML шаблон раздела
<DIV класс = "страница"> <DIV класс = "loginwarrp"> <Div класс = "логотип"> Логин администратора </ DIV> <DIV класс = "login_form"> {% Для MSG в get_flashed_messages ()%} <Р стиль = "цвет: # FF0000"> {{сбщ}} </ p> {% ENDFOR%} <Форма ID = «Войти» имя = метод «Логин» = «пост»> {{}} Form.csrf_token <Литий класс = «Логин-пункт»> <SPAN> {{form.name.label}}: </ SPAN> {{}} Form.name <Диапазон ID = "кол-тзд" класс = "ошибка"> </ SPAN> </ Li> {% Для ERR в form.name.errors%} <Устройство класса = "Col-мкр-12"> <Стиль шрифта = "цвет: # FF0000"> {{эээ}} </ FONT> </ DEV> {% ENDFOR%} <Литий класс = «Логин-пункт»> <SPAN> {{form.pwd.label}}: </ SPAN> {{}} Form.pwd <SPAN ID = "пароль-сообщ" класс = "ошибка"> </ SPAN> {% Для ERR в form.pwd.errors%} <Устройство класса = "Col-мкр-12"> <Стиль шрифта = "цвет: # FF0000"> {{эээ}} </ FONT> </ DEV> {% ENDFOR%} </ Li> <SPAN> {{form.verify_code.label}}: </ SPAN> {{}} Form.verify_code </ Li> <IMG SRC = "{{url_for ( 'admin.get_code')}}" OnClick = "this.src = '/ администратор / Логин / код?' + Math.random ()" граница = "0" класс = "verifyimg" /> <DIV класс = "clearfix"> </ DIV> <Литий класс = «Логин-суб»> <Входной тип = "отправить" имя = "Отправить" значение = "登录" /> <Тип входного = "сброса" имя = "Сброс" значение = "重置" /> </ Li> </ Форма> </ DIV> </ DIV> </ DIV>