首页 > 其他 > 详细

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

时间:2019-10-24 19:24:53      阅读:99      评论:0      收藏:0      [点我收藏+]

在写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,
)

 

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

原文:https://www.cnblogs.com/gongnanxiong/p/11733898.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!