您的位置:

最佳方案处理django RuntimeError("You called this URL via %(method)s, but the URL doesn't end ""in a slash and you have APPEND_SLASH set. Django can't ""redirect to the slash URL while maintaining %(method)s data. ""Change your form to point to %(url)s (note the trailing ""slash), or set APPEND_SLASH=False in your Django settings."% {"method": request.method,"url": request.get_host() + new_path,})

  发布时间:2023-04-03 10:23:13
报错的原因这个错误表明,在Django的settings中设置了并且用户请求的URL没有斜线结尾。Django在这种情况下会尝试重定向到带有斜线的URL,但是由于在重定向过程中会丢失请求方法 的数据,所以Django会抛出这个错误。这样Django就不会尝试重定向。这里的 `redirect_view` 方法是为了解决访问 不带斜线的 `example` 导致时出现错误的情况。

报错的原因

这个错误表明,在Django的settings中设置了`APPEND_SLASH=True`,并且用户请求的URL没有斜线结尾。Django在这种情况下会尝试重定向到带有斜线的URL,但是由于在重定向过程中会丢失请求方法(GET, POST, etc) 的数据,所以Django会抛出这个错误。

解决方案有两种:

1. 在URL中添加斜线,即在URL的末尾加上斜线。

2. 将`APPEND_SLASH` 设置为 `False`。


# settings.py
APPEND_SLASH = False

这样Django就不会尝试重定向到带有斜线的URL。

需要注意的是在实际生产环境中,很多时候是有必要添加斜线来保证网站资源可以正常访问。

如何解决

解决方案有两种:

1. 在URL中添加斜线,即在URL的末尾加上斜线。这样Django就不会尝试重定向

2. 在settings.py中将`APPEND_SLASH`设置为`False`,以关闭Django尝试重定向的功能


# settings.py
APPEND_SLASH = False

如果你使用了Django的URL dispatcher 使用path()或re_path()来定义url, 你可以在后面加上斜线来保证URL末尾是斜线


path('example/', views.example_view, name='example'),

另外如果你在你的应用中,有些URL是可以不带斜线访问的,那么在这些URL视图中可以添加一行代码


from django.shortcuts import redirect

def example_view(request):
    return redirect('example/', permanent=True)

这样当用户访问不带斜线的URL时,就会被重定向到带斜线的URL。

使用例子

可以看下这个例子:


from django.urls import path
from . import views

urlpatterns = [
    path('example/', views.example_view, name='example'),
    path('example', views.redirect_view, name='example_redirect'),
]

from django.shortcuts import redirect

def example_view(request):
    # your view logic
    return render(request, 'example.html')

def redirect_view(request):
    return redirect('example', permanent=True)

在这个例子中,当用户访问`example` 时会被重定向到 `example/`。这里的 `redirect_view` 方法是为了解决访问 不带斜线的 `example` 导致 `APPEND_SLASH = True` 时出现错误的情况。

还需要注意的是 如果设置了APPEND_SLASH = False,那么以上重定向方式是不会进行重定向的。那么需要保证所有URL都以斜线结尾。