django-csrf защита на посту ajax - PullRequest
0 голосов
/ 20 февраля 2019

Я работаю над django 1.7 и python 2.7.Чтобы предотвратить атаку csrf на пост-запрос ajax, я добавил токен csrf в заголовок ajax перед отправкой.В представлениях я добавил csrf_protect декоратор, чтобы проверить токен.В этом сценарии все работает нормально.Но в моем проекте эта функция в views.py вызывается внутренне в других представлениях, где я не реализовал токен csrf, это вызывает ошибку 403. Поэтому я хочу сделать только, когда есть пост-вызов ajax, нужно проверить декоратор 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 голосов
/ 20 февраля 2019

Вызов представлений из других представлений не совсем то, что должны делать представления 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
0 голосов
/ 20 февраля 2019

Ваш декоратор эквивалентен

myViews = check_token(myViews)

Вы можете применить его вручную к новому имени:

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

protected_view = check_token(unprotected_view)

Теперь у вас есть декорированное и не декорированное имя для него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...