Django - установка токена CSRF в представлении API - PullRequest
0 голосов
/ 13 февраля 2020

Я создаю конечную точку API для получения данных и создания объектов модели из этих данных. В настоящее время у меня есть два представления для этого API - одно, которое отправляет данные, и другое, которое получает их, - но в действительности я буду использовать сценарий для отправки данных вместо представления. Я работаю над представлением для получения данных на моем локальном хосте, поэтому у меня есть тот, который отправляет его сейчас.

Текущая проблема, с которой я сталкиваюсь, связана с функцией, которая отправляет данные в конечную точку API. Мой запрос POST возвращается с ошибкой 403, и он говорит Forbidden (CSRF cookie not set.): /reports/swipe/data. Чтобы исправить это, я пытаюсь добавить готовку CSRF ie, но я очень плохо знаком с конечными точками API и столкнулся с некоторыми проблемами. Я пытался использовать @csrf_exempt и добавлять verify=False среди прочего, но пока не достиг успеха. Я также потратил несколько часов на поиск в Интернете ресурсов, которые могли бы помочь. Ниже приведены части моего кода. Буду признателен за любые предложения, которые могут дать люди.

views.py:

from datetime import datetime, timedelta, date, time
import time
import datetime
import json
import os
from django.shortcuts import render
from swipe.models import MyModel
import requests
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse


def receive_data(request):
        """
        we need the primary keys of the id rows in case they send us the same data twice
        or we don't even run it and need to run it on new data every time

        get primary key of each row in the original query to have that sent to us as well
        create --> update | create
        """

        if request.method == 'POST':
            bb_data = request.POST.get('data', '')

            for entry in bb_data:
                print(entry)
                new_swipe = MyModel.objects.create(
                    eventtransactions_id= int(entry['eventtransactions_id']),
                    customer_lastname= entry['customer_lastname'],
                    customer_firstname= entry['customer_firstname'],
                    birthdate= datetime.datetime.strptime(entry['birthdate'], '%m-%d-%Y'),
                    customer_gender= entry['customer_gender'],
                )
                print("ENTRY CREATED") #for testing
@csrf_exempt
def send_data(request):

    API_ENDPOINT = "http://127.0.0.1:8000/my_api"

    for x in range(3):
        bb_dict = {
            'eventtransactions_id': 0000111,
            'customer_gender': 'F',
            'customer_firstname': 'Jan',
            'customer_lastname': 'Smith',
            'birthdate': datetime.datetime(2000, 2, 10, 10, 23, 40, 123443),
            }

    json_bb_dict = json.dumps(bb_dict, default=str)
    requests.post(API_ENDPOINT, data=json_bb_dict, verify=False)
    return HttpResponse("Test")

urls.py

from django.conf.urls import include, url
from swipe.views import receive_data, send_data

urlpatterns = [
    url(r'^data', receive_data, name='data_import'),
    url(r'^test', send_data, name='data_export'),
]

1 Ответ

0 голосов
/ 13 февраля 2020

Вы добавили декоратор @csrf_exempt в функцию send_data, но в вашем тексте ошибки упоминается / reports / swipe / data url, что приводит к функции receive_data. Попробуйте добавить @csrf_exempt в функцию receive_data (при условии, что вам не нужны инъекции csrf)

...