提问人:ccpizza 提问时间:7/21/2018 更新时间:7/21/2018 访问量:472
带有 .html 扩展名的 Django 平面页面
Django flat pages with .html extension
问:
我正在尝试设置可以通过 url 而不是 ./pages/page1.html
/pages/page1
遵循简单页面文档,而不是简单页面中间件在根目录下使用此代码(在同一个文件夹中):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
答:
1赞
Håken Lid
7/21/2018
#1
你不能那样使用。比赛的部分将被简单地丢弃,而不会传递到简单页面视图。include
.*
但是您可以直接挂钩您的简单页面视图,并在组中捕获 url 部分。
由于简单页面应用要求部件同时具有前导斜杠和尾随斜杠 (),因此您必须使用装饰器调整视图函数,该装饰器将扩展名替换为 .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
评论
0赞
ccpizza
7/21/2018
谢谢,但这似乎不起作用。此外,django 在将 URL 转换为.html
/pages/page1.html/
0赞
Håken Lid
7/21/2018
如何?url 不匹配吗?有重定向吗?您正在尝试哪个网址?也许您在设置中使用了吗?如果你也想支持结局,这会把事情搞砸。APPEND_SLASH = True
.html
0赞
ccpizza
7/21/2018
APPEND_SLASH
默认情况下为 true,即使它在 docs.djangoproject.com/en/2.0/ref/settings/#append-slash 中不存在settings.py
0赞
Håken Lid
7/21/2018
你是对的。似乎简单页面应用程序在任何情况下都希望 url 具有尾部斜杠。因此,您需要使用装饰器来调整视图参数,或者必须编写自己的视图函数。我已经更新了我的答案,并提出了如何编写这样一个装饰器的建议。flatepage()
0赞
ccpizza
7/21/2018
感谢您抽出宝贵时间接受采访!非常感谢!
评论