Django Тестирование API: освобождение от csrf - PullRequest
0 голосов
/ 13 июля 2020

Я получаю сообщение об ошибке "Forbidden (CSRF cookie not set.): /user/admin/sign-up" всякий раз, когда тестирую представления на основе классов. Когда я меняю эти представления на функциональные представления с @csrf_exempt поверх объявления функции, он работает.

Postman POST Request:

  • localhost: 8000 / admin / sign-up
  • body: {'email' : 'email@gmail.com', 'password' : 123123}

Шаблоны URL-пути:

...
path(‘/admin/sign-up’, views.AdminSignUpView),
...

Просмотры .py

@csrf_exempt
def token_verification(request,**kwargs):
    if request.method == “POST”:
        id = kwargs.get(‘id’)
        token = kwargs.get(‘token’)
        user = User.objects.get(id = id)
        redirect_url = ‘/eval/intro’
        is_valid = user_activation_token.check_token(user,token)
        if is_valid:
            user.is_active = True
            user.save()
            return HttpResponseRedirect(redirect_url,status = 200)
        else:
            return HttpResponse(status = 403)


class AdminSignInView(View):
    @csrf_exempt
    def post(self,request):
        data = json.loads(request.body)
        try:
            if User.objects.filter(name = data[‘email’]).exists():
                user = User.objects.get(name=data[‘email’])

                if bcrypt.checkpw(data[‘password’].encode(‘utf-8’),user.password.encode(‘utf-8’)):
                    token  = jwt.encode({‘email’:data[‘email’]}, SECRET, algorithm = HASH).decode(‘utf-8’)
                    return JsonResponse({ ‘token’ : token }, status = 200)

                return JsonResponse({ ‘message’ : ‘INVALID_USER’ }, status = 401)
            return JsonResponse({ ‘message’ : ‘INVALID_USER’ }, status = 401)

        except KeyError:
            return JsonResponse({ ‘message’ : ‘INVALID_KEYS’ }, status = 400)



class AdminSignUpView(View):
    @csrf_exempt
    def post(self,request):
        try:
            data = json.loads(request.body)
            if not User.objects.filter(email = data[‘email’]).exists:
                password = bcrypt.hashpw(data[‘password’].encode(‘utf-8’),bcrypt.gensalt())
                crypted = password.decode(‘utf-8’)
                User.objects.create(
                    name  = data[‘name’],
                    password = bcrypt,
                    email = data[‘email’],
                    auth_id  = data[‘auth_id’]
                )
                return HttpResponse(status = 200)

        except KeyError:
                return JsonResponse({ ‘message’ : ‘INVALID_KEYS’ },status = 4000)

Models.py

class User(models.Model):
    name        = models.CharField(max_length = 50)
    email       = models.EmailField(max_length = 200,unique = True, blank = False)
    department  = models.ForeignKey('Department', on_delete = models.SET_NULL, null = True)
    is_active   = models.BooleanField(default=False)
    question    = models.ManyToManyField('eval.Question',through='UserQuestion')
    auth        = models.ForeignKey('Auth', on_delete = models.SET_NULL, null = True)

    class Meta:
        db_table = 'users'

token_verification вид, который написан на основе функций, работает нормально, но последние два возникла ошибка. Я думаю, что тот факт, что декоратор работает только поверх функции, вызывает эту ошибку, но я не уверен, почему @csrf_exempt необходим для некоторых представлений.

Я понятия не имею, почему я получаю проблема csrf в настоящее время.

1 Ответ

0 голосов
/ 13 июля 2020

Я считаю, что проблема в том, где вы добавляете @csrf_exempt. Django выполните проверку csrf до того, как он достигнет post

Вы должны проверить блок-схему версии Django, чтобы найти, какой метод вы должны переопределить в своем представлении, чтобы добавить csrf_exempt декоратор.

https://docs.djangoproject.com/en/2.2/ref/class-based-views/base/#django .views.generi c .base.View.setup

https://docs.djangoproject.com/en/1.8/ref/class-based-views/base/#django .views.generi c .base.View

Я считаю, что приведенный ниже код должен работать для django версий <2.2 </p>

    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        return super(AdminSignInView, self).dispatch(request, *args, **kwargs)
...