Как я могу прикрепить часть данных GET / POST к каждому отдельному запросу, поступающему на сервер для зарегистрированных пользователей? - PullRequest
0 голосов
/ 18 сентября 2009

Я хочу, чтобы в моей веб-странице был элемент ввода, содержащий некоторые глобальные настройки для вошедшего в систему пользователя. Как я могу прикрепить этот фрагмент данных к каждому запросу GET / POST и AJAX, который приходит из моего веб-приложения? Я хотел добавить это на существующий сайт, на котором уже много кода.

Файлы cookie - это не то, что я ищу, потому что у вас не может быть двух разных файлов cookie для одного и того же сайта в разных вкладках / окнах одного и того же приложения (ввод HTML может иметь разные значения для одного и того же зарегистрированного пользователя). в двух разных вкладках / окнах.)

ОБНОВЛЕНИЕ: Чтобы уточнить, мне нужна функция - соединить два разных режима в одном браузере и позволить пользователю переключаться между двумя режимами через меню параметров. Текущий режим будет влиять на все, что пользователь делает, вплоть до коротких / маленьких Ajax-запросов (каждый запрос в системе должен знать, в каком режиме находится окно браузера.) Таким образом, две разные вкладки в одном браузере будут вести себя очень по-разному, другие, если они находятся в разных режимах.

Ответы [ 11 ]

11 голосов
/ 28 сентября 2009

Если я правильно понимаю, ваше приложение имеет два режима. Давай позвоним их красный и синий. Пользователь открывает окно 1 и выбирает красный. пользователь затем открывает окно 2 и выбирает синий. Если вы просто использовали сессий, то если пользователь возвращается к окну 1 и нажимает ничего, результат будет синим, потому что предыдущий клик было синим, хотя окно 1 красное.

Я предлагаю использовать mod_rewrite (или эквивалент на не-Apache серверы), чтобы изменить URL-адрес для указания режима.

Входящий запрос на

example.com/red/yourscript  ==>  example.com/yourscript?mode=red
example.com/blue/yourscript  ==> example.com/yourscript?mode=blue

Если все ссылки и формы на вашей странице являются относительными, а не абсолютно, URL-адреса должны содержать информацию о режиме.

То есть, если URL страницы равен

example.com/red/yourscript

затем ссылки на странице выглядят следующим образом

<form action="anotherscript">

будет иметь URL

example.com/red/anotherscript 

Другим способом было бы использование поддоменов

red.example.com/yourscript  ==>  example.com/yourscript
blue.example.com/yourscript  ==> example.com/yourscript

Вам не понадобится mod_rewrite, если вы настроите свой сервер для обслуживания обоих поддоменов из одного и того же реального местоположения.

Использование поддоменов позволит вам извлечь режим из поле http_referer каждого входящего запроса, и вы не нужно будет добавлять строку запроса.

Наконец, добавьте абсолютные ссылки для явного изменения режима.

<a href="http://example.com/red/changemode">Click here to go to RED mode</a>
<a href="http://example.com/blue/changemode">Click here to go to BLUE mode</a>
5 голосов
/ 18 сентября 2009

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

<input type="hidden" name="fieldname" value="fieldvalue" />
3 голосов
/ 26 сентября 2009

А как насчет создания разных поддоменов для ваших 2 разных моделей?

2 голосов
/ 18 сентября 2009

Почему вы не используете сессий для сохранения пользовательских данных? С сеансом вы можете сохранить данные в сообщениях, сохранить данные сеанса в зависимости от страницы.

1 голос
/ 29 сентября 2009

То, что вы пытаетесь звучать немного похоже на это stackoverflow вопрос Я ответил.

Вы можете сделать такие изменения в промежуточном программном обеспечении (см. Ссылку выше), но это не имеет смысла. Скорее всего, вы хотите изменить данные сеанса.

Ниже приведены различные варианты, которые у вас есть.

1) GET

Изменение данных GET будет эффективно перенаправлять пользователя при изменении адреса в URL, и это отправляет пользователя на новую страницу. Таким образом, вы можете редактировать это, но оно будет перенаправлять пользователя каждый раз, когда они загружают страницу! Плохая идея. В противном случае вы могли бы как-то управлять своими URL-адресами, чтобы каждая ссылка добавляла что-то, но это по-прежнему не имеет смысла, поскольку пользователь, который не вошел в систему, может добавить это к URL-адресу, если он знает, что это такое. Опять плохая идея.

