简体   繁体   中英

django-csrf protection on ajax post

I am working on django 1.7 and python 2.7. To prevent csrf attack on ajax post request i have added csrf token in ajax header before send. In views i have added csrf_protect decorator to check the token. Everything is working fine in this scenario. But In my project this function in views.py is being called internally in other views where i haven't implemented csrf token, this causing 403 error.So what i want to do is only when there is ajax post call have to check csrf_protect decorator. Every other calls can neglect.

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"""

Your decorator is equivalent to

myViews = check_token(myViews)

You could apply it manually to a new name:

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

protected_view = check_token(unprotected_view)

Now you have a decorated and a non-decorated name for it.

Calling views from within other views is not really what Django views are supposed to do. If you have some generic functionality to craft a response, make that a separate function. Then let your protected view call that function and your other views call it as well:

@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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM