Передача данных, полученных из запроса json, в другую функцию в python flask socketio - PullRequest
0 голосов
/ 05 марта 2020

У меня есть приложение python flask, которое получает данные от json. Я также использовал socketio и threading для обработки данных в реальном времени. В моей программе мне нужно отправить данные, полученные из запросов json, в другую функцию python. Ниже приведен код, который я написал для этого: -

from flask_socketio import SocketIO, emit
from flask import Flask, render_template, request, url_for, copy_current_request_context
from random import random
from time import sleep
from pygeodesy.ellipsoidalVincenty import LatLon
from threading import Thread, Event

__author__ = 'shark'

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
app.config['DEBUG'] = True

# turn the flask app into a socketio app
socketio = SocketIO(app, async_mode=None, logger=True, engineio_logger=True)

# random number Generator Thread
thread = Thread()
thread_stop_event = Event()


@app.route('/platform-data', methods=['POST'])
def platformData():
    """
    Generate a random number every 1 second and emit to a socketio instance (broadcast)
    Ideally to be run in a separate thread?
    """
    # infinite loop of magical random numbers
    print("Receiving platform data")
    while not thread_stop_event.isSet():
        req_data = request.get_json()

        id = req_data['id']
        latitude = req_data['coordinates'][1]
        longitude = req_data['coordinates'][0]
        speed = req_data['speed']
        angle = req_data['angle']
        length = req_data['dimensions'][0]
        width = req_data['dimensions'][1]
        laneW = req_data['lane_width']
        spdLmt = req_data['speed_limit']

        return testProcess(speed)


        def testProcess(speed):
            if speed>30:
                print("slow down")


        socketio.emit('speed', {'speed': speed}, namespace='/test')
        socketio.sleep(.5)


@app.route('/')
def index():
    # only by sending this page first will the client be connected to the socketio instance
    return render_template('index.html')


@socketio.on('connect', namespace='/test')
def test_connect():
    # need visibility of the global thread object
    global thread
    print('Client connected')

    # Start the random number generator thread only if the thread has not been started before.
    if not thread.isAlive():
        print("Starting Thread")
        thread = socketio.start_background_task(platformData)


@socketio.on('disconnect', namespace='/test')
def test_disconnect():
    print('Client disconnected')


if __name__ == '__main__':
    socketio.run(app)

Однако, когда я запускаю приложение и данные POST из Postman, я получаю в консоли следующую ошибку: -

TypeError: Функция просмотра не вернула правильный ответ. Тип возвращаемого значения должен быть строкой, dict, кортежем, экземпляром Response или вызываемым WSGI, но это должен быть int. 127.0.0.1 - - [05 / Mar / 2020 17:06:25] "POST / platform-data HTTP / 1.1" 500 15625 0,008975

Я знаю, что причина в том, что я объявил return testProcess(speed).

Поэтому мне нужно знать, как правильно передать переменную скорости в функцию 'testProcess'.

1 Ответ

0 голосов
/ 05 марта 2020

platformData () должна возвращать строку, dict, кортеж, экземпляр Response или вызываемый WSGI, но вы возвращаете возвращение testProcess, который не определен try:

 def testProcess(speed):
        if speed>30:
            return "slow down"
        else:
            return "ok"

Или просто вызываете testProcess (скорость ) без возврата, а затем вернуть что-то еще

...