我正在使用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"""
答案 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