【问题标题】:Django - issue with APPEND_SLASH and POST requestsDjango - APPEND_SLASH 和 POST 请求的问题
【发布时间】:2018-09-02 21:23:58
【问题描述】:

我正在使用 Django 1.10,我现在的目标是让带有斜杠和不带斜杠的 url 都可用。为此,我在 URLConf 文件中的所有 URL 中添加了斜线,然后将 APPEND_SLASH 变量值设置为 True(嗯,这是默认值)。

现在的问题是外部 POST 请求(我无法控制)产生以下错误:

您通过 POST 调用了此 URL,但该 URL 不以斜杠结尾,并且 您设置了 APPEND_SLASH。 Django 无法重定向到斜杠 URL 同时维护 POST 数据。将表单更改为指向 127.0.0.1:8000/Calendar/AddAccounts/(注意尾部斜杠),或在您的 Django 设置中设置 APPEND_SLASH=False。

他们在Django doc 中提到了这一点,但是在网上冲浪了几个小时后,我不知道如何解决这个问题。

我也遇到过this question,但我似乎无法接受所提议的解决方案。它说我必须让用户只用斜杠调用我的 URL。虽然我知道在其他语言中(例如 C#)可以同时启用这两个选项

【问题讨论】:

    标签: django


    【解决方案1】:

    你想同时支持这两种情况对我来说似乎很奇怪。理想情况下,您希望在请求到达 Django 之前,在服务器级别(nginx/apache/无论您使用什么)上从非斜杠重定向到斜杠(或者如果需要,可以反过来)。

    只需选择一个策略并坚持下去,所以在您的表单中添加尾部斜线并且永远不要回头。 :)

    保持一致很重要。 https://www.branded3.com/blog/urls-trailing-slash-seo/

    【讨论】:

    • redirect from non slash to slash on the server level 是什么意思。看来这就是APPEND_SLASH 应该做的,对吧?但这会导致 POST 请求出现问题
    • 你的意思是应该在NGINX或APACHE的层面上做?
    • 是的,通过负载均衡器或 nginx/apache
    【解决方案2】:

    如果 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')
    

    【讨论】:

      猜你喜欢
      • 2017-07-13
      • 1970-01-01
      • 2021-01-04
      • 2014-03-22
      • 2021-11-01
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多