【问题标题】:How to use python flask routes with html如何在 html 中使用 python 烧瓶路由
【发布时间】:2015-07-01 14:15:00
【问题描述】:

所以我正在使用 pythong flask 和 sqlalchemy 开发一个项目。

我们有一个完整的合同数据表,其主 ID 为 contract_id。我想我们有 2 种不同的选项来显示合同。

选项 1。 我们有一个通用的 view_contract.html 模板,它向烧瓶上的应用程序路由发出 post 请求,并返回合同的 json 以显示在页面上。但是,我不太喜欢这个想法,因为这样您就不能将某些合同链接复制并粘贴给其他人,因为它将是相同的通用网页 url

选项 2。 我们在烧瓶中有一个应用程序路由 @app.route(contract//view) 并且我们查询数据库以显示该特定的contract_id。但是,我只知道如何使用 flask.jsonify 在 python 中显示数据。如何在 url 中生成 html?

tldr:

如何生成一个网页如contract/112431/view,以html形式加载id为112431的合同。截至目前,我只能使用 python 来完成,这不允许我生成任何我想要的 html 表单或详细信息

这就是我现在所拥有的...我如何将 html 添加到此页面以使其适用于每个合同

@app.route('/contract/<contract_id>/profile')
def view_suitor_profile(contract_id):
    cs = Contract.query.filter(Contract.contract_id == contract_id).all()
    cs_list = []
    for c in cs:
        con = {
            "con id": c.contract_id,
            "lcat" : c.lcat,
            "desired skills" : c.desired_skill,
            "mandatory skills" : c.mandatory_skill,
            "location" : c.work_location
        }
        c_list.append(con)
    return flask.jsonify(c_list=c_list)

【问题讨论】:

  • I can only do it using python 是什么意思?如果你想要一个 HTML 页面,你将不得不编写一些 HTML。
  • 我在我使用的代码中添加了一些代码。我想知道如何发送该数据并为每个带有合同 ID 的 url 加载一个 html 模板。据我了解,html 是静态的,所以当你去 blahblah.html 时它会加载。那么我如何让它每次在具有不同 id 的动态 url 中加载 html 模板
  • 我知道我可以使用 js 来拨打电话,但这会使每个合同的 url 保持相同。我希望网址不同,以便人们可以共享指向特定合同的链接
  • contract_id 是主键 id 还是另一个 id?

标签: python html json database flask


【解决方案1】:

选项 1

使用 AJAX。它易于实施。

选项 2

simple_contracts.py

@app.route('/simple/<contract_id>/page', methods=['GET', 'POST'])
def contracts(contract_id):
    result = dbs.Contracts.select().where(dbs.Contracts.id == contract_id).first()
    return render_template('contracts.html', result=result)

合同.html

<!doctype html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>simple contracts</title>
</head>
<body>
{% if result %}
    {% for contract in result %}
        {{ contract.id }} <br/>
        {{ contract.name }} <br/>
        {{ contract.price }} <br>

{#  annotation: `contract` type object, have access in methods/attributes ex namedtuple  in jinja templates
    ex: in python: somelist = {'id': 12, 'name': 'contractIBM', 'price':1223 }
            access: somelist['id']

    in jinja: somelist.id => 12
            somelist.name => contractIBM etc...
#}
    {% endfor %}
{% endif %}

{#for send DATA in route use ahref args link or forms#}
<a href="{{ url_for('contracts', contract_id=123) }}"> Get info contract 123</a>


</body>
</html>

【讨论】:

    【解决方案2】:

    这给出了选项 2 的示例。

    在您创建数据列表的视图中,您应该使用数据呈现模板,而不是将其作为 json 返回。

    return flask.render_template("template.html",
                                 c_list=c_list)
    

    在您的 html 中,您可以遍历列表并提取所有元素

    <div>
       {% for entry in c_list %}
          <p> Contract: </p>
          <p>{{ entry }}</p>
       {% endfor %}
    </div>
    

    然后,您可以尝试从{{ entry }} 元素中提取更多细节,方法是尝试类似{{ entry.lcat }}

    这允许您创建一个 html 模板,该模板将在调用 render_template 时填充您传递的数据。因此,只要您想要相同的布局,但使用不同的数据,这是一种方法

    【讨论】:

    • render_template不会改变url吗?
    • 我目前无法进行测试,所以这就是我要问的原因。我以前用过,但我不记得它是否改变了网址
    • 不,它没有。 url 在 @route 装饰器中定义。 render_template 仅表示您获取一个 html 文件 + 数据,创建一个 html 页面,然后将其发送回用户。因此,与返回您现在发送的 JSON 数据和新方法的唯一区别在于,新方法将是一个 html 格式的页面,而不是 JSON 文本
    • 很棒的答案!感谢您的解释!
    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 2014-07-17
    • 1970-01-01
    • 2016-01-08
    • 2013-02-04
    相关资源
    最近更新 更多