【问题标题】:Display links to new webpages created显示指向创建的新网页的链接
【发布时间】:2012-10-31 04:11:33
【问题描述】:

我正在使用 Python(使用 heroku)构建一个网站,我想创建一个“最新提交”部分。也就是说,当我在我的 Python 应用程序中创建一个新的@app.route(blah) 时,我希望一个指向新页面的链接显示在我主页的“最新提交”部分下。

这可能吗?

编辑:这是我的代码

import os
import json
from flask import Flask, render_template, url_for
from werkzeug.routing import Map, Rule, NotFound, RequestRedirect, BaseConverter

app = Flask(__name__)


@app.route('/')
def index():
    return  render_template('welcome.html')

@app.route('/about', endpoint='about')
def index():
    return  render_template('about.html')

@app.route('/contact', endpoint='contact')
def index():
    return  render_template('contact.html')

@app.route('/all-links', endpoint='all-links')
def all_links():
    links = []
    for rule in app.url_map.iter_rules():
        url = url_for(rule.endpoint)
        links.append((url, rule.endpoint))
    return render_template('all_links.html', links=links)



if __name__ == '__main__':
    # Bind to PORT if defined, otherwise default to 5000.
    port = int(os.environ.get('PORT', 5000))
    app.run(host='0.0.0.0', port=port)

还有 all_links.html 文件

<!DOCTYPE HTML>
<html lang="en">
    <head>
        <title>links</title>
    </head>
    <body>
        <ul>
            {% for url, endpoint in links %}
            <li><a href="{{ url }}">{{ endpoint }}</a></li>
            {% endfor %}
        </ul>    
    </body>
</html>

【问题讨论】:

  • Is this possible? 是的。如果您发布一些您已经尝试过的代码,您可能会得到更好的响应。
  • 在这一点上,我正在寻找更多的方向,而不是实际的“这就是答案”的答案。我可以在烧瓶中完全做到这一点吗?我是否在我的主 app.py 文件中使用了 python 编码和烧瓶编码的组合?

标签: python heroku flask


【解决方案1】:

应用程序的所有路由都存储在app.url_map 上,它是werkzeug.routing.Map 的一个实例。话虽如此,您可以使用 iter_rules 方法迭代 Rule 实例:

from flask import Flask, render_template, url_for

app = Flask(__name__)

@app.route("/all-links")
def all_links():
    links = []
    for rule in app.url_map.iter_rules():
        if len(rule.defaults) >= len(rule.arguments):
            url = url_for(rule.endpoint, **(rule.defaults or {}))
            links.append((url, rule.endpoint))
    return render_template("all_links.html", links=links)

 

{# all_links.html #}
<ul>
{% for url, endpoint in links %}
<li><a href="{{ url }}">{{ endpoint }}</a></li>
{% endfor %}
</ul>

【讨论】:

  • 所以,您发布的代码中的 for 循环获取 app.url_map 中的所有路由并将它们放入链接列表中。但是 render_template("all_links.html", links=links) 的意义何在?当有人去那里时,这不是让位于 herokuapp.com/all-links 的某些页面返回 all_links.html 吗?
  • @CrossGameChat - 最后一行只是一个示例 - 我将为all_links 模板添加一个示例 Jinja 模板。
  • 非常感谢您的帮助!我仍然收到 500 内部服务器错误“服务器遇到内部错误,无法完成您的请求。服务器过载或应用程序出错。”我用 app.py 和 all_links.html 的代码更新了帖子
  • @CrossGameChat - 我给你的例子缺少关键字 - return。将return 添加到render_template 并再试一次。我也更新了我的示例。
  • 再次感谢您的帮助。我仍然收到错误消息(甚至尝试重新复制您的代码)。我会将代码展示给我的一位教授,看看他们是否能找出问题所在。我有点难以理解烧瓶和 werkzeug 文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 2018-08-07
相关资源
最近更新 更多