Я перемещаю всю свою логику монго из моего внешнего сервиса в свой внутренний, оба выполняются через docker-compose.Я отправляю сообщение с данными, извлеченными из формы после отправки обновления.Однако мой mongodb не обновляется.
При попытке отправить форму я получаю следующую трассировку.
backend_1 | Traceback (most recent call last):
backend_1 | File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 2309, in __call__
backend_1 | return self.wsgi_app(environ, start_response)
backend_1 | File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 2295, in wsgi_app
backend_1 | response = self.handle_exception(e)
backend_1 | File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1741, in handle_exception
backend_1 | reraise(exc_type, exc_value, tb)
backend_1 | File "/usr/local/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
backend_1 | raise value
backend_1 | File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
backend_1 | response = self.full_dispatch_request()
backend_1 | File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
backend_1 | rv = self.handle_user_exception(e)
backend_1 | File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
backend_1 | reraise(exc_type, exc_value, tb)
backend_1 | File "/usr/local/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
backend_1 | raise value
backend_1 | File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
backend_1 | rv = self.dispatch_request()
backend_1 | File "/usr/local/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
backend_1 | return self.view_functions[rule.endpoint](**req.view_args)
backend_1 | File "/app/app.py", line 42, in update_medical_history
backend_1 | fname = request.form['fname']
backend_1 | File "/usr/local/lib/python3.6/site-packages/werkzeug/datastructures.py", line 431, in __getitem__
backend_1 | raise exceptions.BadRequestKeyError(key)
У меня также была проблема с косой чертой, которая, как мне кажется, была решена с помощьюследующее: app.url_map.strict_slashes = False
Внешний интерфейс:
@app.route('/update_medical_history/<int:id>/', methods=['GET', 'POST'])
def update_medical_history(id):
patient = invoke_backend(page_name="update_medical_history", id=id)
form = PatientForm(request.form)
form.fname.data = patient['fname']
form.lname.data = patient['lname']
form.age.data = patient['age']
form.weight.data = patient['weight']
if request.method == 'POST' and form.validate():
backend_url = create_url("update_medical_history", id)
response = requests.post(backend_url, json=request.form)
if response.text == "redirect":
flash('Patient updated', 'success')
return redirect(url_for('view_patients'))
return render_template('update_medical_history.html', form=form)
def create_url(page_name, id):
be_host = os.getenv('BACKEND_SERVICE_HOST', 'backend')
be_port = os.getenv('BACKEND_SERVICE_PORT', '5000')
url = 'http://{host}:{port}/{page_name}/{id}'.format(host=be_host, port=be_port, page_name=page_name, id=id)
return url
def invoke_backend(page_name, id=""):
url = create_url(page_name, id)
try:
res = requests.get(url)
except Exception:
return "Error with {}".format(url)
response = res.json()
return response
Бэкэнд:
@app.route('/update_medical_history/<int:id>/', methods=['GET', 'POST'])
def update_medical_history(id):
patients = mongo.db.patients
if request.method == 'POST':
fname = request.form['fname']
lname = request.form['lname']
age = request.form['age']
weight = request.form['weight']
myquery = {"id": id}
newvalues = {"$set": {"fname": fname, "lname": lname, "age": age, "weight": weight}}
patients.update_one(myquery, newvalues)
return jsonify("redirect")
patient = patients.find_one({'id': id})
return jsonify(
{
'id': patient['id'],
'fname': patient['fname'],
'lname': patient['lname'],
'age': patient['age'],
'weight': patient['weight'],
}
)