当405加注时,响应重定向到不同的页面

时间:2013-04-07 07:23:29

标签: python django

我有一个视图功能,我只想使用请求方法是POST。我在这里了解了require_POST装饰器,但我想要的是如果方法不是POST,那么使用HttpResponseRedirect将用户重定向到不同的视图。我怎么能这样做?

from django.views.decorators.http import require_POST

@require_POST
def my_view(request):
    # I can assume now that only POST requests make it this far
    # ...

我知道我可以通过添加两行代码来实现,而不是在我的方法本身中使用require_POST重定向,例如

if request.method != 'POST':
    return HttpResponseRedirect(view_url)

但是我对使用装饰器本身更感兴趣,当这个装饰器引发405时,然后重定向到另一个视图。

2 个答案:

答案 0 :(得分:1)

您必须使用自定义装饰器。您可以看到Django decorator here的代码。它已经在你的代码到达之前就已经返回了一个响应,所以你在视图函数中所做的一切都无论如何都会运行。

如果请求不是POST,手动返回重定向没有任何问题。如果你在代码中的几个不同的地方使用这个模式,我会稍后将它重构为装饰器。但如果这是你使用它的第一个地方,那就太过分了。

答案 1 :(得分:1)

自定义装饰器是可行的方法。

我自己使用的类似于你需要的那个,我会发布代码。

自从他成为第一个以来,请回复@aychedee的回答。 :)

def require_post_decorator(function=None, redirect_url='/'):
    def _decorator(view_function):
        def _view(request, *args, **kwargs):
            if request.method == 'POST':
                #do some before the view is reached stuffs here.
                return view_function(request, *args, **kwargs)
            else:
                return HttpResponseRedirect(redirect_url)

        _view.__name__ = view_function.__name__
        _view.__dict__ = view_function.__dict__
        _view.__doc__ = view_function.__doc__

        return _view

    if function:
        return _decorator(function)
    return _decorator