我正在使用Django 1.10,我现在的目标是使用和不使用尾部斜杠来提供网址。为此,我在URLConf文件中的所有URL中添加了斜杠,然后将APPEND_SLASH
变量值设置为True
(嗯,这是默认值)。
现在问题是外部POST请求(我无法控制)会产生以下错误:
您通过POST调用了此URL,但该URL并未以斜杠结尾 你有APPEND_SLASH设置。 Django无法重定向到斜杠网址 同时保持POST数据。将表单更改为指向 127.0.0.1:8000/Calendar/AddAccounts/(注意斜杠),或在Django设置中设置APPEND_SLASH = False。
他们在Django doc中提到了这一点,但经过数小时的网上冲浪,我无法弄清楚如何解决这个问题。
我也遇到this question,但建议的解决方案对我来说似乎不合适。它说我必须让用户只用尾部斜杠调用我的URL。虽然我知道在其他语言(例如C#)中可以启用两个选项
答案 0 :(得分:1)
我想要支持这两种情况似乎很奇怪。理想情况下,在请求到达Django之前,您可能希望在服务器级别上从非斜杠重定向到斜杠(或者如果您需要,则相反)。
只需选择一个策略并坚持下去,所以将尾部斜杠添加到表单中,永远不要回头。 :)
保持一致非常重要。 https://www.branded3.com/blog/urls-trailing-slash-seo/
答案 1 :(得分:0)
如果 url 用于 API 或者 SEO 对您来说并不重要,您可以通过添加“/?”来考虑带斜线和不带斜线。在 Django 3.X 中:
from django.urls import re_path
re_path(r'^query/?$', 'search.views.query'),
re_path(r'^add/?$', 'search.views.add'),
在 Restframework 路由器中:
from rest_framework.routers import DefaultRouter
class CustomDefaultRouter(DefaultRouter):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.trailing_slash = '/?'
router = CustomDefaultRouter()
router.register('link', ViewSet, basename='link')