使用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, '')



您来留言:
Captcha