Ответ THC4k работает, но я просто хочу добавить, что query_result
должен быть уже отсортирован, чтобы получить itertools.groupby
, работая так, как вы хотите.
query_result = DBSession.query (Article) .order_by (Article.created) .all ()
Вот объяснение в itertools.groupby docs :
Операция groupby () аналогична фильтру uniq в Unix. Он генерирует разрыв или новую группу каждый раз, когда изменяется значение ключевой функции (поэтому, как правило, необходимо сортировать данные с использованием одной и той же ключевой функции). Это поведение отличается от SQL GROUP BY, которое объединяет общие элементы независимо от их порядка ввода.
blockquote>
Вдохновленный ответом aviv , я немного разобрался, и это то, что я придумал. Я не уверен, что все это полезно в соответствии с комментариями в скрипте и, конечно же, будет работать только для браузеров с использованием собственного объекта XMLHttpRequest. Я думаю, что это сработает, если библиотеки javascript будут использоваться, поскольку они будут использовать собственный объект, если это возможно.
function addXMLRequestCallback (обратный вызов) {var oldSend, i; if (XMLHttpRequest.callbacks) {// мы уже переопределили send (), поэтому просто добавим обратный вызов XMLHttpRequest.callbacks.push (обратный вызов); } else {// создать очередь обратного вызова XMLHttpRequest.callbacks = [обратный вызов]; // сохраняем native send () oldSend = XMLHttpRequest.prototype.send; // переопределяем native send () XMLHttpRequest.prototype.send = function () {// обрабатываем очередь обратного вызова // экземпляр xhr передается в каждый обратный вызов, но кажется довольно бесполезным // вы не можете определить, каково его назначение или call abort () без ошибки // так что действительно полезно для ведения журнала, что запрос произошел // Я мог ошибаться, я надеюсь, что так ... // EDIT: я полагаю, вы могли бы переопределить обработчик onreadystatechange, хотя для (i = 0; i & lt; XMLHttpRequest.callbacks.length; i ++) {XMLHttpRequest.callbacks [i] (это); } // вызов native send () oldSend.apply (это, аргументы); }}} // например. addXMLRequestCallback (function (xhr) {console.log (xhr.responseText); // (пустая строка)}); addXMLRequestCallback (function (xhr) {console.dir (xhr); // посмотрим, есть ли что-нибудь полезное здесь});
Существует трюк.
Перед тем, как все запущенные скрипты, возьмите исходный объект XHMHttpReuqest и сохраните его в другом var. Затем переопределите исходный XMLHttpRequest и направьте все вызовы на него через свой собственный объект.
Код псевдонауки:
var savd = XMLHttpRequest; XMLHttpRequest.prototype = function () {this.init = function () {}; // ваш код и т. д. и т. д.};
В дополнение к ответу meouw я должен был ввести код в iframe, который перехватывает вызовы XHR и использовал вышеупомянутый ответ. Однако мне пришлось изменить
XMLHttpRequest.prototype.send = function () {
To:
XMLHttpRequest .prototype.send = function (arguments)
И мне пришлось изменить
oldSend.apply (это, аргументы);
To:
oldSend.call (это, аргументы);
Это было необходимо, чтобы заставить его работать в IE9 с режимом документа IE8 . Если эта модификация не была выполнена, некоторые обратные вызовы, созданные инфраструктурой компонента (Visual WebGUI), не работали. Дополнительная информация по этим ссылкам:
Без этих изменений ретрансляции AJAX не завершились.
Используя ответ «meouw», я предлагаю использовать следующее решение, если вы хотите увидеть результаты запроса
function addXMLRequestCallback (callback) {var oldSend, i; if (XMLHttpRequest.callbacks) {// мы уже переопределили send (), поэтому просто добавим обратный вызов XMLHttpRequest.callbacks.push (обратный вызов); } else {// создать очередь обратного вызова XMLHttpRequest.callbacks = [обратный вызов]; // сохраняем native send () oldSend = XMLHttpRequest.prototype.send; // переопределить native send () XMLHttpRequest.prototype.send = function () {// вызвать native send () oldSend.apply (это, аргументы); this.onreadystatechange = function (progress) {for (i = 0; i & lt; XMLHttpRequest.callbacks.length; i ++) {XMLHttpRequest.callbacks [i] (прогресс); }}; }}} addXMLRequestCallback (функция (прогресс) {if (typeof progress.srcElement.responseText! = 'undefined' & amp; & amp; progress.srcElement.responseText! = '') {console.log (progress.srcElement.responseText.length) ;}});
Если вам не нужно поддерживать & lt; = IE8, вы можете сделать это, что в общем случае перехватит любой AJAX по всему миру и не испортит никаких обратных вызовов и т. д., которые, возможно, были назначены любыми сторонними библиотеками AJAX. Принимаемый ответ не дает реального ответа, потому что его получают слишком рано.
(function () {var origOpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function () {console.log ('request started!'); this.addEventListener ('load', function () {console.log ('request completed!'); console.log (this.readyState); // всегда будет 4 (ajax успешно завершен) console.log (this.responseText); // независимо от ответа}); origOpen.apply (this, arguments);};}) ();
Еще несколько документов о том, что вы можете сделать здесь с API-интерфейсом addEventListener:
this.status
возвращает статус сервера в этом случае 200
, если запрос в порядке, 404, если элемент не был найден, 500 и т. Д. Но код, работает отлично.
– MrMins
17 February 2015 в 16:20
«load»
вызвано только успехом. Если вы не заботитесь о результате (просто завершение запроса), вы можете использовать событие "loadend & quot;
– Romuald Brunet
29 March 2017 в 16:34
Поскольку вы упоминаете jquery, я знаю, что jquery предлагает метод .ajaxSetup ()
, который устанавливает глобальные параметры ajax, которые включают триггеры событий, такие как success
, error [ ! d2] и
beforeSend
- это то, что походит на то, что вы ищете.
$. ajaxSetup ({beforeSend: function () {// делать что-то до запроса пожаров}});
, конечно, вам нужно будет проверить доступность jQuery на любой странице, на которую вы пытаетесь использовать это решение.
Я нашел хорошую библиотеку в Github, которая хорошо выполняет эту работу, вы должны включить ее перед любыми другими js-файлами
jquery ...
& lt; script & gt; $ (document) .ajaxSuccess (функция (событие, xhr, настройки) {alert (xhr.responseText);}); & Lt; / сценарий & GT;
Ajax-hook - это lib с открытым исходным кодом для привязки глобального объекта XMLHttpRequest и изменения запроса AJax по умолчанию и ответа. github: https://github.com/wendux/Ajax-hook , например:
hookAjax ({// hook callbacks onreadystatechange: function (xhr) { console.log ("onreadystatechange called:% O", xhr)}, onload: function (xhr) {console.log ("onload called:% O", xhr)}, // функция hook open: function (arg, xhr ) {console.log ("open called: method:% s, url:% s, async:% s", arg [0], arg [1], arg [2])}})