文章内容

2023/4/21 17:06:21,作 者: 黄兵

Flask 生成站点地图

在 Flask 中如果我们需要生成站点地图,可以通过读取数据库的方式将 url 写入到 sitemap.xml 文件当中。

我们也可以使用第三方库:Flask-Sitemap 来实现。

我们以 Flask-Sitemap 库为例,看看在 Flask 中如何生成站点地图。

1、安装 Flask-Sitemap 展。可以使用以下命令来安装:

pip install Flask-Sitemap

2、在 Flask 应用程序中导入 Flask-Sitemap 扩展:

from flask_sitemap import Sitemap

3、创建 Sitemap 实例,并将其附加到 Flask 应用程序:

app = Flask(__name__)
sitemap = Sitemap(app=app)

4、为 Flask 应用程序中的每个路由定义 URL 和相关选项:

@main.route('/notices')
def notices():
    return render_template('notice/notices.html')


@site_map.register_generator
def notices():
    # Not needed if you set SITEMAP_INCLUDE_RULES_WITHOUT_PARAMS=True
    yield 'main.notices', {}

5、最后,在 Flask 应用程序中添加以下配置:

SITEMAP_INCLUDE_RULES_WITHOUT_PARAMS = True
SITEMAP_URL_SCHEME = 'https'
SITEMAP_HOST_NAME = 'pdf-lib.org'

SITEMAP_INCLUDE_RULES_WITHOUT_PARAMS是 Flask-Sitemap 扩展的配置选项之一。它的作用是告诉扩展包括没有参数的路由。

这些配置告诉 Flask-Sitemap 扩展包括没有参数的路由,并指定站点地图的 URL 方案和主机名。

这里还需要说明一下,如果网站 url 包含一些参数,例如下面这样:

我们需要在 Sitemap 实例中注册一个生成器函数来为每个参数化 URL 生成站点地图。我们可以按如下方式注册生成器函数:

from flask import url_for
from flask_sitemap import Sitemap

app = Flask(__name__)
sitemap = Sitemap(app=app)

@app.route('/product/', methods=['GET'])
@login_required
def product(product_id):
    # Route logic

def product_generator():
    for product_id in range(1, 10):  # This is just an example. You should replace this with your own code to generate product IDs dynamically
        yield 'product', {'product_id': product_id}

sitemap.register_generator(product_generator)

if __name__ == '__main__':
    app.run()

在上面的实例中,创建了一个名为 product_generator 的生成器函数,该函数返回一个包含每个参数化 URL 的元组的迭代器。

元组的第一个元素是路由名称,第二个元素是一个字典,包含用于构建 URL 的参数。在这里,我们使用 product_id 参数来构建 URL。 我们然后使用 sitemap.register_generator() 方法将生成器函数注册到 Sitemap 实例中。

这告诉 Flask-Sitemap 扩展为每个参数化 URL 生成站点地图。最后,我们可以使用url_for()函数来生成每个参数化 URL,并返回生成的 XML 文件。 请注意,这只是一个示例,您需要根据自己的路由和业务逻辑实现自己的生成器函数。
下面是一个与项目比较接近的示例,可以更好的看到如何通过数据库的数据来生成站点地图:

@main.route('/article/<string:link_text>', methods=['GET'])
def article(link_text):
    post = Article.query.filter_by(link_text=link_text).first_or_404()
    return render_template('notice/article.html')


@site_map.register_generator
def articles():
    for article_info in CloudArticle.query.all():
        # Not needed if you set SITEMAP_INCLUDE_RULES_WITHOUT_PARAMS=True
        yield 'main.article', {'link_text': article_info.link_text}

我们直接通过读取数据库数据,来获取文章链接,之后生成站点地图。

这里还需要着重强调一下这个参数:SITEMAP_INCLUDE_RULES_WITHOUT_PARAMS

官方的文档里没有介绍具体作用,经过查询相关资料,这个参数有如下作用:

默认情况下,Flask-Sitemap 扩展只包括带有参数的路由。例如,在以下路由中:

@app.route('/product/', methods=['GET'])
@login_required
def product(product_id):
    # Route logic

只有 /product/1/product/2 等具有参数的 URL 会包含在生成的站点地图中。

但是,如果您想要包括没有参数的路由,例如:

@app.route('/about', methods=['GET'])
def about():
    # Route logic

您需要设置SITEMAP_INCLUDE_RULES_WITHOUT_PARAMS选项为True,如下所示:

app.config['SITEMAP_INCLUDE_RULES_WITHOUT_PARAMS'] = True

这样,Flask-Sitemap 扩展将包括所有没有参数的路由,包括 /about 在内,生成站点地图时都会被包含。
经过测试,其实设置成 True 之后,有一些不便在站点地图中的 url (例如:用户登录之后的页面,用户激活操作,改密操作等)都会被包含在内,这个不应该出现在站点地图中的。


参考资料:

1、Flask-Sitemap

2、chatGPT


其它文章推荐:

1、Flask 获取当前域名

2、Flask 获取环境变量

3、Flask 如何获取当前蓝图

4、Flask request.args.get ‘+’ 转义相关问题总结

5、Flask 如何获取当前请求路径


黄兵个人博客原创。

转载请注明出处:黄兵个人博客 - Flask 生成站点地图

分享到:

发表评论

评论列表