zoukankan      html  css  js  c++  java
  • Flask Rest接口

     Flask适用于简单的接口请求

    安装 

    pip install Flask

    pip install Flask-RESTful

     仅简单请求url,然后出发处理程序,返回处理结果

    app.py代码如下

    from flask import Flask,jsonify

    from flask_restful import Api,Resource,request,reqparse

    from sqlalchemy import create_engine

    from local_settings import SQLALCHEM

    import logging,datetime

     

    logger=logging.getLogger('my_app')

    app=Flask(__name__)

    api=Api(app)

    class ProceListAPI(Resource):
        def __init__(self):
            self.engine=create_engine(alchemy_conf,pool_size=5,max_overflow=0,pool_recycle=7*60)     # 初始化全局的数据库连接池

            self.reqparse=reqparse.RequestParser()

            self.reqparse.add_argument('subid',action='append',dest='cart_code',type=int,required=True,help='subid is needed!',location='form')

            self.reqparse.add_argument('description',type=str,default="",location='json')      # 配置 哪些入参是什么格式,在什么位置,dest表示别名

            supper(PriceListAPI,self).__init__()

        def get(self):     #flask的api类中的所有get请求经过 get方法 ,post请求 经过post方法

            logger.warning('request form:{},num:{}'.format(request.args,type(request.args.get('subid'))))

            cart_code = request.args.get('subid')

            if not cart_code:
                return {'error':'subid is Rquired!'}

            cart_code=cart_code.split(',')

            with self.engine.connect() as conn:

                result = conn.execute('select distinct cart_code,price from price_store where collect_time>=curdate();')

                datas=result.fetchall()

            dup_dict={}

            for d in datas:
                if d[0] in cart_code:

                    dup_dict[d[0]]=(d[0],d[1])

           return dup_dict

        def post(self):

            args=self.reqparse.parse_args()

            cart_code=args['cart_code']

            if not cart_code:

                return {'error':'subid is Required!'}

            return {'cart_code':cart_code}

    api.add_resource(PriceListAPI,'./price/',endpoint='stores')       #定义class类 对应的url

    if __name__ == '__main__':

        app.run(debug=True,port=5091,houst='0.0.0.0')

    通过 python app.py就可以运行 

    给API class添加装饰器 ,在每次请求处理前先进行验证 ,如常用的验证 Headers中的Authorization字段

    将app_key和app_secret融合 加密到组成 Authorization的值,来判断用户是否为合法用户

    首先需要定义一个装饰器函数

    from functools import wraps 

    def my_authenticate(func):

        @wraps(func)

        def wrapper(*args,**kwargs):

            authen = request.headers.get('Authorization')

            if not authen:
                return {"code":403,"message":"Authenticated Error","data":{"isEnabled":0}},403

            logger.warning('authen:%s'%(authen))

            encode_authen=authen.encode('utf-8')

            decode_authen = base64.b64decode(encode_authen)

            app_key,app_sign,timestamp = decode_authen.decode('utf-8').split(';')

            now = time.time()

            if now-float(timestamp)>2*60:

                return {"code":403,"message":"Authenticated expired","data":{"isEnabled":0}},403

            if app_key != APP_KEY:

                return {"code":403,"message":"Authenticate app_key error","data":{"isEnabled":0}},403

            md5_obj = hashlib.md5()

            content = app_key+APP_SECRET+timestamp

            md5_obj.update(content.encode('utf-8'))

            my_sign=md5_obj.hexdigest()

            if app_sign==my_sign:

                logger.info("authen ok!")

                return func(*args,**kwargs)

            return {"code":403,"message":"Authenticated Error","data":{"isEnabled":0}},403

        return wrapper

    然后在class ProceListAPI(Resource)的开头加上  decorators=[my_authenticate]

    如:

    class ProceListAPI(Resource):

        decorators=[my_authenticate]

        def __init__(self):

            self.reqparse=reqparse.RequestParser()

    ....

    这样就相当于给类ProceListAPI的每个方法都加上了装饰器 my_authenticate

  • 相关阅读:
    .net String.Format数字格式化输出
    sql prompt5安装好了,也破解完成了,然后到SQL里面还是没有提示是为什么?
    DataSet筛选数据然后添加到新的DataSet中引发的一系列血案
    .net 时间戳互相转换(精确到毫秒)
    记录一次MVC 3.0错误 HTTP 404您正在查找的资源(或者它的一个依赖项)可能已被移除,或其名称已更改,或暂时不可用。请检查以下 URL 并确保其拼写正确。
    IIS7部署项目时提示:"错误消息 401.2。: 未经授权: 服务器配置导致登录失败。"的解决办法
    IIS发布网站出现“未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项。”的解决方法
    微信支付(APP)集成时碰到的问题(.net提示“无权限”、iOS跳转到微信支付页面中间只有一个“确定”按钮)
    由SpringMVC中RequetContextListener说起
    关于cas-client单点登录客户端拦截请求和忽略/排除不需要拦截的请求URL的问题(不需要修改任何代码,只需要一个配置)
  • 原文地址:https://www.cnblogs.com/Ting-light/p/11640288.html
Copyright © 2011-2022 走看看