【问题标题】:How to with request.args.get() in flask? [duplicate]如何在烧瓶中使用 request.args.get()? [复制]
【发布时间】:2019-12-11 11:42:00
【问题描述】:

url查询字符串拼写错误如何抛出异常?

解释:

这是获取特定用户的网址: http://127.0.0.1:5000/v1/t/user/?user_id=1。 如果忍者将点击http://127.0.0.1:5000/v1/t/user/,它将给出用户列表。

问题:

如果查询字符串中的user_id 拼写错误,比如错误use_id=1,或者不是传递整数值,而是传递字符串值到user_id,我希望在这种情况下我应该返回404 页。我不认为内部request.args.get() 会抛出?如果我必须处理这种情况怎么办?

我的部分代码:

page_index = request.args.get('index', 1, type=int)
max_item = request.args.get('max', 1, type=int)
userID = request.args.get('user_id', type=int)

【问题讨论】:

    标签: python python-3.x flask


    【解决方案1】:

    您可以创建一个自定义错误处理程序:

    @app.errorhandler(404)
    def page_not_found(error):
       return render_template('404.html', title = '404'), 404
    

    如果未设置 user_id 参数,则使用 abort 引发此问题:

    from flask import abort
    
    userID = request.args.get('user_id', type=int)
    
    if not userID:
        abort(404)
    

    记住,request.args.get 默认返回 None,除非你给它默认参数:

    foo = request.args.get('bar', default='Something')
    

    编辑:澄清。

    如果您将type 参数指定给request.args.get,则如果请求中传递的值不是上述类型,则将返回None

    例如:

    incoming_data['user_id'] = request.args.get('user_id' , type=int)
    print('Got: ', incoming_data['user_id'])
    

    将导致:

    # request: /?user_id=1
    Got: 1
    
    # request: /?user_id=test
    Got: None
    
    # request: /?
    Got: None
    

    根据我在评论中链接的其他答案,您可以相应地构建过滤器:

    filter_data = {key: value for (key, value) in incoming_data.items()
               if value}
    
    result = MyModel.query.filter_by(**filter_data)
    

    filter_data 将仅包含键 user_id 如果在 URL 参数中传递的是整数。

    【讨论】:

    • 同意您的评论,但在我的情况下,请求查询字符串参数是可选的。如果不存在,我必须返回所有用户详细信息。
    • @VVKkumar 可能会看到我的recent answer,它处理可能不存在的变量。
    • 我已经编辑了我的解释,请你看一遍。你已经回答了它的不同场景,基本上我的意思是如何验证查询字符串?
    • @VVKkumar 查看我的编辑,希望这可以澄清事情。
    • 是的,我知道如何解决它。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    相关资源
    最近更新 更多