使用flask restful时可以通过reqparse.RequestParser来方便的获取请求参数以及对参数合法性做校验.下面完整的示例
# vies/ticket.py import six from flask_restful import Resource, reqparse, marshal from opsflow.services import format_service from opsflow.services.ticket_service.ticket_base_service import TicketBaseService ticket_list_parser = reqparse.RequestParser() ticket_list_parser.add_argument('per_page', type=int, location='args') ticket_list_parser.add_argument('page', type=int, location='args') ticket_list_parser.add_argument('title', type=six.text_type, location='args') #因为title可能会包含中文,所以使用six也可以不指定type class TicketListApi(Resource): """ 工单列表 """ def get(self): request_data_dict = ticket_list_parser.parse_args() for key in list(request_data_dict.keys()): if request_data_dict.get(key) is None: del (request_data_dict[key]) page = request_data_dict.get('page', 1) per_page = request_data_dict.get('per_page', 10) title = request_data_dict.get('title', '') ticket_objs, msg = TicketBaseService.get_ticket_list(page, per_page, title) if ticket_fields is not False: response_data = dict(value=[marshal(ticket_obj, ticket_fields) for ticket_obj in ticket_objs.items], total=ticket_objs.total, page=ticket_objs.page, per_page=ticket_objs.per_page) return format_service.response(200, '', response_data) else: return format_service.response(500, msg, '')
说明:
add_argument中通过指定参数名、参数类型、参数获取方式来获取参数对象并支持做合法性校验
第一个参数是需要获取的参数的名称
参数type: 参数指的类型, 如果参数中可能包含中文需要使用six.text_type. 或直接不指定type
参数location: 获取参数的方式,可选的有args(url中获取)、json(json类型的)、form(表单方式提交)
参数required:是否必要,默认非必要提供
参数help:针对必要的参数,如果请求时没有提供,则会返回help中相应的信息
注意:
RequestParser可以通过在resource class外部指定,或者在class内部通过__init__的方式指定。但是如果在__init__中指定, 则无法区分get\post等method使用不同的参数规则,__init__用法如下
class TicketListApi(Resource): """ 工单列表 """ def __init__(self): self.ticket_list_parser = reqparse.RequestParser() self.ticket_list_parser.add_argument('per_page', type=int, location='args') def get(self): request_data_dict = self.ticket_list_parser.parse_args() for key in list(request_data_dict.keys()): if request_data_dict.get(key) is None: del (request_data_dict[key]) page = request_data_dict.get('page', 1) per_page = request_data_dict.get('per_page', 10) title = request_data_dict.get('title', '') ticket_objs, msg = TicketBaseService.get_ticket_list(page, per_page, title) if ticket_fields is not False: response_data = dict(value=[marshal(ticket_obj, ticket_fields) for ticket_obj in ticket_objs.items], total=ticket_objs.total, page=ticket_objs.page, per_page=ticket_objs.per_page) return format_service.response(200, '', response_data) else: return format_service.response(500, msg, '')