django - 带有 .html 扩展名的 Django 平面页面
问题描述
我正在尝试设置可以通过 url 访问的 django 平面页面,/pages/page1.html
而不是/pages/page1
.
遵循flatpages 文档,而不是 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)
]
或者,您可以简单地编写自己的平面视图。它没有做任何非常复杂的事情。
文档中有更多关于如何配置平面页面路由的示例。 https://docs.djangoproject.com/en/2.0/ref/contrib/flatpages/#using-the-urlconf
推荐阅读
- c++ - 在 Z3 中控制随机性
- python - python - 如何处理python中datetime.replace中月份的日期错误?
- java - Tomcat 未处理外部服务抛出的 500 个内部服务器代码
- flutter - 如何解决此错误“在构建期间调用 setState() 或 markNeedsBuild()。”?
- android - 如何使用 Kotlin 在 Android Studio 中创建意图数组对象
- google-apps-script - Chrome 83 版发布后,模态对话框中的文件下载不起作用
- audio - 添加水印时FFMPEG输出被截断
- java - 使用自定义存储库中的依赖项构建 JAR
- javascript - 下标标签在 HTML 选择标签中不起作用
- anaconda - 使用 conda 从特定通道安装包