使用 url_for 将加载的和输入的值传递给函数

时间:2021-02-09 22:20:57

标签: flask jinja2 flask-sqlalchemy

我正在尝试使用 url_for 将值作为参数传递,但是我遇到了一些问题,因为我首先通过函数加载了一些数据,然后使用 构造手动插入了一些数据。我该怎么办?

<td align = "center"> <a href = "{{url_for ('insertResults', idGia = attribute [0], language = attribute [4], level = attribute [5], info = info, written = written, oral = oral, session = session)}} "type =" submit "class =" btn btn-primary "> Insert </td>

其中信息、书面和口头是通过以下方式作为输入输入的数据:

<td align = "center"> <input type = "text" placeholder = "100" id = "info" name = "info" /> </td> 
<td align = "center"> <input type = "text" placeholder = "100" id = "written" name = "written" /> </td> 
<td align = "center"> <input type = "text" placeholder = "100" id = "oral" name = "oral" /> </td> 

1 个答案:

答案 0 :(得分:0)

url_for 函数在服务器端执行。无法将参数从表单字段传递给 this。

您确定要为此使用 GET 请求吗?在我看来,POST 请求在您的情况下更有意义。

以下示例向您展示了不同的方法,您可以使用这些方法通过 POST 请求传输变量并在您的路由中查询它们。数据主要在请求正文中找到它们的位置。只有名称为“attr0”的属性会在 url 中发送。

<form action="{{ url_for('indert_results', attr0=attr[0]) }}" method="POST">
  <input type="hidden" name="val0" value="{{ attr[1] }}" />
  <input type="text" name="val1" />
  <input type="text" name="val2" />
  <button type="submit">Submit</button>
</form>
@app.route('/insert-results/<int:attr0>', methods=['POST'])
def insert_results(attr0):
    val0 = request.form['val0']
    val1 = request.form.get('val1')
    val2 = request.form.get('val1', 'default-value1')

    print(
        f'attribs: {attr0}', 
        f'values: {val0}, {val1}, {val2}', 
        sep='\n'
    )

    # ...

如果您确实坚持 GET 请求,我仍然建议您使用表单,以便您可以将表单字段中的条目作为查询参数传输。 所有数据都在 url 的不同部分传输。查询参数以“?param0=value0¶m1=value1”的形式添加到url中。

<form action="{{ url_for('insert_results', attr0=attr[0], attr1=attr[1]) }}" method="GET">
  <input type="text" name="param0" />
  <input type="text" name="param1" />
  <input type="text" name="param2" />
  <button type="submit">Submit</button>
</form>
@app.route('/insert-results/<int:attr0>-<str:attr1>', methods=['GET'])
def insert_results(attr0, attr1):
    param0 = request.args['param0']
    param0 = request.args.get('param1')
    param1 = request.args.get('param2', 'default-value2')

    print(
        f'attribs: {attr0}, {attr1}', 
        f'params: {param0}, {param1}, {param2}'
        sep='\n'
    )
    
    # ...

无论您是使用表单还是请求 url 中的参数,您都使用一种字典,它允许您使用 .get(key [, default] [, type = <func_ptr>]) 来确保绕过 KeyError,这是一个默认值被传递,并且可能转换了值的类型。

明智地选择传输方法并考虑数据对第三方的可见性,同时考虑到以后可能会以加密形式进行传输。您还应该考虑要发送的数据量。您想要传输的数据越多,您就越快切换到 POST 请求。

特别是多条数据记录是单独传输的,以后可以想到用ajax传输。然而,这是一个更复杂的解决方案,在这一点上的解释会过分。