带有 .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
我正在尝试设置可通过 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