Add sitemap

This commit is contained in:
Bottersnike 2021-12-29 01:18:06 +00:00
parent 40e0319cb6
commit 92a8a4301f
2 changed files with 42 additions and 17 deletions

50
docs.py
View File

@ -1,10 +1,14 @@
from flask import Flask, send_from_directory, render_template
from livereload import Server
import xml_lexer
import datetime
import re
import os
from urllib.parse import urlparse
from flask import Flask, send_from_directory, render_template, make_response, request
from livereload import Server
import xml_lexer
app = Flask(__name__)
app.jinja_options.setdefault('extensions', []).append('jinja2_highlight.HighlightExtension')
@ -99,20 +103,32 @@ for base, _, files in os.walk(TEMPLATES + "/" + PAGES_BASE):
app.add_url_rule(route, route, handler)
# from flask import url_for
# def has_no_empty_params(rule):
# defaults = rule.defaults if rule.defaults is not None else ()
# arguments = rule.arguments if rule.arguments is not None else ()
# return len(defaults) >= len(arguments)
# @app.route("/site-map")
# def site_map():
# links = []
# for rule in app.url_map.iter_rules():
# if "GET" in rule.methods and has_no_empty_params(rule):
# url = url_for(rule.endpoint, **(rule.defaults or {}))
# links.append((url, rule.endpoint))
# return str(links)
from flask import url_for
@app.route("/sitemap.xml")
def sitemap():
host_components = urlparse(request.host_url)
host_base = host_components.scheme + "://" + host_components.netloc + ROOT
links = []
for rule in app.url_map.iter_rules():
if "GET" in rule.methods and len(rule.arguments) == 0:
url = url_for(rule.endpoint, **(rule.defaults or {}))
if not url.endswith(("/", ".html", ".png")):
continue
path = rule.endpoint
if path.endswith("/"):
path += "index.html"
path = os.path.join(TEMPLATES, PAGES_BASE, path.lstrip("/"))
if os.path.exists(path):
mod_time = os.path.getmtime(path)
mod_time = datetime.datetime.fromtimestamp(mod_time).strftime("%Y-%m-%dT%H:%M:%SZ")
else:
mod_time = None
links.append((host_base + url, mod_time))
response = make_response(render_template("sitemap.xml", urls=links))
response.headers["Content-Type"] = "application/xml"
return response
if __name__ == '__main__':
app.config['TEMPLATES_AUTO_RELOAD'] = True

9
templates/sitemap.xml Normal file
View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
{% for url in urls %}
<url>
<loc>{{ url[0] }}</loc>{% if url[1] %}
<lastmod>{{ url[1] }}</lastmod>{% endif %}
</url>
{% endfor %}
</urlset>