Я создаю веб-приложение, в котором пользователь выполняет поиск камеры (расположенной в удаленной сети с доменом dyndns), и отображается кнопка для включения сирены на камере. Когда пользователь нажимает кнопку, он не должен видеть обновления страницы или чего-либо происходящего (кроме кнопки, возможно, отключенной). Кнопка отправляет HTTP-запрос GET на сайт:
example.com:port/file.xml?relay2State=2
.
Однако я не уверен, что делать, когда пользователь обновляет или нажимает кнопку «Назад», и как браузер сохраняет запрос в своей истории. Я не хочу, чтобы пользователь мог нажать кнопку «Назад» и снова активировать этот запрос, или обновить страницу и активировать ее. Пользователь также не может сохранить запрос кнопки в виде закладки. По сути, это событие должно срабатывать только при нажатии кнопки, и кнопка должна быть отключена на 30 секунд на всем веб-сайте (все пользователи должны видеть, что кнопка отключена).
Это привело к вопросу: должен ли это быть запрос GET или POST, и как мне включить его с помощью кнопки?
Вот соответствующий код:
<!-- siren_search.html -->
{% if cameras %}
<button id="trigger-all-btn" type="button" class="btn btn-outline-danger">Trigger all sirens</button>
<table id="camera-table" class="table table-hover">
<thead>
<tr class="header">
<th scope="col" style="width:33%;">Asset Name</th>
<th scope="col" style="width:33%;">Job Site</th>
<th scope="col" style="width:33%;"></th>
</tr>
</thead>
<tbody>
{% for camera in cameras %}
<tr>
<td>{{ camera.asset_name }}</td>
<td>{{ camera.site.name }}</td>
<td><button id="{{ camera.asset_name }}-btn" type="button" class="btn siren-btn btn-outline-danger">Siren</button></td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
# views.py
def siren_search(request):
context = {}
if request.method == 'GET':
term = request.GET.get('query')
if term:
try:
jobsite = JobSite.objects.get(name__iexact = term)
cameras = jobsite.camerasystem_set.all()
context = {
'cameras': cameras,
'numberOfCameras': len(cameras)
}
except ObjectDoesNotExist:
pass
## Add functionality to handle button click and make the following request
pulseSiren = requests.get(f'{camera.name}.example.com:port/file.xml?relay2State=2', auth=('user', 'pass'))
return render(request, 'siren_search.html', context)