Хочу сделать отправку постов с валидацией по капче в 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")