2) POST

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

3) СЕССИЯ

Вы можете узнать о сессиях Django здесь . Эта техника используется во многих местах, в частности в django.contrib.auth. Сеанс используется для проверки пользователя и изменения запроса object . Это может быть то, что вы хотите сделать, здесь вы можете либо изменить сеанс, либо изменить объект запроса - однако, я бы опасался вносить слишком много изменений в запрос, поскольку это может вызвать конфликты с другими приложениями или будущие изменения / дополнения django. .

4) jQuery (поскольку вы пометили это как jQuery) тоже

Вы могли бы сделать что-нибудь хакерское и неприятное, как это в javascript, если вы настаиваете.

$("a").each(function()
   { 
      this.href += "?newdata=1";
   });

Однако я бы не рекомендовал это, и это не учитывает, что уже есть GET-данные (если они есть). Я просто добавляю его, чтобы показать вам другой вариант, поскольку я не совсем уверен, что вы пытаетесь сделать.

1 голос
/ 18 сентября 2009

Вы можете использовать шаблон тега и шаблон наследования .

0 голосов
/ 28 сентября 2009

У меня есть приложение, которое прямо сейчас хранит весь сеанс, я ввел специализированные оболочки ajax для всех моих вызовов на сервере.

$.myget = function (url, data, k) {
 $.get(url, $.extend(read_session_data(), data), k);
}

read_session_data оставлено в качестве упражнения для читателя.

Помимо решения этой проблемы, мне легче обрабатывать ошибки контролируемым (и кратким) способом.

0 голосов
/ 28 сентября 2009

Вы можете создать пользовательский контекстный процессор и использовать его с RequestContext , чтобы добавить некоторые пользовательские данные для вашего универсального шаблона (а затем использовать наследование , чтобы получить это ко всем другим шаблонам, как говорит Хэнк Гей).

0 голосов
/ 28 сентября 2009

Это может быть элегантно выполнено с помощью jquery.Metadata . Вам просто нужно нажать на каждой странице форму с одним элементом, содержащим все ваши данные, которые вы добавите к каждой форме, как только она будет отправлена:

На каждой странице вы должны иметь:

<form name="_settings" type="post">
    <p>
        <input name="_settings" type="hidden" value="{preference: 'chocolate', 
             displayListSize: 30, something: 'else'}" />
    </p>
</form>

Теперь вы можете делать что-то похожим образом:

// Bind to the submit event of each form
$('form').submit(function () {
    // Append all input fields from `_settings`
    $(this).append('form[name="settings"]:input');

    return true;
});

Или добавьте настройки к определенной форме или ко всем формам, если ничего не указано:

function appendSettings(form) {
     if (form)
         $(form).append('form[name="_settings"]:input');
     else
         $('form').append('form[name="_settings"]:input');
}

... после чего вы можете отправить форму как часть запроса AJAX (в противном случае, возможно, не запускалось событие формы submit)

EDIT:

Что касается запроса GET / POST по ссылкам:

$('a').click(function(event) {
    href = $(this).attr('href');

    event.stopPropagation();
    event.preventDefault();

    if (!href.match('?'))
        // Change the form's action to the link's reference
        $('form[name="_settings"']).attr('action', href).submit();
    else {
        /* Sanitize the form's data into GET paramaters and
           change the window's location*/
    }   
});

Если вы не хотите использовать jquery.Metadata, вы можете создать столько скрытых полей с парами имя / значение в форме _settings, и это все равно будет работать. Я использовал это как хороший пример переносимых данных, поскольку JS и Django могут говорить на JSON.

Кроме того, я предполагаю слишком много, написав пример jQuery, но я несколько надеюсь, что вы уже используете какую-то платформу и что это может быть аккуратно переведено в платформу по вашему выбору.

0 голосов
/ 27 сентября 2009

Это может быть совершенно бесполезно, в зависимости от ваших «режимов»:

Что делать, если сервер каждый раз возвращает одну и ту же страницу, а режимы применяются javascript. JS может изменять стили и DOM или выдавать разные AJAX-запросы в зависимости от режима.

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