热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python webargs模块怎么使用

今天小编给大家分享一下Python webargs模块怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇

今天小编给大家分享一下Python webargs模块怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    webargs是一个用于解析和验证HTTP请求对象的Python库,内置了对流行web框架的支持,包括Flask、Django、Bottle、Tornado、Pyramid、webapp2、Falcon和aiohttp。

    一、安装

    python3 -m pip install webargs

    文档

    二、基础特性

    # encoding=utf-8
    from flask import Flask
    from webargs import fields
    from webargs.flaskparser import use_args
    app = Flask(__name__)
    app.route("/")
    @use_args({
        "name": fields.Str(required=True),
        "age": fields.Int(required=True),
    }, location='query')
    def index(args):
        print('args', args)
        return "Hello " + args["name"]
    if __name__ == "__main__":
        app.run(debug=1)

    2.1. 使用

    2.1.1 通过装饰器
    @use_args({
        "name": fields.Str(required=True),
        "age": fields.Int(required=True),
    }, location='query')
    • 第一个参数是需要获取的字段名,类型,是否必须等的定义

    • location是指从哪里获取这些参数,默认是json,可选:

    • 'querystring' (same as 'query')

    • 'json'

    • 'form'

    • 'headers'

    • 'COOKIEs'

    • 'files'

    解析完后,把所有参数放在字典里面,传给下层函数

    2.1.2 通过函数
    args = parser.parse(user_args, request)

    参数和装饰器一样,多了一传request

    2.2 参数检查

    from webargs import fields, validate
    
    args_1 = {
        # 必须参数,字符串类型
        "username": fields.Str(required=True),
        # validate
        "password": fields.Str(validate=lambda p: len(p) >= 6),
        "password": fields.Str(validate=validate.Length(min=6)),
        # Default value when argument is missing
        "display_per_page": fields.Int(missing=10),
        # Repeated parameter, e.g. "/?nickname=Fred&nickname=Freddie"
        "nickname": fields.List(fields.Str()),
        # Delimited list, e.g. "/?languages=python,Javascript"
        "languages": fields.DelimitedList(fields.Str()),
        # When value is keyed on a variable-unsafe name
        # or you want to rename a key
        "user_type": fields.Str(data_key="user-type"),
        "start_day": fields.DateTime(required=True, format='%Y-%m-%d %X'), 
        "bool": fields.Bool(),
        "email": fields.Email(),
        "ip": fields.IP(),
        "type": fields.Constant(cOnstant='COMMON_TYPE'),
        "money": fields.Decimal(),
        "weight": fields.Float(),
        "url": fields.URL(),
        "uuid": fields.UUID(),
        "raw": fields.Raw(),
    }
    • fields.Str 表示接收字符串参数

    • required=True 表示必传

    • validate=lambda p: len(p) >= 6 表示自定义检查函数。会把参数传递给该函数,该函数返回True表示检查通过,返回False或者抛出异常表示检查不通过

      • 如果要对多个参数进行联合检查,需要在装饰器层架validate参数:@use_args(args_1, validate=lambda args: len(args["username"])

      • 异常需要是from webargs import ValidationError这个异常,不然会当程序异常处理

    • 也可以用validate库里面的内置检查函数

    • missing=10 表示如果没有入参,设置为默认值

    • fields.List(fields.Str()) 表示列表型参数,列表的元素是字符串

    • fields.DelimitedList(fields.Str()) 表示逗号型的列表参数

    • data_key="user-type" 表示字段名修改,入参是user-type,在args字典会改为user_type

    • fields.DateTime(required=True, format='%Y-%m-%d %X') 表示接收日期类型,并且格式需要符合,参数值会转换为datetime类型

    • "bool": fields.Bool() 表示布尔类型,传1,0,true,false都能识别

    • fields.Email() 只接收email,估计里面会有正则检查

    • fields.IP() 只接收IP

    • fields.Constant(cOnstant='COMMON_TYPE') 常量参数,无论入参是什么值,type永远等于COMMON_TYPE

    • fields.Decimal() 转换为Decimal类型

    • fields.Float() 转换为float类型

    • fields.URL() fields.UUID() 正则检查url格式或者uuid格式

    • fields.Raw 不检查参数类型

    内置参数检查

    • validate=validate.Length(min=1,max=10) 检查字符串长度需要在某个区间

    • validate=validate.OneOf(['male', 'female']) 入参需要在枚举里面

    2.3 检查失败处理

    如果参数检查失败,会返回422响应,但是不会提示哪个参数有问题。我们可以通过Flask的异常处理机制,捕获这个异常,然后构造我们想要的返回

    @app.errorhandler(422) # 捕获422和400的异常码
    @app.errorhandler(400)
    def handle_error(err):
        headers = err.data.get("headers", None)
        messages = err.data.get("messages", ["Invalid request."])
        print(headers)
        print(messages)  # {'json': {'password': ['Shorter than minimum length 6.']}}
        return json.dumps({'err_code': 10000, 'err_msg': messages['json']})
    • 从err里面获取信息,headers不知道有什么用的,message会有异常信息,例如不满足validate=validate.Length(min=6)检查,就会返回{'json': {'password': ['Shorter than minimum length 6.']}}

    • 如果是主动抛出的ValidationError异常,message会包含ValidationError异常的内容

    • 我们可以把这个参数检查信息返回给前端,提示前端哪个参数错误了。

    • messages['json'] 的json是location的key

    2.4 嵌套参数

    对于一些复杂的,有多重嵌套的参数

    "name": fields.Nested(
        {"first": fields.Str(required=True), "last": fields.Str(required=True)}
    )
    • 表示name是一个嵌套参数,也就是字典

    • 然后里面需要要first key和last key

    三、高级特性

    3.1 自定义location

    上面说了location支持query,json这些,也可以自定义

    @parser.location_loader("data")
    def load_data(request, schema):
        data = {}
        data.update({k: request.args.get(k) for k in request.args})
        if request.json:
            data.update({k: request.json.get(k) for k in request.json})
        print(data, 'dataaaaa')
        return data
    
    parser.location = 'data' # 设置默认的location为data
    • 上面定义了一个data的location,会合并args和json入参

    • 把默认的location修改为data

    也可以这样,这个是官方推荐方法:

    @parser.location_loader("args_and_json")
    def load_data(request, schema):
        from webargs.multidictproxy import MultiDictProxy
        newdata = request.args.copy()
        if request.json:
            newdata.update(request.json)
        return MultiDictProxy(newdata, schema)

    3.2 定义schema

    除了可以通过字典定义args,也可以通过类:

    from marshmallow import Schema
    class UserSchema(Schema):
        name = fields.Str(required=True)
        age = fields.Int()
    @app.route("/")
    @use_args(UserSchema())
    def index1(args):
        print('args', args)
        return "Hello "

    3.3 未定义的参数处理

    如果入参有未定义的参数,webargs默认会抛出422异常

    from webargs.flaskparser import parser
    import marshmallow
    parser.unknown = marshmallow.EXCLUDE  # 如果有未定义参数,不放到args参数,不抛异常
    parser.unknown = marshmallow.INCLUDE  # 如果有未定义参数,放到args参数,不抛异常
    • 可以修改parse.unknown来修改策略。

    • 也可以精确设置不同location的unknown策略

    3.4 Flask的url参数

    @app.route("//")
    @use_args(UserSchema())
    def index1(args, id):
        print('args', args, id)
        return "Hello "

    如果需要用到Flask的url参数,就需要这样传递参数

    以上就是“Python webargs模块怎么使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程笔记行业资讯频道。


    推荐阅读
    • Django + Ansible 主机管理(有源码)
      本文给大家介绍如何利用DjangoAnsible进行Web项目管理。Django介绍一个可以使Web开发工作愉快并且高效的Web开发框架,能够以最小的代价构建和维护高 ... [详细]
    • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
      本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
    • 31.项目部署
      目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
    • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
    • Webpack5内置处理图片资源的配置方法
      本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
    • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
    • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
    • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
    • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
    • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
      文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
    • 如何查询zone下的表的信息
      本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
    • Python开源库和第三方包的常用框架及库
      本文介绍了Python开源库和第三方包中常用的框架和库,包括Django、CubicWeb等。同时还整理了GitHub中最受欢迎的15个Python开源框架,涵盖了事件I/O、OLAP、Web开发、高性能网络通信、测试和爬虫等领域。 ... [详细]
    • SpringBoot整合SpringSecurity+JWT实现单点登录
      SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
    • Python项目实战10.2:MySQL读写分离性能优化
      本文介绍了在Python项目实战中进行MySQL读写分离的性能优化,包括主从同步的配置和Django实现,以及在两台centos 7系统上安装和配置MySQL的步骤。同时还介绍了创建从数据库的用户和权限的方法。摘要长度为176字。 ... [详细]
    • python3 logging
      python3logginghttps:docs.python.org3.5librarylogging.html,先3.5是因为我当前的python版本是3.5之所 ... [详细]
    author-avatar
    丹_jie
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有