Хочу сделать отправку постов с валидацией по капче в flask, но при отправке капча перезагружается и не совпадает с введённой в форме

Проще говоря: у меня есть код, который отправляет и сохраняет посты с помощью flask и есть код, который выдаёт капчу. Оба работают по отдельности, не знаю, как сделать, чтобы работали вместе.

Код из туториала по flask:

@bp.route("/create", methods=("GET", "POST"))
@auth.login_required
def create():
    """Create a new post for the current user."""

    if flask.request.method == "POST":
        title = flask.request.form["title"]
        body = flask.request.form["body"]
        capcha_value = captcha.get_captcha()
        user_captcha = flask.request.form["captcha"]
        error = None
        print('user_captcha:', user_captcha)
        print('capcha_value:', capcha_value)

        if user_captcha != capcha_value:
            error = 'Wrong captcha, try again.'  # Вот эта ошибка постоянно выскакивает.

        if error is not None:
            flask.flash(error)
        else:
            database = db.get_db()
            database.execute(
                "INSERT INTO post (title, body, author_id)"
                + " VALUES (?, ?, ?)",
                (title, body, flask.g.user["u_id"]))
            database.commit()
            return flask.redirect(flask.url_for("blog.index"))

    return flask.render_template("blog/create.html")

Код формы:

    <div class="image-container">
      <img src="{{ url_for('static', filename='captcha.gif') }}"></a>
    </div>
    <input name="captcha" id="captcha" value="{{ request.form['captcha'] }}" required><br>
    <input type="submit" value="Send">
  </form>

Код капчи:

import random

from PIL import Image, ImageDraw

def get_captcha():
    my_captcha = Captcha()
    capcha_value = my_captcha.make_captcha()
    return capcha_value
    
class Captcha:
    population = 'abcdefghi0123456789jklmnopqrstuvwxyz'
    save_folder = __file__.rsplit('/', 1)[0] + '/static/'

    def __init__(self, img_length=90, img_width=60, max_symb_length=8):
        self.img_length = img_length
        self.img_width = img_width
        self.max_symb_length = max_symb_length

    def make_captcha(self):
        k = random.randint(3, self.max_symb_length)
        random_string = ''.join(random.choices(self.population, k=k))
        img = Image.new('RGBA', (self.img_length, self.img_width), (0, 0, 0))
        draw = ImageDraw.Draw(img)
        draw.text(
            (random.randint(0, self.img_length - self.max_symb_length*6),
             random.randint(0, self.img_width - 10)),
            random_string, fill=(38, 38, 38)
            )
        rand_l = lambda: (
            random.randint(0, self.img_length),random.randint(0,self.img_width)
            )
        for i in range(0, random.randint(3, 6)):
            draw.line((rand_l(), rand_l()), fill=(38, 38, 38),
                      width=random.randint(0, 2))
        for i in range(0, random.randint(5, 15)):
            draw.point((rand_l(), rand_l(), rand_l(), rand_l(), rand_l()),
                       fill=(38, 38, 38))
        img.save(self.save_folder + 'captcha.gif', 'GIF', transparency=0)
        return random_string

Ответы (1 шт):

Автор решения: Ilya

Ничего лучше не придумал, как добавить такую функцию. Вроде работает.

@bp.route("/create")
def f_c():
    global captcha_value
    captcha_value = captcha.get_captcha()
    return flask.render_template("blog/create.html")
→ Ссылка