uwsgi: отправьте http-ответ и продолжите выполнение - PullRequest
1 голос
/ 15 марта 2019

Из документации uwsgi:

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]

Можно ли ответить на http-запрос (закрыть http-соединение) и продолжить выполнение (без использования потоков / очередей / внешних служб и т. Д.)? как это:

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    end_response(b"Hello World")
    #HTTP connection is closed
    #continue execution..

1 Ответ

0 голосов
/ 17 марта 2019

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

myflaskapp.py

from flask import Flask, render_template_string
import time

app = Flask(__name__)

@app.route('/run', methods=['POST'])
def run():
    # this is where you put your "continue execution..." code
    # below code is used to test if it runs after HTTP connection close
    time.sleep(8)
    print('Do something')
    return ''

@app.route('/')
def index():
    return render_template_string('''
            Hello World!
            <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
            <script>
            $(function() {
                $.ajax({
                    type: "POST",
                    url: "{{ url_for('run') }}"
                });
            })
            </script>
            ''')

if __name__ == "__main__":
    app.run(host='0.0.0.0')

Вы можете запустить сервер через порт 9091 с помощью команды:

uwsgi --http 127.0.0.1:9091 --wsgi-file myflaskapp.py --callable app

Чтобы проверить, работает он или нет, вы можете перейти по адресу localhost:9091. Если все работает хорошо, вы должны увидеть, что страница загружается немедленно, в то время как терминал будет печатать только Do something после 8 seconds have passed, указывая, что функция run выполняется после закрытия HTTP-соединения.

...