我们可以将 MkDocs 的渲染 HTML 页面视为简单的 Flask 模板。所以我们所要做的就是创建一个 Flask 端点,它首先进行权限检查,然后基于 URL,提供呈现的 MkDocs HTML 文件或相关的静态文件。
让我们调用我们的新端点bridge。首先,将 MkDocs site 目录中的所有内容放到 Flask 的 templates/bridge 目录中。我的示例 MkDocs 树如下所示:
$ tree templates/bridge
templates/bridge
├── 404.html
├── css
│ ├── base.css
│ ├── bootstrap.min.css
│ └── font-awesome.min.css
├── dir1
│ ├── sub1
│ │ └── index.html
│ └── sub2
│ └── index.html
├── dir2
│ ├── sub1
│ │ └── index.html
│ └── sub2
│ └── index.html
├── fonts
│ ├── fontawesome-webfont.eot
│ ├── fontawesome-webfont.svg
│ ├── fontawesome-webfont.ttf
│ ├── fontawesome-webfont.woff
│ └── fontawesome-webfont.woff2
├── img
│ ├── favicon.ico
│ └── grid.png
├── index.html
├── js
│ ├── base.js
│ ├── bootstrap.min.js
│ └── jquery-1.10.2.min.js
├── search
│ ├── lunr.js
│ ├── main.js
│ ├── search_index.json
│ └── worker.js
├── sitemap.xml
└── sitemap.xml.gz
还有我们新的 Flask bridge 端点:
from flask import Flask, render_template, send_from_directory
app = Flask(__name__)
@app.route('/bridge/')
@app.route('/bridge/<path:p1>/')
@app.route('/bridge/<path:p1>/<path:p2>/')
@app.route('/bridge/<path:p1>/<path:p2>/<path:p3>/')
def bridge(p1=None, p2=None, p3=None):
# Permissions checking...
# Serve MkDocs's static files requested from CSS files
if p1 == 'css' and p2 in ('img', 'fonts'):
# CSS fix, e.g. /bridge/css/img/example.png -> /bridge/img/example.png
return send_from_directory(f'templates/bridge/{p2}/', p3)
# Serve MkDocs's static files
if p1 in ('css', 'js', 'fonts', 'search'):
return send_from_directory(f'templates/bridge/{p1}/', p2)
# Serve rendered MkDocs HTML files
if p3 != None:
template = f'bridge/{p1}/{p2}/{p3}/index.html'
elif p2 != None:
template = f'bridge/{p1}/{p2}/index.html'
elif p1 != None:
template = f'bridge/{p1}/index.html'
else:
template = 'bridge/index.html'
return render_template(template)
如您所见,我们创建了几个路径定义。由于 MkDocs 在任何地方都使用相对路径,因此 MkDocs 中的 URL 路径 dir1/sub1/ 将变为 https://yoursite.com/bridge/dir1/sub1/,因此我们可以使用此 URL 路由方案捕获它们,并且 URL 部分将落在 p1、p2、p3 路径变量中我们将使用它来提供相应的内容。
有两种类型的内容:静态文件(例如 CSS 文件或图像)和 HTML 内容文件。静态文件将位于css、js、images、fonts 等目录中,因此当p1 等于其中之一时,我们使用 Flask 的send_from_directory 函数为它们提供服务。从 CSS 文件引用的静态文件需要进行特定处理,因为 MkDocs 在那里也使用相对路径。
对于渲染的index.html文件,我们只需要根据路径确定嵌套级别,并将选定的index.html文件作为普通的Flask模板返回。由于 MkDocs 使用相对 URL,我们不必修改呈现的 HTML 文件中的任何内容,每个 URL 都会收到 /bridge/ 前缀,因此我们可以使用 bridge 端点为它们提供服务。
您应该在bridge 的开头进行权限检查(或作为装饰者,取决于您的解决方案)。如果您的内容嵌套更深,您可能需要添加 p4 和/或 p5 路径变量,但这是对我的示例的直接扩展。
注意:Flask 也会提供 404 错误页面。