сбой api flask после второго сообщения

#python #json #flask

#python #json #flask

Вопрос:

Извините за мой словарный запас и плохие знания, это мой первый проект на python. Итак, я создал api в flask, который должен отвечать на 2 сюжетных рисунка в каждом сообщении. api работает отлично, но только для первого сообщения, каждый раз, когда второе сообщение отправляет сообщение flask ниже ошибки:

 [2021-02-17 01:02:33,438] ERROR in app: Exception on /postjson [POST]
Traceback (most recent call last):
  File "C:Python39libsite-packagesflaskapp.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "C:Python39libsite-packagesflaskapp.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:Python39libsite-packagesflask_corsextension.py", line 165, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "C:Python39libsite-packagesflaskapp.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:Python39libsite-packagesflask_compat.py", line 39, in reraise
    raise value
  File "C:Python39libsite-packagesflaskapp.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:Python39libsite-packagesflaskapp.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:UserswtasarekDocumentsstudyissURA_pythonrestApi.py", line 62, in postJsonHandler
    plt.subplot(2, 1, 1)
  File "C:Python39libsite-packagesmatplotlibpyplot.py", line 1142, in subplot
    ax = fig.add_subplot(*args, **kwargs)
  File "C:Python39libsite-packagesmatplotlibfigure.py", line 1393, in add_subplot
    self.sca(ax)
  File "C:Python39libsite-packagesmatplotlibfigure.py", line 2070, in sca
    self._axobservers.process("_axes_change_event", self)
  File "C:Python39libsite-packagesmatplotlibcbook__init__.py", line 229, in process
    self.exception_handler(exc)
  File "C:Python39libsite-packagesmatplotlibcbook__init__.py", line 81, in _exception_printer
    raise exc
  File "C:Python39libsite-packagesmatplotlibcbook__init__.py", line 224, in process
    func(*args, **kwargs)
  File "C:Python39libsite-packagesmatplotlibfigure.py", line 2167, in <lambda>
    self._axobservers.connect("_axes_change_event", lambda arg: func(arg))
  File "C:Python39libsite-packagesmatplotlibbackend_bases.py", line 2712, in notify_axes_change
    self.toolbar.update()
  File "C:Python39libsite-packagesmatplotlibbackend_bases.py", line 3276, in update
    self.set_history_buttons()
  File "C:Python39libsite-packagesmatplotlibbackends_backend_tk.py", line 667, in set_history_buttons
    self._buttons['Back']['state'] = state_map[can_back]
  File "C:Python39libtkinter__init__.py", line 1649, in __setitem__
    self.configure({key: value})
  File "C:Python39libtkinter__init__.py", line 1638, in configure
    return self._configure('configure', cnf, kw)
  File "C:Python39libtkinter__init__.py", line 1628, in _configure
    self.tk.call(_flatten((self._w, cmd))   self._options(cnf))
RuntimeError: main thread is not in main loop
127.0.0.1 - - [17/Feb/2021 01:02:33] "POST /postjson HTTP/1.1" 500 -

 

Код Python:

 
@app.route('/postjson', methods=['POST'])
def postJsonHandler():
    print(request.is_json)
    content = request.get_json()
    print(content)

   ... //some python code which return plots


    with BytesIO() as output:
        plt.savefig(output, transparent=True, format="PNG")
        contents = output.getvalue()

    plot1_base64 = base64.b64encode(contents)

    plot2 = plt.figure(2)
    plt.plot(simulator_inst.qr[:, 0], simulator_inst.qr[:, 1], 'b')
    plt.plot(simulator_inst.x, simulator_inst.y, 'r')

    with BytesIO() as output:
        plt.savefig(output, transparent=True, format="PNG")
        contents = output.getvalue()

    plot2_base64 = base64.b64encode(contents)

  
    print(str(plot2_base64, 'utf-8'))

    data_dict = {'plot1': str(plot1_base64, 'utf-8'),
                 'plot2': str(plot2_base64, 'utf-8'),
                 }

    data_json = json.dumps(data_dict)

    return data_json

 

Я трачу несколько часов на поиск возможного решения, и я уложен.
Я обращаюсь за помощью.
Заранее спасибо.

Комментарии:

1. похоже, ваша ошибка в tkinter, а не в flask

Ответ №1:

Этот бит из вашей трассировки стека говорит:

   File "C:Python39libsite-packagesmatplotlibbackends_backend_tk.py", line 667, in set_history_buttons
    self._buttons['Back']['state'] = state_map[can_back]
 

Это означает, что вы используете серверную часть графического интерфейса tkinter для matplotlib. Как правило, это плохо работает с любой библиотекой, использующей потоки, например, Flask. Обычно самый простой путь заключается в использовании одного из серверных интерфейсов, отличных от GUI, для matplotlib. Простое размещение этого в верхней части вашего скрипта даст указание matplotlib использовать его серверную часть «agg»

 import matplotlib
matplotlib.use('Agg')
 

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