Может ли Django / Javascript обрабатывать условные «Ajax» ответы на запросы HTTP POST? - PullRequest
0 голосов
/ 02 октября 2009

Как мне разработать приложение Django / Javascript для обеспечения условных ответов Ajax на обычные запросы HTTP?

На сервере у меня есть пользовательский объект Form. Когда браузер размещает данные формы, сервер проверяет представленные данные на соответствие существующим данным и правилам (например, если форма добавляет какую-либо сущность в базу данных, существует ли эта сущность в базе данных?). Если данные проходят, сервер сохраняет, генерирует идентификационный номер и добавляет его к данным формы, а затем передает форму и данные обратно в браузер.

if request.method == 'POST':
    formClass = form_code.getCustomForm()
    thisForm = formClass(data=request.POST)
    if thisForm.isvalid():
        saveCheck = thisForm.saveData()
        t = loader.get_template("CustomerForm.html")
        c = Context({ 'expectedFormObj': thisForm })

(Обратите внимание, что моя пользовательская логическая проверка выполняется в saveData () и отделена от проверки html, выполняемой isvalid ().)

Пока что стандартный Джанго (надеюсь). Но если данные не проходят, я хочу отправить сообщение в браузер. Я полагаю, что saveData () может поместить сообщение в атрибут формы, и шаблон может проверить этот атрибут, встроить свои данные в переменную javascript и включить функцию javascript для отображения сообщения. Но передача всей этой формы html назад, просто для добавления одного сообщения, кажется неэлегичной (как и стандартный процесс отправки формы в Django, но не говоря уже о том, что это). В таком случае я хотел бы просто вернуть сообщение.

Теперь я полагаю, что мог бы связать функцию Javascript с событием onsubmit формы html, и это вызвало бы выдачу XMLHttpRequest, и заставить сервер отвечать на это на основе вывода вызова saveData (). Но тогда браузер имеет два запроса к серверу в ожидании (POST и XHR). Возможно, успешный saveData () переписал бы всю страницу и удалил бы любой потенциал для конфликта. Но я также должен заставить сервер упорядочить свой ответ XHR, чтобы следовать ответу на POST, и выяснить, как передать результат saveData в ответ на XHR. Я предполагаю, что это выполнимо, даже без программирования потока, я не знаю, но это кажется грязным.

Я предполагаю, что мог бы использовать javascript, чтобы сделать ответ браузера условным для чего-либо в ответе на запрос POST (либо переписать всю страницу, либо просто отобразить сообщение). Но я подозреваю, что javascript страницы передает контроль над браузером с помощью запроса POST и что любой ответ на POST просто переписывает страницу.

Так можно ли спроектировать процесс для передачи всей формы обратно, только если работает saveData () на стороне сервера, и сообщение, которое отображается без перезаписи всей формы, если saveData () не работает? Если да, то как?

Ответы [ 3 ]

3 голосов
/ 02 октября 2009

Несмотря на то, что вы можете организовать для своих представлений проверку данных запроса, чтобы решить, должен ли ответ быть AJAXish или простым HTML, я не очень рекомендую его. Поместите обработчики запросов AJAX в отдельную структуру URL, например, все ваши обычные представления html имеют URL-адреса, такие как / foo / bar, и соответствующий вызов API для той же информации будет /ajax/foo/bar.

.

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

Мой обычный рабочий процесс заключается в том, чтобы изначально предположить, что у клиента нет javascript (что все еще является допустимым предположением; во многих мобильных браузерах нет JS), и реализовать приложение как статические обработчики GET и POST. Оттуда я начинаю искать места, где мое приложение может извлечь выгоду из небольшого сценария на стороне клиента. Например, я обычно переделываю формы для отправки через вызовы типа AJAX без перезагрузки страницы. Они не будут отправлять свои запросы в тот же URL-адрес / представление django, что и обычная версия HTML-формы, поскольку ответом должно быть простое сообщение об успешном выполнении в виде простого текста или HTML-фрагмента.

Точно так же, получение данных с сервера также изменено, чтобы отвечать кратким документом JSoN, который будет обработан на странице на клиенте. Это также будет отдельный вид URL / django в качестве соответствующего простого HTML-кода для этого ресурса.

3 голосов
/ 02 октября 2009

При работе с AJAX я использую это:

from django.utils import simplejson
...
status = simplejson.dumps({'status': "success"})
return HttpResponse(status, mimetype="application/json")

Затем AJAX (jQuery) может делать то, что он хочет, основываясь на возвращаемом значении «status».

Я не уверен, что именно вы хотите в отношении форм. Если вам нужна более простая и удобная форма, я советую проверить униформа . Pinax имеет хорошую реализацию этого в своем приложении для голосования.

0 голосов
/ 02 октября 2009

К вашему сведению, это не ответ ... но это может помочь вам подумать об этом по-другому

Вот проблема, с которой я сталкиваюсь ... Google App Engine + jQuery Ajax = 405 Метод не разрешен .

Так что, в принципе, я заставляю эту штуку работать с использованием изложенного кода, тогда я не могу сделать запрос AJAX :(.

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