带有 .html 扩展名的 Django 平面页面

Django flat pages with .html extension

我正在尝试设置可通过 url(例如 /pages/page1.html 而不是 /pages/page1 访问的 django 平面页面。

遵循 flatpages docs,而不是 flatpages 中间件在根 urls.py 中使用此代码(与 settings.py 在同一文件夹中):

re_path('pages/.*\.html$', include('django.contrib.flatpages.urls')), 

但这会导致 404 错误。

我尝试将扩展指定为非捕获组:

re_path('pages/.*(?:\.html)$', include('django.contrib.flatpages.urls')),

但我仍然收到 404。

为平面页面添加 .html 后缀的正确方法是什么?

你不能那样使用 include。匹配的 .* 部分将被丢弃,不会传递给平面视图。

但您可以直接连接您的平面视图,并捕获组中的 url 部分。

由于 flatpages 应用程序要求 url 部分同时具有前导和尾随斜杠 (/foobar/),因此您必须使用装饰器调整 flatpage 视图函数,以替换.html 带有 / 的扩展名。

from functools import wraps
import re
from django.contrib.flatpages.views import flatpage

def replace_dot_html_with_slash(f):
    """Decorator that adapt the flatpage view to accept .html urls"""
    @wraps(f)
    def wrapper(request, url):
        # pretend the url has a trailing slash instead of `.html`
        return f(request, re.sub(r'\.html$', '/', url))
    return wrapper

adapted_flatpage = replace_dot_html_with_slash(flatpage)

urlpatterns = [
   ...
   re_path(r'^pages/(.*)$', adapted_flatpage)
]

或者,您可以简单地编写自己的平面视图。 It doesn't do anything very complicated.

文档中有更多关于如何配置 flatpages 路由的示例。 https://docs.djangoproject.com/en/2.0/ref/contrib/flatpages/#using-the-urlconf