Вы можете передавать данные в ответ, но вы не можете динамически обновлять шаблон так, как вы описываете. Шаблон создается один раз на стороне сервера, а затем отправляется клиенту. Вам нужно будет использовать 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>
Оказалось, что я пытался создать сертификат из файла .pfx, а не из файла .cer.
Извлеченный урок ...
Возможно, вам потребуется пользователь X509Certificate2()
с параметром X509KeyStorageFlags.MachineKeySet
. Это исправило похожую проблему, которая у нас была Благодарим оригинальный сайт, который предложил это: http://vdachev.net/2012/03/07/c-sharp-error-creating-x509certificate2-from-a-pfx-or-p12-file-in- production /
Цитирование:
Причина
Причина проблемы, похоже, не имеет ничего общего с сообщения об ошибках. По какой-то причине конструктор пытается получить доступ к хранилищу закрытых ключей, хотя закрытый ключ хранится в открываемом файле. По умолчанию используется хранилище ключей пользователя, но ASP.NET (и, возможно, неинтерактивным службам Windows в целом) не разрешено открывать его. Скорее всего, хранилище ключей пользователя для выбранной учетной записи даже не существует.
Решение
Вы можете попробовать создать хранилище ключей пользователя, войдя в учетную запись и импортировав сертификат в его Личное хранилище (а затем удалите его снова).
Другое решение состоит в том, чтобы передать дополнительный параметр конструктору - флаг, указывающий, что закрытые ключи (должны быть) хранятся на локальном компьютере - X509KeyStorageFlags.MachineKeySet, например:
var certificate = new X509Certificate2(fileName, password, X509KeyStorageFlags.MachineKeySet);
Для PFX без пароля пароль можно указать как string.Empty
.
Сообщение об ошибке «указанный сетевой пароль неверен» также возвращается, когда сертификат, который вы пытаетесь импортировать в одно из хранилищ ОС, уже присутствует в этом хранилище.
Вам может понадобиться X509KeyStorageFlags.MachineKeySet.
Я использую сертификат от веб-задания.
Depending on your situation you probably need to install the certificate on the server first to get the trust level up before you export the .cer
file.
I had to do this for a similar project and here were my notes on how it was accomplished.
Replace the Foo.cer
with an export of the certificate installed on the server. (Install the cert from the pfx
file and then export it to a cer
file.)
Command for IIS6 to allow IIS_WPG group access to the cert key. Need to install winhttpcertcfg
(You can follow the link below to grab your own copy).
C:\Program Files\Windows Resource Kits\Tools>winhttpcertcfg -i (Path to pfx file, eg. e:\Certs\Foo.pfx) -c LOCAL_MACHINE\My -a IIS_WPG -p (Password for pfx file)
Spits out key info and grants privilege
Granting private key access for account:
(SERVERNAME)\IIS_WPG
Загрузите WinHttpCertCfg.msi
здесь , который устанавливает exe.
Дополнительную информацию о том, как использовать конфигурацию сертификата, можно найти здесь .
Тогда это просто возвращается к тому, как вы выполняете отправку сертификата.
//Cert Challenge URL
Uri requestURI = new Uri("https://someurl");
//Create the Request Object
HttpWebRequest pageRequest = (HttpWebRequest)WebRequest.Create(requestURI);
//After installing the cert on the server export a client cert to the working directory as Foo.cer
string certFile = MapPath("Foo.cer");
X509Certificate cert = X509Certificate.CreateFromCertFile(certFile);
//Set the Request Object parameters
pageRequest.ContentType = "application/x-www-form-urlencoded";
pageRequest.Method = "POST";
pageRequest.AllowWriteStreamBuffering = false;
pageRequest.AllowAutoRedirect = false;
pageRequest.ClientCertificates.Add(cert);
Так я передал сертификат, но не совсем уверен, что вам нужно делать со своим сертификатом, поэтому для вас это может быть не то же самое.