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'

Пожалуйста, ответьте.

Спасибо.

Вернуться на верх