Skip to content

Commit 5f202f8

Browse files
committed
Add sitemap using flask-sitemapper
1 parent ece0f48 commit 5f202f8

File tree

6 files changed

+46
-5
lines changed

6 files changed

+46
-5
lines changed

app.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from typing import cast
33

44
from views import views
5+
from views.sitemap import sitemapper
56

67
app = Flask(
78
__name__,
@@ -10,6 +11,7 @@
1011
static_url_path="/static",
1112
)
1213
app.register_blueprint(views.app_views)
14+
sitemapper.init_app(app)
1315

1416

1517
@app.errorhandler(404)
@@ -20,3 +22,8 @@ def page_not_found(e):
2022
@app.route("/robots.txt")
2123
def robots_txt():
2224
return send_from_directory(cast(str, app.static_folder), request.path[1:])
25+
26+
27+
@app.route("/sitemap.xml")
28+
def r_sitemap():
29+
return sitemapper.generate()

pdm.lock

Lines changed: 15 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ dependencies = [
99
"flask>=3.0.0",
1010
"typing-extensions>=4.8.0",
1111
"pyright>=1.1.334",
12+
"flask-sitemapper>=1.7.0",
1213
]
1314
requires-python = ">=3.12"
1415
readme = "README.md"

views/challenge.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,12 @@ class Level(StrEnum):
2121

2222

2323
ChallengeName: TypeAlias = str
24-
ChallengeKey: TypeAlias = tuple[Level, ChallengeName]
24+
25+
26+
@dataclass(frozen=True)
27+
class ChallengeKey:
28+
level: Level
29+
name: ChallengeName
2530

2631

2732
@dataclass
@@ -71,7 +76,7 @@ def _load_challenges() -> dict[ChallengeKey, Challenge]:
7176
level, challenge_name = dir_name.split("-", maxsplit=1)
7277
with open(filename, "r") as file:
7378
code = file.read()
74-
challenges[(level, challenge_name)] = Challenge(
79+
challenges[ChallengeKey(Level(level), challenge_name)] = Challenge(
7580
name=challenge_name,
7681
level=Level(level),
7782
code=code,

views/sitemap.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from flask_sitemapper import Sitemapper
2+
3+
sitemapper = Sitemapper()

views/views.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
88
request,
99
)
1010

11-
from .challenge import challenge_manager, Level
11+
from .challenge import challenge_manager, Level, ChallengeKey
12+
from .sitemap import sitemapper
1213

1314
app_views = Blueprint("app_views", __name__)
1415

1516

17+
@sitemapper.include(changefreq="daily", priority=1.0)
1618
@app_views.route("/")
1719
def index():
1820
return render_template(
@@ -21,9 +23,18 @@ def index():
2123
)
2224

2325

26+
@sitemapper.include(
27+
changefreq="daily",
28+
priority=0.5,
29+
# https://github.com/h-janes/flask-sitemapper/wiki/Usage#dynamic-routes
30+
url_variables={
31+
"level": [c.level for c in challenge_manager.challenges.keys()],
32+
"name": [c.name for c in challenge_manager.challenges.keys()],
33+
},
34+
)
2435
@app_views.route("/<level>/<name>", methods=["GET"])
2536
def get_challenge(level: str, name: str):
26-
challenge_key = (Level(level), name)
37+
challenge_key = ChallengeKey(Level(level), name)
2738
if not challenge_manager.has_challenge(challenge_key):
2839
return redirect("/")
2940

0 commit comments

Comments
 (0)