Как создать кнопку, которая отправляет HTTP-запрос GET на защищенный URL-адрес при нажатии? - PullRequest
0 голосов
/ 16 июня 2019

Я создаю веб-приложение, в котором пользователь выполняет поиск камеры (расположенной в удаленной сети с доменом 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)

1 Ответ

0 голосов
/ 16 июня 2019

То, что вы спрашиваете, не является простым решением, и у вас на самом деле есть два вопроса:

1) Как вы запускаете URL без изменения браузера?

Ответ: делайте это асинхронно.Для этого требуется Javascript, и вы можете найти такую ​​библиотеку, как JQuery, чтобы упростить создание этого решения.Например, рассмотрим JQuery $. Get Использование GET или POST не имеет значения для решения

2) Как вы общаетесь с любыми другими браузерами и отключаете их кнопки, если нажата одна кнопка?

Ответ: Это не просто.Связь между браузером и сервером поддерживается браузером, а не сервером.Одним из вариантов является использование асинхронного Javascript для опроса сервера, чтобы сервер и предоставить обновленную информацию о состоянии кнопок.Но тогда вам нужно разобраться со случаем нажатия кнопки в браузере после того, как она была нажата в другом браузере, но до того, как второй щелкнувший браузер получил обновленную информацию о состоянии кнопки в своем последнем опросе.

Надеюсь, этот ответпредоставляет некоторую полезную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...