#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, что должно предотвратить проблемы с потоками, которые вы видите.