питон колба осуществить логин CAPTCHA, с подушкой

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>


рекомендация

отblog.51cto.com/12080420/2400408
рекомендация