欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python?webargs?模塊的簡單使用

 更新時間:2022年01月21日 12:21:18   作者:Xjng  
webargs是一個用于解析和驗(yàn)證HTTP請求對象的Python庫,今天通過本文給大家介紹Python?webargs?模塊的安裝使用,感興趣的朋友一起看看吧

webargs是一個用于解析和驗(yàn)證HTTP請求對象的Python庫,內(nèi)置了對流行web框架的支持,包括Flask、Django、Bottle、Tornado、Pyramid、webapp2、Falcon和aiohttp。下面看下Python webargs 模塊詳解。

一、安裝

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 通過裝飾器

@use_args({
    "name": fields.Str(required=True),
    "age": fields.Int(required=True),
}, location='query')
  • 第一個參數(shù)是需要獲取的字段名,類型,是否必須等的定義
  • location是指從哪里獲取這些參數(shù),默認(rèn)是json,可選:
  • 'querystring' (same as 'query')
  • 'json'
  • 'form'
  • 'headers'
  • 'cookies'
  • 'files'

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

2.1.2 通過函數(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ù)。會把參數(shù)傳遞給該函數(shù),該函數(shù)返回True表示檢查通過,返回False或者拋出異常表示檢查不通過
    • 如果要對多個參數(shù)進(jìn)行聯(lián)合檢查,需要在裝飾器層架validate參數(shù):@use_args(args_1, validate=lambda args: len(args["username"]) < len(args["password"]))
    • 異常需要是from webargs import ValidationError這個異常,不然會當(dāng)程序異常處理
  • 也可以用validate庫里面的內(nèi)置檢查函數(shù)
  • missing=10 表示如果沒有入?yún)?,設(shè)置為默認(rèn)值
  • fields.List(fields.Str()) 表示列表型參數(shù),列表的元素是字符串
  • fields.DelimitedList(fields.Str()) 表示逗號型的列表參數(shù)
  • data_key="user-type" 表示字段名修改,入?yún)⑹莡ser-type,在args字典會改為user_type
  • fields.DateTime(required=True, format='%Y-%m-%d %X') 表示接收日期類型,并且格式需要符合,參數(shù)值會轉(zhuǎn)換為datetime類型
  • "bool": fields.Bool() 表示布爾類型,傳1,0,true,false都能識別
  • fields.Email() 只接收email,估計里面會有正則檢查
  • fields.IP() 只接收IP
  • fields.Constant(constant='COMMON_TYPE') 常量參數(shù),無論入?yún)⑹鞘裁粗?,type永遠(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) 檢查字符串長度需要在某個區(qū)間
  • validate=validate.OneOf(['male', 'female']) 入?yún)⑿枰诿杜e里面

2.3 檢查失敗處理

如果參數(shù)檢查失敗,會返回422響應(yīng),但是不會提示哪個參數(shù)有問題。我們可以通過Flask的異常處理機(jī)制,捕獲這個異常,然后構(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會有異常信息,例如不滿足validate=validate.Length(min=6)檢查,就會返回{'json': {'password': ['Shorter than minimum length 6.']}}
  • 如果是主動拋出的ValidationError異常,message會包含ValidationError異常的內(nèi)容
  • 我們可以把這個參數(shù)檢查信息返回給前端,提示前端哪個參數(shù)錯誤了。
  • messages['json'] 的json是location的key

2.4 嵌套參數(shù)

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

"name": fields.Nested(
    {"first": fields.Str(required=True), "last": fields.Str(required=True)}
)
  • 表示name是一個嵌套參數(shù),也就是字典
  • 然后里面需要要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' # 設(shè)置默認(rèn)的location為data
  • 上面定義了一個data的location,會合并args和json入?yún)?/li>
  • 把默認(rèn)的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 未定義的參數(shù)處理

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

from webargs.flaskparser import parser
import marshmallow
parser.unknown = marshmallow.EXCLUDE  # 如果有未定義參數(shù),不放到args參數(shù),不拋異常
parser.unknown = marshmallow.INCLUDE  # 如果有未定義參數(shù),放到args參數(shù),不拋異常
  • 可以修改parse.unknown來修改策略。
  • 也可以精確設(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ù)

到此這篇關(guān)于Python webargs 模塊的文章就介紹到這了,更多相關(guān)Python webargs 模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

最新評論