1

我有一个视图函数,我只想使用请求方法是 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 时,然后重定向到另一个视图。

4

2 回答 2

2

您将不得不使用自定义装饰器。您可以在此处查看 Django 装饰器的代码。在到达您的代码之前,它已经返回了响应,因此无论如何您在视图函数中所做的任何事情都不会运行。

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

于 2013-04-07T09:04:08.607 回答
2

自定义装饰器是要走的路。

我自己使用一个与您需要的类似的,我会发布代码。

支持@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
于 2013-04-07T09:08:39.813 回答