Python Flask многопоточная программа не может отображать потоковые данные в двух маршрутах приложения - PullRequest
0 голосов
/ 05 февраля 2020

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

Перед этим отображение видео и данных в реальном времени и отправка на сервер для хранения могут быть выполнены отдельно. Однако, когда я попытался объединить их вместе, я обнаружил, что ошибка всегда говорит следующее:

werkzeug :: INFO :: 192.168.0.103 - - [05 / Feb / 2020 22:03: 10] «GET / video_feed HTTP / 1.1» 500 - трассировка (последний последний вызов): файл «/usr/lib/python3/dist-packages/flask/app.py», строка 2309, в вызов вернуть файл self.wsgi_app (environment, start_response) "/usr/lib/python3/dist-packages/flask/app.py", строка 2295, в файле wsgi_app response = self.handle_exception (e) "/ usr / lib / python3 / dist-packages / flask / app.py ", строка 1741, в ререйзе handle_exception (exc_type, exc_value, tb) Файл" /usr/lib/python3/dist-packages/flask/_compat.py ", строка 35, в Поднять значение файла повышения "" /usr/lib/python3/dist-packages/flask/app.py ", строка 2292, в файле wsgi_app response = self.full_dispatch_request ()" "/ usr / lib / python3 / dist-packages / flask / app.py ", строка 1815, в full_dispatch_request rv = self.handle_user_exception (e) Файл" /usr/lib/python3/dist-packages/flask/app.py ", строка 1718, в handle_ user_exception reraise (exc_type, exc_value, tb) Файл "/usr/lib/python3/dist-packages/flask/_compat.py", строка 35, в файле повышения значения файла "" / usr / lib / python3 / dist-packages / flask /app.py ", строка 1813, в файле full_dispatch_request rv = self.dispatch_request ()" /usr/lib/python3/dist-packages/flask/app.py ", строка 1799, в dispatch_request возвращает self.view_functionsrule.endpoint TypeError : video_feed () отсутствует 1 обязательный позиционный аргумент: 'input_frame' werkzeug :: INFO :: 192.168.0.103 - - [05 / Feb / 2020 22:03:10] "GET / data_feed HTTP / 1.1" 500 - обратная связь (самая последняя вызовите последний): файл "/usr/lib/python3/dist-packages/flask/app.py", строка 2309, в вызов , возврат файла self.wsgi_app (environment, start_response) "/ usr / lib /python3/dist-packages/flask/app.py ", строка 2295, в ответе wsgi_app = self.handle_exception (e) Файл" /usr/lib/python3/dist-packages/flask/app.py ", строка 1741, в обработчике handle_exception (exc_type, exc_value, tb) Файл "/usr/lib/python3/dist-packages/flask/_compat.py", строка 3 5, в файле повышения значения файла "/usr/lib/python3/dist-packages/flask/app.py", строка 2292, в файле ответа wsgi_app = self.full_dispatch_request () "/ usr / lib / python3 / dist-packages /flask/app.py ", строка 1815, в full_dispatch_request rv = self.handle_user_exception (e) Файл" /usr/lib/python3/dist-packages/flask/app.py ", строка 1718, в реинрейсе handle_user_exception (exc_type, exc_value, tb) Файл "/usr/lib/python3/dist-packages/flask/_compat.py", строка 35, в файле повышения значения файла "/usr/lib/python3/dist-packages/flask/app.py" строка 1813, в файле full_dispatch_request rv = self.dispatch_request () "/usr/lib/python3/dist-packages/flask/app.py", строка 1799, в dispatch_request возвращает self.view_functionsrule.endpoint ошибка типа: отсутствует data_feed () 1 обязательный позиционный аргумент: 'input_data'

Я много раз пытался определить причину root, обнаружив, что она должна быть связана с внутренней функцией, но я все еще не могу ее исправить. Надеюсь, что любой может помочь через следующий код. Спасибо!

Редактировать:

Я последовал ответ Джоакино Бартолотта, чтобы добавить параметр для передачи в. Однако появляется новая ошибка:

