• 网站地图应每天至少更新一次,因为网站地图为搜索引擎提供了网站内容和结构的地图。这有助于搜索引擎更高 效地发现网站页面并为其编制索引,从而提高网站在搜索结果中的可见性。

基本用法

Flask-Sitemap 是一个 Flask 扩展,用于轻松地为您的网站生成 XML 站点地图(Sitemap)。XML 站点地图是帮助搜索引擎了解您的网站结构,并更有效地抓取您的网页的一种方式。通过使用 Flask-Sitemap,您可以自动化站点地图的创建过程,确保每当有新的页面或内容添加到您的网站时,站点地图都会自动更新。

安装

要安装 Flask-Sitemap,您可以通过 pip 命令来完成:

pip install flask-sitemap

基本用法

在您的 Flask 应用中使用 Flask-Sitemap,首先需要导入并初始化扩展:

from flask import Flask
from flask_sitemap import Sitemap

app = Flask(__name__)
ext = Sitemap(app=app)

# 如果您希望在应用实例化之后再初始化扩展,可以这样做:
# ext = Sitemap()
# ext.init_app(app)

接下来,您可以使用装饰器 @ext.register_generator 来注册生成站点地图条目的函数。这个函数应该返回一个字典列表,其中每个字典代表站点地图中的一个条目,包含至少 viewvalues 键。view 是视图函数的名称,而 values 是传递给该视图函数的参数。

例如:

@app.route('/')
def index():
    return "Hello, World!"

@ext.register_generator
def sitemap_urls():
    # 静态页面
    yield 'index', {}

    # 动态内容
    for post_id in range(1, 10):  # 假设这里有9篇博客文章
        yield 'blog_post', {'post_id': post_id}

@app.route('/blog/<int:post_id>')
def blog_post(post_id):
    return f"Blog Post {post_id}"

在这个例子中,我们定义了两个路由:一个是主页,另一个是动态生成的博客文章页面。我们还注册了一个站点地图生成器函数 sitemap_urls,它会为每个路由生成相应的条目。

配置

Flask-Sitemap 还允许您配置一些选项,比如站点地图文件的 URL 路径、默认的更改频率 (changefreq) 和优先级 (priority) 等等。这些配置可以在应用的配置对象中设置,例如:

app.config['SITEMAP_INCLUDE_RULES_WITHOUT_PARAMS'] = True
app.config['SITEMAP_URL_SCHEME'] = 'https'
app.config['SITEMAP_GZIP'] = True
  • SITEMAP_INCLUDE_RULES_WITHOUT_PARAMS: 是否包括没有参数的规则,默认为 False
  • SITEMAP_URL_SCHEME: 指定 URL 的协议,默认为 'http'
  • SITEMAP_GZIP: 是否对生成的站点地图进行 gzip 压缩,默认为 False

生成站点地图

一旦配置好并注册了生成器,当访问站点地图的 URL(默认为 /sitemap.xml)时,Flask-Sitemap 将自动生成并返回站点地图 XML 文件。如果启用了 gzip 压缩,返回的将是压缩后的文件。

以上就是使用 Flask-Sitemap 的基本介绍。如果您有更复杂的需求,比如为不同的语言版本生成独立的站点地图,或者控制某些特定页面的 lastmod(最后修改时间)属性,可以查阅 Flask-Sitemap 的官方文档以获取更多详细信息。

添加lastmod

在使用 Flask-Sitemap 生成 XML 站点地图时,为每个 URL 条目指定 lastmod(最后修改时间)是一个非常有用的特性。这可以帮助搜索引擎更好地理解页面何时更新,从而更频繁地抓取最近更新的页面。Flask-Sitemap 允许您为每个条目单独设置 lastmod 属性。

设置 lastmod 属性

要在生成站点地图条目时设置 lastmod,您需要在生成器函数中为每个条目提供一个 lastmod 键。lastmod 可以是一个 datetime 对象或一个符合 ISO 8601 格式的字符串。

以下是一个示例,展示了如何在生成站点地图条目时为每个条目设置 lastmod 属性:

from datetime import datetime
from flask import Flask
from flask_sitemap import Sitemap

app = Flask(__name__)
ext = Sitemap(app=app)

@app.route('/')
def index():
    return "Welcome to the home page!"

@app.route('/blog/<int:post_id>')
def blog_post(post_id):
    return f"Blog Post {post_id}"

@ext.register_generator
def sitemap_urls():
    # 静态页面
    yield 'index', {}, datetime(2023, 10, 1)  # 设置最后修改时间为 2023 年 10 月 1 日

    # 动态内容
    posts = [
        {'id': 1, 'lastmod': datetime(2023, 10, 2)},
        {'id': 2, 'lastmod': datetime(2023, 10, 3)},
        {'id': 3, 'lastmod': datetime(2023, 10, 4)}
    ]
    for post in posts:
        yield 'blog_post', {'post_id': post['id']}, post['lastmod']

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

