flask-restful 用來快速實現介面服務是比較方便的。但是實際中restful的一套風格不能完全滿足我們的需求,所以請求大多都會帶上引數。引數的解析和驗證成了乙個問題。
並不喜歡把解析和驗證寫在邏輯裡。
flask-restful 提供了 reqparse 來做這件事情。
文件給的例子是這樣的。
parser = reqparse.requestparser()
parser.add_argument('task', type=str)
class todo(resource):
def put(self, todo_id):
args = parser.parse_args()
task =
todos[todo_id] = task
return task, 201
但是覺得還可以更進一步。我的是這樣的。
from flask_restful_ext import validate, field
class todo(resource):
@validate(
field('task', type=unicode, required=true)
)def put(self, todo_id, task):
task =
todos[todo_id] = task
return task, 201
這樣**更簡單。
flask_restful_ext 是我自己寫的乙個模組,來完成這件事情的。
**如下
# __init__.py
from flask_restful_ext.field import field
from flask_restful_ext.tools import parser_maker
from functools import wraps
def validate(*args):
def decorate(func):
fields = args
@wraps(func)
p = parser_maker()
for field in fields:
p.add_argument(field.name, type=field.type, required=field.required, default=field.default)
kwargs.update(p.parse_args())
f = lambda *args, **kwargs: func(*args, **kwargs)
return f(*args, **kwargs)
return decorate
# field.py
class field(object):
def __init__(self, name, type=unicode, required=true, default=none):
self.name = name
self.required = required
self.default = default
self.type = type
# tools.py
from flask_restful import reqparse
def parser_maker():
return reqparse.requestparser()
最後附上完整例子。(大部分是文件上的
from flask import flask
from flask.ext.restful import reqparse, abort, api, resource
from flask_restful_ext import validate, field
todos = ,
'todo2': ,
'todo3': ,
}def abort_if_todo_doesnt_exist(todo_id):
if todo_id not in todos:
abort(404, message="todo {} doesn't exist".format(todo_id))
parser = reqparse.requestparser()
parser.add_argument('task', type=str)
# todo
# show a single todo item and lets you delete them
class todo(resource):
def get(self, todo_id):
abort_if_todo_doesnt_exist(todo_id)
return todos[todo_id]
# 文件例子
# def put(self, todo_id):
# args = parser.parse_args()
# task =
# todos[todo_id] = task
# return task, 201
@validate(
field('task', type=unicode, required=true)
)def put(self, todo_id, task):
task =
todos[todo_id] = task
return task, 201
# todolist
# shows a list of all todos, and lets you post to add new tasks
class todolist(resource):
@validate(field('name'))
def get(self, name):
print name
return todos
#### actually setup the api resource routing here
##api.add_resource(todolist, '/todos')
api.add_resource(todo, '/todos/')
if __name__ == '__main__':
最後講一下。
實現很簡單,功能也很簡單。**的命名,變數名,函式名,類名,還需要不斷斟酌,歡迎吐槽 )
flask restful的請求功能
1.請求解析 flask restful 解析的功能 1.建立請求解析器 請求解析器 requestparser 2.新增引數規則 請求解析器.add argument 引數名,引數規則.3.執行解析 引數物件 請求解析器.parse args 4.獲取引數 引數物件.引數名示例 from flas...
乙個乙個的輸入資料
有兩個需要注意的點 1.while中的內容 whlie ch getchar 0 ch eof 注意這兩個書寫的形式是不一樣的 2.while中就不用再寫getchar了,因為while中本身就有ch getchar 輸入描述 一行,字串行,包含a或b,輸入以字元0結束。輸出描述 一行,乙個字元,a...
乙個決定,乙個轉折
距離2012年9月已經是第四個年頭,對於我,我想這是我這輩子做的第一件我很自豪,很開心的乙個決定,從生物轉向計算機,一直以來,我對自己的期望總是很高,比如說上高中的時候,希望自己至少考個二本,學習個自己喜歡的專業,然後為之奮鬥,有乙個非常激動人心的大學四年,再比如說以後賺很多很多錢,擁有屬於自己的公...