Traceback (последний вызов был последним) Файл "/usr/lib/python3/dist-packages/flask/app.py", строка 2309, в call return self.wsgi_app (environment, start_response) Файл "/usr/lib/python3/dist-packages/flask/app.py", строка 2295, в wsgi_app response = self.handle_exception (e) Файл "/usr/lib/python3/dist-packages/flask/app.py", строка 1741, в ререйзе handle_exception (exc_type, exc_value, tb), файл "/ usr / lib / python3 / dist-packages / flask / _compat.py ", строка 35, в файле повышения значения файла" /usr/lib/python3/dist-packages/flask/app.py ", строка 2292, в ответе wsgi_app = self.full_dispatch_request () Файл "/usr/lib/python3/dist-packages/flask/app.py", строка 1815, в файле full_dispatch_request rv = self.handle_user_exception (e) "/ usr / lib / python3 / dist-packages / flask / app. py ", строка 1718, в файле переименования handle_user_exception (exc_type, exc_value, tb), файл" /usr/lib/python3/dist-packages/flask/_compat.py ", строка 35, в файле поднять значение reraise" / usr / lib / python3 / dist-packages / flask / app.py ", строка 1813, в файле full_dispatch_request rv = self.dispatch_request ()" /usr/lib/python3/dist-packages/flask/app.py ", строка 1799, в dispatch_request вернуть файл self.view_functionsrule.endpoint "/home/pi/pilotdrive_poc/streaming/webstreaming_viewer.py", строка 30, в индексе возвращают файл render_template ("index. html") "/usr/lib/python3/dist-packages/flask/templating.py", строка 135, в контексте render_template, файл ctx.app) "/ usr / lib /python3/dist-packages/flask/templating.py ", строка 117, в _render rv = template.render (context) Файл" /usr/lib/python3/dist-packages/jinja2/asyncsupport.py ", строка 76, в рендере возвращают original_render (self, * args, ** kwargs) Файл "/usr/lib/python3/dist-packages/jinja2/environment.py", строка 1008, в рендере возвращают self.environment.handle_exception (exc_info, True) Файл "/usr/lib/python3/dist-packages/jinja2/environment.py", строка 780, в файле переименования handle_exception (exc_type, exc_value, tb), файл "/ usr / lib / python3 / dist-packages / jinja2 / _compat. py ", строка 37, при ререйзе повысить значение. Файл_with_traceback (tb)" /home/pi/pilotdrive_poc/streaming/templates/index.html ", строка 9, в файле шаблона верхнего уровня File" / usr / lib /python3/dist-packages/flask/helpers.py ", строка 356, в url_for, возвращать appctx.app.handle_url_build_error (error, endpoint, va lues) Файл «/usr/lib/python3/dist-packages/flask/app.py», строка 2061, в перерисовке handle_url_build_error (файл exc_type, exc_value, tb) »/ usr / lib / python3 / dist-packages / flask / _compat.py ", строка 35, в файле повышения значения рэйзера" /usr/lib/python3/dist-packages/flask/helpers.py ", строка 345, в файле url_for force_external = external)" / usr / lib / python3 / dist-packages / werkzeug / routing.py ", строка 1776, при сборке повысить BuildError (конечная точка, значения, метод, self) werkzeug.routing.BuildError: Не удалось создать URL-адрес для конечной точки 'video_feed'. Вы забыли указать значения ['input_frame']?

Мне интересно, что не так с моим индексом. html? Я также прикреплен здесь и сейчас. Еще раз спасибо!

webstreaming_viewer.py

# USAGE
# python webstreaming.py --ip 0.0.0.0 --port 8000

# import the necessary packages
from vidgear.gears import VideoGear, NetGear
from flask import Response
from flask import Flask, current_app
from flask import render_template
from flask import jsonify
from random import random
import threading
import argparse
import datetime
import imutils
import time
import cv2

# initialize the output frame and a lock used to ensure thread-safe
# exchanges of the output frames (useful for multiple browsers/tabs
# are viewing tthe stream)

server_address='206.189.144.234'
options_cam={"CAP_PROP_FRAME_WIDTH":640,"CAP_PROP_FRAME_HEIGHT":480,"CAP_PROP_FPS":60}
options_client={'bidirectional_mode':True,'compression_format':'.jpg','compression_param':[cv2.IMWRITE_JPEG_QUALITY,80],'flag':0,'copy':False,'track':False}
stream=VideoGear(enablePiCamera=False,logging=False,**options_cam).start()
client=NetGear(address=server_address, port='20001', protocol='tcp', pattern=1, receive_mode=False, logging=True, **options_client)

app=Flask(__name__)

@app.route("/")
def index():
    # return the rendered template
    return render_template("index.html")

@app.route("/data_feed/<input_data>")
def data_feed(input_data):
    def dataStream(input_data):
        while True:
            print("get_data={}".format(input_data))
            yield "data: {}\n\n".format(input_data)
            time.sleep(1)
    return Response(dataStream(input_data), mimetype="text/event-stream")

@app.route("/video_feed/<input_frame>")
def video_feed(input_frame):
    # return the response generated along with the specific media
    # type (mime type)
    def display_frame(input_frame):
        while True:
            print("get_frame={}".format(input_frame))
            # encode the frame in JPEG format
            (flag, encodedImage) = cv2.imencode(".jpg", input_frame)

            # yield the output frame in the byte format
            yield(b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + 
                bytearray(encodedImage) + b'\r\n')
    return Response(display_frame(input_frame),
        mimetype = "multipart/x-mixed-replace; boundary=frame")

def get_realtime_stream():
    while True:
        frame = stream.read()
        data_stream=round(random()*10,3)
        client.send(frame,message=data_stream)
        video_feed(frame)
        data_feed(data_stream)
    stream.stop()
    client.close()

# check to see if this is the main thread of execution
if __name__ == '__main__':
    t = threading.Thread(target=get_realtime_stream)
    t.start()

    app.run(host='0.0.0.0',port=8000,debug=True,threaded=True,use_reloader=False)

index. html

<html>
    <head>
        <title>Pi Video Surveillance</title>
    </head>
    <body>
        <div style="float: left; width: 100%">
            <div style="float: left; width: 700">
                <h1>Pi Video Surveillance</h1>
                    <img src="{{ url_for('video_feed') }}">
            </div>
            <div style="float: left">
                <h1>real-time data</h1>
                <iframe src="{{ url_for('data_feed') }}">
            </div>
        </div>
        <div>
            <div>
                <h1>Car control panel</h1>
            </div>
        </div>
    </body>
</html>

1 Ответ

0 голосов
/ 05 февраля 2020

Я думаю, вам не хватает объявить свои аргументы в URL.

Я имею в виду:

у вас есть

@app.route("/data_feed") def data_feed(input_data)

и

@app.route("/video_feed") def data_feed(input_frame)

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

@app.route("/data_feed/<input_data>") def data_feed(input_data)

и

@app.route("/video_feed/<input_frame>") def data_feed(input_frame)

Конечно, вы можете установить значение по умолчанию, если аргумент не был указан.

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