【问题标题】:Complex routing for get request from html form in flask [duplicate]从烧瓶中的html表单获取请求的复杂路由[重复]
【发布时间】:2016-06-23 11:30:34
【问题描述】:

我正在尝试为如下所示的 get 请求创建复杂的路由:

@app.route('/get-details?id=<int:id>&code=<int:code>', methods=['GET'])
@login_required
def get_details(id, code):
    # Do something with code and id ....

在我的模板中,我有一个如下所示的表单:

<form action="{{url_for('get_details')}}" method="get">
    {{ form.hidden_tag() }}
    {{ form.id() }}
    {{ form.code() }}
    <input type="submit">

</form>

但是当我尝试渲染我的页面时,我得到了这个异常:

  File "/home/sharon/dev/wiseart/credixdealer/app/templates/dashboard/form-device.html", line 113, in block "content"
    <form action="{{url_for('get_details')}}" method="get">
  File "/usr/local/lib/python2.7/dist-packages/flask/helpers.py", line 332, in url_for
    return appctx.app.handle_url_build_error(error, endpoint, values)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1811, in handle_url_build_error
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python2.7/dist-packages/flask/helpers.py", line 322, in url_for
    force_external=external)
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/routing.py", line 1758, in build
    raise BuildError(endpoint, values, method, self)
BuildError: Could not build url for endpoint 'get_details'. Did you forget to specify values ['business_id', 'id']?

如何在 url_for 中指定应从表单本身检索参数?

【问题讨论】:

  • '/get-details?id=&code='... 你为什么要制造复杂性。这可以通过非常简单的方式完成。
  • Werkzeug 路由底层 app.route() 在文档中确实提到了 query_args,但也有这样的说法:“query_args – 用于自动重定向的可选查询参数作为字符串或字典。目前不是可以使用查询参数进行 URL 匹配。”我认为此时您在 Flask 中尝试做的事情是不可能的。你试过Pyramid吗?
  • 但抛开话题,你应该access query params using request.args。
  • 谢谢!似乎使用 request.args 访问可以解决问题

标签: python templates flask jinja2


【解决方案1】:

不要将查询参数放在路由定义中。相反,从request.args 获取它们。 args.get 采用可选的 type 参数,因此您仍然可以验证值的类型。

@app.route('/get_details')
def get_details():
    id = request.args.get('id', type=int)
    code = request.args.get('code', type=int)
    ...

有关特定错误的解决方案,请阅读错误消息。您有一个包含两个 url 组的路由,但您没有将它们的值提供给url_for。由于您只在客户端填写表单后才知道 args,因此这成为您为什么不将查询 args 放入路由中的一个很好的论据。

url_for('get_details', id=2, code=108)

【讨论】:

    猜你喜欢
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 2019-10-25
    相关资源
    最近更新 更多