zoukankan      html  css  js  c++  java
  • flask-restful

    pip install flask-restful
    

      使用

    from flask import Flask
    from flask_restful import Api,Resource
    
    app = Flask(__name__)
    api = Api(app)#这里可以传Flask对象或者蓝图对象
    
    class Helloworld(Resource):
        def post(self):
            return {'msg':"hello post world"}
        def get(self):
            return {'msg':'hello get world'}
    
    api.add_resource(Helloworld,'/',endpoint='hello')#参数:视图类名 路由地址 endpoint 别名
    
    if __name__ == '__main__':
        app.run()

    使用method_decorators添加装饰器

    • 为类视图中的所有方法添加装饰器
      def decorator1(func):#装饰器一
          def wrapper(*args, **kwargs):
              print('decorator1')
              return func(*args, **kwargs)
          return wrapper
    
    
      def decorator2(func):#装饰器二
          def wrapper(*args, **kwargs):
              print('decorator2')
              return func(*args, **kwargs)
          return wrapper
    
    
      class DemoResource(Resource):
          method_decorators = [decorator1, decorator2]#为所有请求方法加装饰器 排后面的装饰器套在越外层
    
          method_decorators = {#为视图中不同方法加不同的装饰器
              'get': [decorator1, decorator2],
              'post': [decorator1]
          }
    
          def get(self):
              return {'msg': 'get view'}
    
          def post(self):
              return {'msg': 'post view'}

    请求处理

    关于请求处理

    Flask-RESTful提供了RequestParser类,用于帮助我们检验和转换请求数据。

    from flask_restful import reqparse
    
    parser = reqparse.RequestParser()
    parser.add_argument('rate', type=int, help='Rate cannot be converted', location='args')
    parser.add_argument('name')
    args = parser.parse_args()

    使用步骤:

    1. 创建RequestParser对象

    2. RequestParser对象中添加需要检验或转换的参数声明

    3. 使用parse_args()方法启动检验处理

    4. 检验之后从检验结果中获取参数时可按照字典操作或对象属性操作

      args.rate
      或
      args['rate']

    参数说明

    required

    描述请求是否一定要携带对应参数,替换为False

    • 真正的强制要求携带

      若未携带,则校准失败,向客户端返回错误信息,状态码400

    • 错误不强制要求携带

      若不强制携带,在客户端请求未携带参数时,收回估计无

    class DemoResource(Resource):
        def get(self):
            rp = RequestParser()
            rp.add_argument('a', required=False)
            args = rp.parse_args()
            return {'msg': 'data={}'.format(args.a)}

    2 help

    参数检验错误时返回的错误描述信息

    rp.add_argument('a', required=True, help='missing a param')

    action

    描述对于请求参数中出现多个同名参数时的处理方式

    • action='store' 保留出现的第一个,默认
    • action='append' 以列表追加保存所有同名参数的值
    rp.add_argument('a', required=True, help='missing a param', action='append')

    4 type

    描述参数应该匹配的类型,可以使用python的标准数据类型string,int,也可以使用Flask-RESTful提供的检验方法,还可以自己定义

    • 标准类型

      rp.add_argument('a', type=int, required=True, help='missing a param', action='append')
    • Flask-RESTful提供

      检验类型方法在flask_restful.inputs模块中

      • url

      • regex(指定正则表达式)

        from flask_restful import inputs
        rp.add_argument('a', type=inputs.regex(r'^d{2}&'))
        
      • natural 自然数0、1、2、3 ...

      • positive 正整数1、2、3 ...

      • int_range(low ,high) 整个范围

        rp.add_argument('a', type=inputs.int_range(1, 10))
        
      • boolean

    • 自定义

      def mobile(mobile_str):
          """
          检验手机号格式
          :param mobile_str: str 被检验字符串
          :return: mobile_str
          """
          if re.match(r'^1[3-9]d{9}$', mobile_str):
              return mobile_str
          else:
              raise ValueError('{} is not a valid mobile'.format(mobile_str))
      
      rp.add_argument('a', type=mobile)
      

    5声明参数位置

    描述参数应该在请求数据中出现的位置

    # Look only in the POST body
    parser.add_argument('name', type=int, location='form')
    
    # Look only in the querystring
    parser.add_argument('PageSize', type=int, location='args')
    
    # From the request headers
    parser.add_argument('User-Agent', location='headers')
    
    # From http cookies
    parser.add_argument('session_id', location='cookies')
    
    # From json
    parser.add_argument('user_id', location='json')
    
    # From file uploads
    parser.add_argument('picture', location='files')

    也可规范多个位置

    parser.add_argument('text', location=['headers', 'json'])

    响应(序列化数据)

    from flask import Flask
    from flask_restful import reqparse, Api, Resource, marshal, fields
    
    app = Flask(__name__)
    api = Api(app)
    
    class User(object):#生成对象的类
        def __init__(self,name,age,id):
            self.name = name
            self.age = age
            self.id = id
    
    resoure_fields = {#检验的字段
        'age':fields.Integer,
        'name':fields.String
    }
    
    # /demo?a=1
    class Demo(Resource):
        def get(self):
            user = User('xujin',12,1)#生成对象
            return marshal(user,resoure_fields,)#返回对象序列化之后的数据
    
    api.add_resource(Demo,'/demo')
    
    if __name__ == '__main__':
        app.run()
  • 相关阅读:
    重载与复写的区别
    Linux常用的网络命令
    JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版下载
    Java中重载与复写的区别、super与this的比较
    JAVA中extends 与implements区别
    Android控件系列之Button以及Android监听器
    Could not find SDK_Root\tools\adb.exe 的解决方法
    路由知识普及和经验分享
    abort函数
    细说Cookie
  • 原文地址:https://www.cnblogs.com/xujin247/p/11754509.html
Copyright © 2011-2022 走看看