Вы можете передавать данные в ответ, но вы не можете динамически обновлять шаблон так, как вы описываете. Шаблон создается один раз на стороне сервера, а затем отправляется клиенту. Вам нужно будет использовать JavaScript для чтения потокового ответа и вывода данных на стороне клиента.
Используйте XMLHttpRequest
, чтобы сделать запрос к конечной точке, которая будет передавать данные. Затем периодически читайте поток, пока он не будет выполнен.
В этом примере используется очень простой формат сообщения: одна строка данных, за которой следует новая строка. Конечно, вы можете так же усложниться в разборе, сколько хотите, пока есть способ идентифицировать каждое сообщение. Например, вы можете вернуть объект JSON и декодировать его на клиенте.
from time import sleep
from flask import Flask, render_template
from math import sqrt
app = Flask(__name__)
@app.route('/')
def index():
# render the template (below) that will use JavaScript to read the stream
return render_template('index.html')
@app.route('/stream_sqrt')
def stream():
def generate():
for i in range(500):
yield '{}\n'.format(sqrt(i))
sleep(1)
return app.response_class(generate(), mimetype='text/plain')
app.run()
<p>This is the latest output: <span id="latest"></span></p>
<p>This is all the output:</p>
<ul id="output"></ul>
<script>
var latest = document.getElementById('latest');
var output = document.getElementById('output');
var xhr = new XMLHttpRequest();
xhr.open('GET', '{{ url_for('stream') }}');
xhr.send();
var position = 0;
function handleNewData() {
// the response text include the entire response so far
// split the messages, then take the messages that haven't been handled yet
// position tracks how many messages have been handled
// messages end with a newline, so split will always show one extra empty message at the end
var messages = xhr.responseText.split('\n');
messages.slice(position, -1).forEach(function(value) {
latest.textContent = value; // update the latest value in place
// build and append a new item to a list to log all output
var item = document.createElement('li');
item.textContent = value;
output.appendChild(item);
});
position = messages.length - 1;
}
var timer;
timer = setInterval(function() {
// check the response for new data
handleNewData();
// stop checking once the response has ended
if (xhr.readyState == XMLHttpRequest.DONE) {
clearInterval(timer);
latest.textContent = 'Done';
}
}, 1000);
</script>
Я считаю, что корпоративная библиотека слишком спроектирована для большинства вещей. Нет, мы его не используем, но большинство наших проектов - это краткосрочные, массовые веб-сайты рекламного характера.
это все сказано от имени, которому я верю .. "Enterprise Library" Enterprise, являющийся значительно большим (Да, я знаю, большое определение ... но эй, я пьяный в настоящее время!)
Поработав над несколькими крупномасштабными веб-проектами, я могу порекомендовать блок кэширования из библиотеки ent, поскольку он позволяет использовать nCache или подобное с простым изменением конфигурации. Это позволяет команде разработчиков использовать TDD без необходимости повсеместной установки nCache (или подобного).
Log4Net намного превосходит блок логирования ent lib IMHO.
Блоки безопасности / криптографии Я использовал несколько раз и обычно обнаружил, что они делают то, что говорят на жестяной банке, не будучи слишком обременительными или сложными.
Остальная часть фреймворка опередила другие более простые и (IMHO) лучшие решения Доступ к данным - nHibernate, ActiveRecord, Tarantino
Unity - windsor, spring и т. Д.
Валидация - I используйте стопку замка
+1 за чрезмерную инженерию. Мы используем log4net вместо блоков регистрации или обработки исключений. Мы используем собственное пространство имен .NET System.Security вместо блоков шифрования entlib. Некоторые инструменты трассировки хороши, но в производстве нет ничего, что могло бы их использовать.
Нет, мы не используем его. Фактически, я большой противник блоков Enterprise Library, потому что я видел слишком много проблем обратной совместимости с новыми выпусками блоков.
Корпоративная библиотека - это перебор. Это слишком сложно и негибко. Поэтому мы не используем.
В наших проектах (включая те, которые нацелены на сценарии распределенных вычислений в Windows Azure) мы используем Lokad Shared Libraries в качестве облегченной замены. Он подключается к log4net для ведения журнала, Autofac IoC для настройки, предоставляет настраиваемые бизнес-правила, проверку и обработку исключений (с надежностью), блоки приложений, упаковывая все необходимые сборки в несколько файлов dll.
Мне нравится старый блок данных приложения, который был отделен от корпоративной библиотеки. Это очень просто и сэкономит много времени. Мы попытались перейти на блок Enterprise, но это не стоило усилий.
Мы используем log4Net для ведения журнала, и это работает нормально.
Мы используем его (в частности, Unity, Logging and Validation), и я не могу сказать, что я его большой поклонник.
Блок журналирования определенно перестроен, и, по иронии судьбы, ему все еще не хватает гибкости. Я был поражен тем, сколько кода мне пришлось вырвать и заменить, если я хотел писать более структурированные сообщения журнала в БД, а не только одну таблицу с общими сообщениями. Документация отрывочна, и очень сложно проследить, что на самом деле происходит в вашем регистраторе.
Unity действительно работает нормально. Лично я бы предпочел полностью избегать контейнеров DI, но если вам нужно использовать один, Unity кажется прекрасным.
Я действительно не участвовал в коде, который использует блок Validation, поэтому я не могу сказать вам, как это сработает.
Но в целом я бы сказал, что да, он слишком спроектирован,
Я использую его некоторое время, но теперь я обратился к более гибким и простым решениям, таким как log4net для ведения журнала, EF или Linq2sql для доступа к данным и так далее.
Мне нравится использовать его, ОСОБЕННО для небольших проектов, потому что это «мне все равно, этот материал просто работает и предоставляет все, что мне нужно, без проблем».
Изощренно? Как так?