Flask Уникальная SQL-алхимия с Flask-LImiter
Я хочу сделать проект на flask, где вы регистрируетесь и входите в систему, а затем вы можете делать новые сообщения. Я использую flask-limiter, чтобы предотвратить создание новых постов пользователями. Также я хочу, чтобы название поста было уникальным, потому что есть страница редактирования.
Вот код flask:
def ifonly():
if current_user.name == 'admin':
return False
else:
try:
if request.method == 'POST':
title1 = request.form['title']
content2 = request.form['content']
post70 = Post.query.filter_by(title=title1).first()
if post70:
return redirect('/home')
else:
if len(title1) > 5 and len(title1) < 50 and len(content2) > 5:
global post1
post1 = Post(title=title1,content=content2,name=current_user.name,author=current_user.id)
db.session.add(post1)
db.session.commit()
return True
except:
flash("nooo")
else:
return False
@app.route('/makepost/',methods=['POST','GET'])
@limiter.limit('10 per 10 minutes',cost=ifonly)
def makepost():
allposts = Post.query.all()
sear = 1
if not current_user.is_authenticated:
return redirect('/login')
poster = Users.query.filter_by(name=current_user.name).first()
try:
if request.method == 'POST':
title = request.form['title']
content = request.form['content']
if len(title) < 5:
flash("Title must be at least 5")
if len(title) > 50:
flash("Title must be 50 characters max")
if len(content) < 5:
flash('Content must be at least 5 letters')
if len(title) > 5 and len(title) < 50 and len(content) > 5:
sear = 2
post69 = Post.query.filter_by(title=title).first()
if sear == 2:
global post1
post1 = Post(title=title,content=content,name=current_user.name,author=current_user.id)
db.session.add(post1)
db.session.commit()
if sear != 2:
flash('We couldnt make your post')
except:
pass
return render_template('posts.html')
А вот модели:
class Users(UserMixin,db.Model):
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(200),unique=True,nullable=False)
password = db.Column(db.String(200),unique=False,nullable=False)
role = db.Column(db.String(200),unique=False,nullable=False)
missions = db.Column(db.String(200),unique=False,nullable=True)
waiter = db.Column(db.String(200),unique=False,nullable=False)
posts = db.relationship('Post',backref='user')
class Post(db.Model):
id = db.Column(db.Integer,primary_key=True)
title = db.Column(db.String(200),unique=True,nullable=False)
content = db.Column(db.Text,unique=False,nullable=False)
name = db.Column(db.String(200),unique=False,nullable=False)
date_time = db.Column(db.DateTime(timezone=True),default=datetime.datetime.utcnow())
author = db.Column(db.Integer,db.ForeignKey('users.id'),unique=False)
Но когда я пишу сообщение с тем же названием, что и другое, я получаю ошибку даже с try except. Я заметил, что это происходит из-за @limiter.limit('10 per 10 minutes',cost=ifonly), и когда я удаляю эту строку или просто удаляю cost=ifonly, у меня нет этой проблемы. Но мне нужен ограничитель, поэтому я должен добавить несколько строк в функцию ifonly?
Вот полная ошибка, которую я получаю.
Traceback (most recent call last):
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\flask\app.py", line 2091, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\flask\app.py", line 2076, in wsgi_app
response = self.handle_exception(e)
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\flask\app.py", line 2073, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\flask\app.py", line 1518, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\flask\app.py", line 1516, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\flask\app.py", line 1502, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\flask_limiter\extension.py", line 1114, in __inner
self.limiter._check_request_limit(False)
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\flask_limiter\extension.py", line 989, in _check_request_limit
raise e
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\flask_limiter\extension.py", line 973, in _check_request_limit
self.__evaluate_limits(endpoint, all_limits)
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\flask_limiter\extension.py", line 937, in __evaluate_limits
if not method(lim.limit, *args, **kwargs):
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\limits\strategies.py", line 142, in hit
self.storage.incr(
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\limits\storage\memory.py", line 66, in incr
self.storage[key] += amount
TypeError: unsupported operand type(s) for +=: 'int' and 'Response'
Пожалуйста, ответьте.
Спасибо.