溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python?webargs模塊怎么使用

發(fā)布時(shí)間:2022-01-21 15:16:29 來(lái)源:億速云 閱讀:325 作者:iii 欄目:開(kāi)發(fā)技術(shù)

今天小編給大家分享一下Python webargs模塊怎么使用的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

    webargs是一個(gè)用于解析和驗(yàn)證HTTP請(qǐng)求對(duì)象的Python庫(kù),內(nèi)置了對(duì)流行web框架的支持,包括Flask、Django、Bottle、Tornado、Pyramid、webapp2、Falcon和aiohttp。

    一、安裝

    python3 -m pip install webargs

    文檔

    二、基礎(chǔ)特性

    # 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 通過(guò)裝飾器
    @use_args({
        "name": fields.Str(required=True),
        "age": fields.Int(required=True),
    }, location='query')
    • 第一個(gè)參數(shù)是需要獲取的字段名,類型,是否必須等的定義

    • location是指從哪里獲取這些參數(shù),默認(rèn)是json,可選:

    • 'querystring' (same as 'query')

    • 'json'

    • 'form'

    • 'headers'

    • 'cookies'

    • 'files'

    解析完后,把所有參數(shù)放在字典里面,傳給下層函數(shù)

    2.1.2 通過(guò)函數(shù)
    args = parser.parse(user_args, request)

    參數(shù)和裝飾器一樣,多了一傳request

    2.2 參數(shù)檢查

    from webargs import fields, validate
    
    args_1 = {
        # 必須參數(shù),字符串類型
        "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 表示接收字符串參數(shù)

    • required=True 表示必傳

    • validate=lambda p: len(p) >= 6 表示自定義檢查函數(shù)。會(huì)把參數(shù)傳遞給該函數(shù),該函數(shù)返回True表示檢查通過(guò),返回False或者拋出異常表示檢查不通過(guò)

      • 如果要對(duì)多個(gè)參數(shù)進(jìn)行聯(lián)合檢查,需要在裝飾器層架validate參數(shù):@use_args(args_1, validate=lambda args: len(args["username"]) < len(args["password"]))

      • 異常需要是from webargs import ValidationError這個(gè)異常,不然會(huì)當(dāng)程序異常處理

    • 也可以用validate庫(kù)里面的內(nèi)置檢查函數(shù)

    • missing=10 表示如果沒(méi)有入?yún)ⅲO(shè)置為默認(rèn)值

    • fields.List(fields.Str()) 表示列表型參數(shù),列表的元素是字符串

    • fields.DelimitedList(fields.Str()) 表示逗號(hào)型的列表參數(shù)

    • data_key="user-type" 表示字段名修改,入?yún)⑹莡ser-type,在args字典會(huì)改為user_type

    • fields.DateTime(required=True, format='%Y-%m-%d %X') 表示接收日期類型,并且格式需要符合,參數(shù)值會(huì)轉(zhuǎn)換為datetime類型

    • "bool": fields.Bool() 表示布爾類型,傳1,0,true,false都能識(shí)別

    • fields.Email() 只接收email,估計(jì)里面會(huì)有正則檢查

    • fields.IP() 只接收IP

    • fields.Constant(constant='COMMON_TYPE') 常量參數(shù),無(wú)論入?yún)⑹鞘裁粗担瑃ype永遠(yuǎn)等于COMMON_TYPE

    • fields.Decimal() 轉(zhuǎn)換為Decimal類型

    • fields.Float() 轉(zhuǎn)換為float類型

    • fields.URL() fields.UUID() 正則檢查url格式或者uuid格式

    • fields.Raw 不檢查參數(shù)類型

    內(nèi)置參數(shù)檢查

    • validate=validate.Length(min=1,max=10) 檢查字符串長(zhǎng)度需要在某個(gè)區(qū)間

    • validate=validate.OneOf(['male', 'female']) 入?yún)⑿枰诿杜e里面

    2.3 檢查失敗處理

    如果參數(shù)檢查失敗,會(huì)返回422響應(yīng),但是不會(huì)提示哪個(gè)參數(shù)有問(wèn)題。我們可以通過(guò)Flask的異常處理機(jī)制,捕獲這個(gè)異常,然后構(gòu)造我們想要的返回

    @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會(huì)有異常信息,例如不滿足validate=validate.Length(min=6)檢查,就會(huì)返回{'json': {'password': ['Shorter than minimum length 6.']}}

    • 如果是主動(dòng)拋出的ValidationError異常,message會(huì)包含ValidationError異常的內(nèi)容

    • 我們可以把這個(gè)參數(shù)檢查信息返回給前端,提示前端哪個(gè)參數(shù)錯(cuò)誤了。

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

    2.4 嵌套參數(shù)

    對(duì)于一些復(fù)雜的,有多重嵌套的參數(shù)

    "name": fields.Nested(
        {"first": fields.Str(required=True), "last": fields.Str(required=True)}
    )
    • 表示name是一個(gè)嵌套參數(shù),也就是字典

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

    三、高級(jí)特性

    3.1 自定義location

    上面說(shuō)了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' # 設(shè)置默認(rèn)的location為data
    • 上面定義了一個(gè)data的location,會(huì)合并args和json入?yún)?/p>

    • 把默認(rèn)的location修改為data

    也可以這樣,這個(gè)是官方推薦方法:

    @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

    除了可以通過(guò)字典定義args,也可以通過(guò)類:

    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 未定義的參數(shù)處理

    如果入?yún)⒂形炊x的參數(shù),webargs默認(rèn)會(huì)拋出422異常

    from webargs.flaskparser import parser
    import marshmallow
    parser.unknown = marshmallow.EXCLUDE  # 如果有未定義參數(shù),不放到args參數(shù),不拋異常
    parser.unknown = marshmallow.INCLUDE  # 如果有未定義參數(shù),放到args參數(shù),不拋異常
    • 可以修改parse.unknown來(lái)修改策略。

    • 也可以精確設(shè)置不同location的unknown策略

    3.4 Flask的url參數(shù)

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

    如果需要用到Flask的url參數(shù),就需要這樣傳遞參數(shù)

    以上就是“Python webargs模塊怎么使用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI