文章内容
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 (例如:用户登录之后的页面,用户激活操作,改密操作等)都会被包含在内,这个不应该出现在站点地图中的。
参考资料:
2、chatGPT
其它文章推荐:
4、Flask request.args.get ‘+’ 转义相关问题总结
黄兵个人博客原创。
转载请注明出处:黄兵个人博客 - Flask 生成站点地图
评论列表