ajax post上的django-csrf保护

时间:2019-02-20 13:12:36

标签: python ajax django

我正在使用django 1.7和python 2.7。为了防止对ajax发布请求的csrf攻击,我在发送前在ajax标头中添加了csrf令牌。 在视图中,我添加了csrf_protect装饰器来检查令牌。在这种情况下,一切正常。但是在我的项目中,在我未实现csrf令牌的其他视图中内部调用了views.py中的此函数,这导致403错误。所以我只想在有ajax post调用时必须检查csrf_protect装饰器。其他电话都可以忽略。

def check_token(func):
        def wrapper(request, *args, **kwargs):
            if request.is_ajax():
                return csrf_protect(func(request,*args, **kwargs))
            return func(request,*args, **kwargs )
        return wrapper

@check_token
def myViews(request,mob,id):
"""function starts here"""

2 个答案:

答案 0 :(得分:1)

您的装饰器等效于

myViews = check_token(myViews)

您可以手动将其应用到新名称:

def unprotected_view(request,mob,id):
    """function starts here"""
    ...

protected_view = check_token(unprotected_view)

现在您已经有了一个修饰的名称和一个非修饰的名称。

答案 1 :(得分:1)

从其他视图中调用视图并不是Django视图应该做的。如果您具有一些通用功能来制定响应,请将该功能设为单独的功能。然后让受保护的视图调用该函数,其他视图也调用该函数:

@csrf_protect
def my_view(request, mob, id):
     return craft_generic_response(request, mob, id)

def craft_generic_response(request, mob, id)
     # do stuff to create response
     return response

def another_view(request, mob, id):
     # do stuff
     response = craft_generic_response(**kwargs)
     # do more stuff