Как написать сценарий взаимодействия с конечными точками POST в Django?

Какой предпочтительный способ предварительного заполнения объектов базы данных (Model) в приложении Django? Я склоняюсь к попытке скриптового POSTing данных в соответствующие конечные точки, но меня сдерживает CSRF защита.

Это не часть структуры тестирования, это для настройки демонстрационных и учебных экземпляров в среде бета-тестирования или производства.

В качестве условного примера, я хотел бы заполнить базу данных "Player" тремя записями: Алиса (отправитель), Боб (получатель) и Чарли (подслушивающий), и я хотел бы написать сценарий/автоматизировать процесс создания этих записей после развертывания и запуска приложения.

У меня уже есть механизм создания новых игроков на основе формы. При посещении /create через браузер, есть форма, которая позволяет человеку ввести имя, например, "Боб" и роль, например, "получатель", и отправить форму для создания нового экземпляра Player.

Поэтому мне кажется логичным попытаться использовать для этого существующий веб-интерфейс API: например, сделать вызовы типа requests.post('0.0.0.0:8000/create', data={'name':'Bob', 'role':'reciever'}) в скрипте, который предварительно заполняет базу данных. Однако это приводит к 403 ошибке из-за CSRF токенов, которые я не хочу отключать. Эта проблема также возникает, если я просто пытаюсь использовать requests.Session, чтобы попытаться сохранить куки между вызовами.

Одним из жизнеспособных решений было бы эффективное управление cookies, чтобы позволить размещать данные. Однако я открыт для различных способов создания экземпляров модели для начальной настройки системы.

Соответствующие фрагменты кода:

def create(request):
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = PlayerForm(request.POST)
        # check whether it's valid:
        if form.is_valid():
            data = form.cleaned_data
            s = models.Player()
            s.name = data['name']
            s.role = data['role']
            s.save()
            msg = "TODO: make a senisble return message"
            return HttpResponse(msg)
        else:
            msg = "TODO: make invalid sources message"
            return HttpResponse(msg)

    # if a GET (or any other method) we'll create a blank form
    else:
        form = PlayerForm()
        return render(request, 'player/create.html', {'target':'/create', 'form': form})



class Player(Model):
    name = models.CharField(max_length=168)
    role = models.CharField(max_length=64)


class PlayerForm(forms.Form):
    name = forms.CharField(label='Name:', max_length=168)
    
    role = forms.CharField(label='Role:', max_length=64)


Обратите внимание, что 'target':'/create' является целью для действия отправки формы, т.е. когда пользователь нажимает кнопку "Submit", данные из формы отправляются в эту конечную точку (которая затем обращается к ветви if request.method == 'POST' для создания и сохранения нового экземпляра.

).

Форма просто

<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="">
<style>
</style>
<script src=""></script>
<body>

<form action="{{target}}" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>


</body>
</html>
Вернуться на верх