Flask-Restful在CVB模式下使用节流

在写Flask项目的时候,为了安全以及防刷等,有些接口需要通过特定的方式进行限速,如果使用Dajngo RestFramewofk,自带节流,但是对于Flask 这样一个轻量级框架来讲,这些功能都是不自带的,我们可以使用Flask-Limit来实现这一功能,首先安装:

pip install Flask-Limiter

如果是普通的Flask项目,怎么使用节流,官方已经写的很详细了,网上一搜也是一大把资料,我在这里就不多想,详细情况可以阅读官方文档:https://pypi.org/project/Flask-Limiter/0.2.1/

因为本人用Flask-Restful写后端,所以都是用的CVB模式,如果用官方的装饰器的方式完全不生效,官方文档上也没看到关于这方面的资料,网上也几乎搜索不到结果,话不多说,直接上代码

# app.py
from
flask import Flask from flask_limiter import Limiter from flask_limiter.util import get_ipaddr app = Flask(__name__) limiter = Limiter(app,key_func=get_ipaddr)
 
 
from init import  limite
from flask_restful import Resource, reqparse, request
from tools.db_seesion import fetch_to_dict
from tools.Response import response
class User(Resource):
    paser = reqparse.RequestParser()
    paser.add_argument('password', type=min_max_length_str(5, 10), required=True, help='{error_msg}')
    paser.add_argument('email', required=True, help='email is required')
    '''
        如果是CVB 模式,直接加装饰器limiter会无效,需要以这种方式才能生效,decorators 是个列表,如果需要多重限制
    '''
    decorators = [limiter.limit('5/minute', error_message='visit too fast :5/minute'),
                  limiter.limit('10/day', error_message='visit too fast :10/day')]

    @verify_token
    def get(self, username):
        user = fetch_to_dict('select id,username,email from users where username=:username', {'username': username},
                             fecth='one')
        if user:
            auth_user_id = str(request.headers.get('auth')).split(',')[1]
            if str(user.get('id')) != auth_user_id:
                return response(code=1002, msg='no permission,you can request youself only')
            return response(data=user)
        else:
            return response(code=1001, msg='user is not exits')
Flask-Limiter 自带的方法可以基于IP的方式进行节流,直接import即可
# IP获取方式
from flask_limiter.util import get_ipaddr,get_remote_address

如果想以其他的方式进行节流,比如token,userid等,自定义一个方法,返回需要节流的值即可,以下是自定义的一个简单的以userid进行节流的用法

def get_token():
    return str(request.headers.get('auth')).split(',')[0]
# app.py
from tools.authenticate import get_token

limiter = Limiter(
    app,
    key_func=get_token,
)

猜你喜欢

转载自www.cnblogs.com/gongnanxiong/p/11733898.html