Request.args作为来自多个路径级别的过滤器

时间:2017-06-20 13:31:06

标签: python rest flask

我知道是否可以从不同的路径级别获取request.args。

目前我只能将request.args用于一个级别:

scp youfile.txt user@192.168.10.2:project/

my_ip:my_port/modules/?name=git

my_ip:my_port/modules/?id=0

但在我的模块模型中,我有行动,我想以同样的方式采取行动:

@module_blueprint.route('/', methods=['GET'])
def get_modules():

    if len(request.args) == 0:
        modules = Module.query.all()
        return jsonify(modules=list_to_json(modules))

    try:
        module = Module.query.filter_by(**request.args.to_dict()).first()
    except InvalidRequestError as i:
        return json_response(400, "InvalidRequestError : {}".format(i.args))

    if module is None:
        return json_response(204, "")

    return jsonify(module=module.serialize)

但我不知道该怎么做。

如果我尝试

my_ip:my_port/modules/?name=git/actions/?id=0

request.args只保留动作路径后的args

@module_blueprint.route('/actions', methods=['GET'])

此路径的request.args为空

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

注意:请求参数始终附加在请求URL的末尾。 之后的所有内容都被视为URI参数。因此,像

这样的网址
  

my_ip:?my_port /模块/名称= GIT中/动作/ ID = 0

是不可能的,因为它违反了上述指南。

解决方案,如果每个级别只有1个参数:

在这种情况下,将信息作为参数传递并不会带来任何好处。因此,以下是更好的做事方式:

按名称提取模块:

@module_blueprint.route('/<module_name>', methods=['GET'])

用于获取该模块的操作:

@module_blueprint.route('/<module_name>/action/<int:action_id>', methods=['GET'])

解决方案,如果每个级别有超过1个过滤器参数:

在这种情况下,使用请求参数更有意义。

按名称提取模块:

@module_blueprint.route('/', methods=['GET'])

用于获取该模块的操作:

@module_blueprint.route('/actions', methods=['GET'])