在这个例子中,我们为首页和每篇博客文章都设置了 lastmod 属性。首页的 lastmod 被硬编码为 2023 年 10 月 1 日,而每篇博客文章的 lastmod 则根据文章的实际修改时间来设置。

注意事项

  • 时间格式:确保 lastmod 使用的是 datetime 对象或 ISO 8601 格式的字符串。例如,2023-10-01T12:00:00+08:00
  • 时区:如果您的应用涉及多个时区,确保 lastmod 的时间是正确的时区。通常情况下,使用 UTC 时间是一个好的选择。
  • 性能考虑:如果您的应用有大量的动态内容,计算每个条目的 lastmod 可能会影响性能。在这种情况下,可以考虑缓存 lastmod 值或使用数据库查询来优化性能。

通过合理设置 lastmod,您可以提高搜索引擎对您网站内容的抓取效率,从而提升网站的可见性和排名。

动态追加

Flask-Sitemap 中,add_url_rule 方法用于手动向站点地图中添加单个 URL 条目。这对于处理少量动态内容或特定的 URL 非常有用。下面是如何使用 add_url_rule 方法的详细说明和示例。

使用 add_url_rule 方法

add_url_rule 方法的签名如下:

add_url_rule(view, values=None, lastmod=None, changefreq=None, priority=None, endpoint=None)
  • view:视图函数的名称。
  • values:传递给视图函数的参数字典。
  • lastmod:最后修改时间,可以是 datetime 对象或 ISO 8601 格式的字符串。
  • changefreq:更改频率,可选值包括 'always', 'hourly', 'daily', 'weekly', 'monthly', 'yearly', 'never'
  • priority:优先级,范围从 0.0 到 1.0。
  • endpoint:视图函数的端点名称(可选)。

示例

假设您有一个简单的 Flask 应用,其中包含一些静态页面和动态生成的博客文章。您希望在创建或更新博客文章时动态地将其添加到站点地图中。

1. 安装 Flask-Sitemap

首先,确保您已经安装了 Flask-Sitemap

pip install flask-sitemap

2. 创建 Flask 应用

from flask import Flask
from flask_sitemap import Sitemap
from datetime import datetime

app = Flask(__name__)
ext = Sitemap(app=app)

# 静态页面的视图函数
@app.route('/')
def index():
    return "Welcome to the home page!"

# 博客文章的视图函数
@app.route('/blog/<int:post_id>')
def blog_post(post_id):
    # 模拟从数据库获取数据
    posts = {
        1: {'title': 'First Post', 'last_modified': datetime(2023, 10, 1)},
        2: {'title': 'Second Post', 'last_modified': datetime(2023, 10, 2)},
        3: {'title': 'Third Post', 'last_modified': datetime(2023, 10, 3)}
    }
    post = posts.get(post_id)
    if post is None:
        return "Post not found", 404
    return f"Blog Post {post['title']}"

# 动态添加单个条目
def add_blog_post_to_sitemap(post_id, last_modified):
    ext.add_url_rule(
        view='blog_post',
        values={'post_id': post_id},
        lastmod=last_modified,
        changefreq='monthly',
        priority=0.8
    )

# 示例:动态添加几篇博客文章
add_blog_post_to_sitemap(1, datetime(2023, 10, 1))
add_blog_post_to_sitemap(2, datetime(2023, 10, 2))
add_blog_post_to_sitemap(3, datetime(2023, 10, 3))

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

解释

  1. 静态页面:定义了一个简单的首页视图函数 index
  2. 动态内容:定义了一个博客文章的视图函数 blog_post,模拟从数据库中获取文章数据。
  3. 动态添加条目:定义了一个 add_blog_post_to_sitemap 函数,用于将博客文章动态地添加到站点地图中。这个函数使用 ext.add_url_rule 方法,传入视图函数名称、参数、最后修改时间、更改频率和优先级。
  4. 示例调用:在应用启动时,调用 add_blog_post_to_sitemap 函数,动态添加几篇博客文章的条目。

动态添加条目的场景

在实际应用中,您可能需要在创建或更新博客文章时动态地调用 add_blog_post_to_sitemap 函数。例如,在博客文章保存到数据库后,可以调用该函数来更新站点地图。

@app.route('/create_post', methods=['POST'])
def create_post():
    # 模拟从表单获取数据
    title = request.form['title']
    content = request.form['content']
    last_modified = datetime.now()

    # 将文章保存到数据库
    # 假设 save_post_to_db 是一个保存文章到数据库的函数
    post_id = save_post_to_db(title, content, last_modified)

    # 动态添加到站点地图
    add_blog_post_to_sitemap(post_id, last_modified)

    return redirect(f'/blog/{post_id}')

在这个示例中,当用户提交创建博客文章的表单时,文章会被保存到数据库,并且 add_blog_post_to_sitemap 函数会被调用来将新的文章条目添加到站点地图中。

通过这种方式,您可以确保站点地图始终是最新的,包含所有最新的内容。