flask_RESTful的基本用法

数据安全

flask里的内置函数,可以直接实现密码的加密和校验

  • generate_password_hash
    • 输入相同,每次输出的密文输出都不一样
  • check_password_hash
    • 调用函数可以直接进行密码验证

实现的原理

  • 先将密码进行hash
  • 再将hash拼接一个随机数
  • 验证
    • 去掉随机数
    • 密码生成hash
    • 比较hash

程序的异常

  • 异常产生

    • raise
@property
def password(self):
    # 访问密码时抛出异常
    reise Exception("not be accessed")
  • assert

  • 处理异常

    • try…except
  • 主动抛异常场景

    • 自己封装框架
    • 封装工具类给别人使用

Flask-RESTful

,即给数据库中的字段定义映射,或叫设置别名# 添加参数的一般写法
parser = reqparse.RequestParser()  # 定义一个传入的参数
parser.add_argument("title", type=str, required=True, 
help="please add your title", action='append', dest='public_name', location=['form', 'values'])
# location中后面的参数先显示
  • 输入
    • reqparse.RequestParser()
      • 对参数进行处理
      • 参数获取
      • 获取校验
        • 参数名
        • 类型限制 type
          • 两个类型 int 和 str
        • 错误提示 help
        • 是否必须 required
          • 默认下,arguments 不是必须的,在请求中提供的参数不属于 RequestParser 的一部分的话将会被忽略。设置 required=True来调用add_argument()
        • 隐私别名 dest
          • 设置的别名,将别名传出,隐藏数据库中的字段名
        • 参数来源 location 后面的参数先显示
          • form
          • args
          • heads
          • cookies
          • values
          • json
        • 参数数量,多个参数值 action
          • append追加参数
          • store储存参数
  • 转换输出格式的方法
    • 将对象转换成JSON(dict)
    • marshal_with 装饰
    • marshal 函数
      • 先写好传出数据的模板
      • 将数据和模板传递进来

需要输出的模板

  • 字典(将模板定义为字典,输出的字典会被自动转化为json数据)
    • key 就是json中key
    • value 就是fileds.XXX
  • fields
    • attribute指定映射关系
    • 格式化的时候,会默认根据字典中的key去数据中查找,指定 attribute=“xxx”之后,会根据 attribute去查找。可以实现给传出的字段设置别名(xxx)
student_fields = {
	"name": fields.String(attribute=b_name)  # b_name是数据库中设置的字段名
}
  • default 默认值
    • 如果不存在字段或内容,返回只为null,可能会影响前端的功能实现,设置默认值可以解决这个问题
student_fields = {
	"unknown": fields.String(default="")  # 设置默认值为空字符串
}
  • fields.Nested
    • 嵌套字段
    • 对象嵌套
    • 可以自动处理单个对象和列表对象
student_fields = {  # 定义student输出数据的模板
	"name": fields.String(attribute=b_name)  # b_name是数据库中设置的字段名
}
retuen_fields = {
    "msg": fields.String,
    "status": fields.Integer,
    # 将student模板通过Nested方法传入到return模板中,
    # 将传入到data键的数据格式化,即下文中的"data": student
    "data": fields.Nested(student_fields)  
}

引入marshal_with()后,将matshal_with()作为方法的装饰器使用,将输出结果格式化

from flask_restful import Resource
class LearnResoure(Resource)
	@marshal_with(return_fields)
	def get(self):
        # 省略实现方法
        data = {  # 需要返回的数据
            "msg": "ok",
            "status": 200,
            "data": student,
        }
        return data
  • fields.List
    • 解决列表型数据(旧写法)

"data": fields.List(fields.Nested(student_fields))

fileds

  • 继承自Raw
    • 属性
      • default 默认值属性
      • attribute
    • 方法
      • format 将传入的数据格式化
      • output 首先调用,在输出时调用format进行数据格式化
  • String
    • format
      • 转换成str
      • text_type
  • Integer
    • format
      • int
  • Boolean

封装方式

  • 函数 静态方法 将需要实现的方法写在函数里面,在需要的地方调用函数实现功能,实现代码复用
  • 类的继承 创建一个父类BaseResource,在父类里面定义类方法,在继承自他的子类中,都可以使用这个方法,这种方式方便在父类的属性也可以被继承
  • 装饰器,同样是创建一个函数方法,不过将其作为装饰器使用将要实现功能的方法function传入装饰器,为方法添加功能
# 定义一个装饰器
def login_required(fun):
    def wrapper(*args, **kwargs):
        # 省略需要给函数添加的功能
        return fun(*args, **kwargs)
    return wrapper
# 在实现的方法中添加装饰器的功能
@login_required
def post(self):
    # 处理传入的数据
    data = {
        "msg": "ok",
        "status": 200,
        "data": blog
    }
    return marshal(data, return_fields)

flask中

  • GET参数获取方式
    • request.args
    • query_string
    • query_params
    • 在所有的请求中都可以直接使用
    • 想拿这个数据可以用通用写法 request.args
  • POST参数获取方式
    • request.form
    • POST,PATCH,PUT参数都是使用form获取

猜你喜欢

转载自blog.csdn.net/qq_27114273/article/details/90715680