Python?webargs?模塊的簡(jiǎn)單使用
webargs是一個(gè)用于解析和驗(yàn)證HTTP請(qǐng)求對(duì)象的Python庫(kù),內(nèi)置了對(duì)流行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')- 第一個(gè)參數(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ù)。會(huì)把參數(shù)傳遞給該函數(shù),該函數(shù)返回True表示檢查通過,返回False或者拋出異常表示檢查不通過
- 如果要對(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 表示如果沒有入?yún)?,設(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ù),無論入?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) 檢查字符串長(zhǎng)度需要在某個(gè)區(qū)間
- validate=validate.OneOf(['male', 'female']) 入?yún)⑿枰诿杜e里面
2.3 檢查失敗處理
如果參數(shù)檢查失敗,會(huì)返回422響應(yīng),但是不會(huì)提示哪個(gè)參數(shù)有問題。我們可以通過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
上面說了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)?/li>
- 把默認(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
除了可以通過字典定義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)會(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來修改策略。
- 也可以精確設(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用pickle模塊報(bào)錯(cuò)EOFError Ran out of input的解決方法
這篇文章主要介紹了Python使用pickle模塊報(bào)錯(cuò)EOFError Ran out of input的解決方法,涉及Python異常捕獲操作處理相關(guān)使用技巧,需要的朋友可以參考下2018-08-08
ubuntu 18.04搭建python環(huán)境(pycharm+anaconda)
這篇文章主要為大家詳細(xì)介紹了ubuntu 18.04搭建python環(huán)境,包括Anaconda安裝、Pycharm安裝及初始配置,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
執(zhí)行python腳本并傳入json數(shù)據(jù)格式參數(shù)方式
這篇文章主要介紹了執(zhí)行python腳本并傳入json數(shù)據(jù)格式參數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
Python大數(shù)據(jù)之網(wǎng)絡(luò)爬蟲的post請(qǐng)求、get請(qǐng)求區(qū)別實(shí)例分析
這篇文章主要介紹了Python大數(shù)據(jù)之網(wǎng)絡(luò)爬蟲的post請(qǐng)求、get請(qǐng)求區(qū)別,結(jié)合具體實(shí)例形式分析了Python網(wǎng)頁爬蟲post請(qǐng)求與get請(qǐng)求相關(guān)使用技巧,需要的朋友可以參考下2019-11-11
Python3爬蟲里關(guān)于識(shí)別微博宮格驗(yàn)證碼的知識(shí)點(diǎn)詳解
在本篇文章里小編給大家分享了關(guān)于Python3爬蟲里關(guān)于識(shí)別微博宮格驗(yàn)證碼的知識(shí)點(diǎn),有興趣的朋友們可以參考下。2020-07-07
Python+eval函數(shù)實(shí)現(xiàn)動(dòng)態(tài)地計(jì)算數(shù)學(xué)表達(dá)式詳解
Python的 eval() 允許從基于字符串或基于編譯代碼的輸入中計(jì)算任意Python表達(dá)式。當(dāng)從字符串或編譯后的代碼對(duì)象的任何輸入中動(dòng)態(tài)計(jì)算Python表達(dá)式時(shí),此函數(shù)非常方便。本文將利用eval實(shí)現(xiàn)動(dòng)態(tài)地計(jì)算數(shù)學(xué)表達(dá)式,需要的可以參考一下2022-09-09
python腳本當(dāng)作Linux中的服務(wù)啟動(dòng)實(shí)現(xiàn)方法
今天小編就為大家分享一篇python腳本當(dāng)作Linux中的服務(wù)啟動(dòng)實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06
Pytorch使用Visdom進(jìn)行數(shù)據(jù)可視化的示例代碼
pytorch Visdom可視化,是一個(gè)靈活的工具,用于創(chuàng)建,組織和共享實(shí)時(shí)豐富數(shù)據(jù)的可視化,這個(gè)博客簡(jiǎn)要介紹一下在使用Pytorch進(jìn)行數(shù)據(jù)可視化的一些內(nèi)容,感興趣的朋友可以參考下2023-12-12

