Flask-RESTful——限流

一、Flask-RESTful如何限流?

如果是普通的Flask项目,怎么使用节流,官方已经写的很详细了官网详解

二、FBV——限流

from flask import Flask
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address

app = Flask(__name__)
limiter = Limiter(
    app,
    key_func=get_remote_address,
    default_limits=["200 per day", "50 per hour"]
)
@app.route("/slow")
@limiter.limit("1 per day")
def slow():
    return ":("

@app.route("/medium")
@limiter.limit("1/second", override_defaults=False)
def medium():
    return ":|"

@app.route("/fast")
def fast():
    return ":)"

@app.route("/ping")
@limiter.exempt
def ping():
    return "PONG"

上面的Flask应用将具有以下速率限制特征:

通过请求的remote_address进行速率限制
默认速率限制为每天200,每小时50,适用于所有路线。
slow具有明确的速率限制修饰符的路由将绕过默认速率限制,并且每天仅允许1个请求。
该medium路由继承默认限制,并增加了每秒1个请求的修饰限制。
该ping路由将不受任何默认速率限制的约束。

二、CBV——限流

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')
IP方式节流
# IP获取方式
from flask_limiter.util import get_ipaddr,get_remote_address
其它方式节流
def get_token():
    return str(request.headers.get('auth')).split(',')[0]

from tools.authenticate import get_token

limiter = Limiter(
    app,
    key_func=get_token,
)
发布了128 篇原创文章 · 获赞 0 · 访问量 2489

猜你喜欢

转载自blog.csdn.net/qq_41134008/article/details/105667323