Как написать сценарий взаимодействия с конечными точками 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>