У меня есть веб-сайт, который я размещаю с помощью flask и использую mongodb для хранения данных. я использую htmx для сброса данных, но столкнулся с проблемой; когда данные сбрасываются, он показывает весь словарь, когда мне нужно только значение из словаря. Кажется, это легко исправить, но поскольку я новичок в htmx, я понятия не имею, что делать.
вот моя текущая настройка колбы:
@app.route('/data')
def get_data():
return json.loads(dumps(collection.find()))
и мой HTML:
<h1>MongoDB Data Test</h1>
<div id = "data-container"
hx-get = "/data"
hx-trigger = "load, every 3s"
hx-target = "#data-container"
hx-swap = "innerHTML">
<!-- Data will be injected here -->
<span></span>
</div>
вот что показано на сайте:
[ { "_id": { "$oid": "id" }, "count_testing": 15 } ]
мне нужно только значение count_testing (т. е. 15), а не весь словарь, который будет отображаться на веб-сайте.
это из bson.json_util
Используете ли вы jinja2, pywebview или любой другой модуль или фреймворк?
я использую flask, jinja2 и htmx для перезагрузки данных из mongodb
Вы можете просто проиндексировать объект, чтобы возвращать только интересующее вас значение:
@app.route('/data')
def get_data():
return str(json.loads(dumps(collection.find()))[0]["count_testing"])
«Ошибка типа: функция просмотра не вернула допустимый ответ. Тип возвращаемого значения должен быть строкой, словарем, списком, кортежем с заголовками или статусом, экземпляром ответа или вызываемым WSGI, но это было целое число».
Исправил, спасибо, код не проверял 😀
Лучший способ сделать это - на стороне Python, IMO. Поместите данные в переменную, запустите для них анализ списка, верните результат. Нравиться:
def get_data():
data = list(collection.find())
filtered_data = [item['count_testing'] for item in data if 'count_testing' in item]
return jsonify(filtered_data)
как убрать скобки списка? это не так уж и важно, поскольку дает очень чистый результат, но если можно удалить скобки списка, это решение было бы отличным. Я предполагаю, что удалить скобки можно только на стороне html.
Кроме того, как мне заставить это работать для нескольких элементов?
На данный момент это просто стандартное программирование на Python. Спросите в Чатгпте 🙈
@user26831591 ','.join(filtered_data)
превратит список в строку, разделенную запятыми.
@Barmar, я не могу использовать ', '.join(filtered_data)
для своих данных, потому что .join не допускает целых чисел. однако это легко исправить, используя ', '.join(map(str, filtered_data))
. функции карты преобразуют каждое значение в строку, что позволяет мне использовать .join. на веб-сайте вместо скобок отображаются цитаты, что вы также можете исправить, вернув ответ в виде обычного текста, т. е. return Response(data_string, mimetype='text/plain')
однако у меня есть вопрос; что, если я захочу использовать совершенно разные значения? нужно ли мне хранить значения в совершенно разных каталогах?
чтобы уточнить, предположим, что у меня есть два значения в одной коллекции: count_testing и message_count. хотя я мог бы легко извлечь оба значения из базы данных mongodb, они всегда будут вместе. я хочу, чтобы это отображалось на сайте следующим образом: test count: (count_testing value) message count: (message_count value)
. нужно ли мне использовать два разных маршрута приложения?
ничего, решено! извлеките нужные вам данные в список с помощью понимания списка (или другого метода), а затем вы можете указать индексы в списке, а также добавить разрыв для разделения значений: data_string = f'count: {filtered_data[0]}<br>message_count: {filtered_data[1]}'
обязательно верните их в виде обычного текста через Response
collection.find()
возвращает объект курсора, содержащий документы.
Обратите внимание: каждый документ имеет поля и значения. например, если вы хотите получить все поля и значения первого объекта, вам нужно вызвать метод Collection.find()[0], который возвращает dict
dct = collection.find()[0]
print(dct)
# Output: {'a':1, 'b':2}
Используя return json.loads(dumps(collection.find()))
, вы конвертируете строку dict
в json и, в свою очередь, преобразуете ее в строку dict
.
Я имею в виду получить конкретный документ и вернуть значения. Например,
@app.route('/data')
def get_data():
cursor = collection.find()
# access document with specific index or specific _id or query. I used index 0
dct = cursor[0]
# values = [x for x in dct.values()]
# Edited as you want specific value
val = dct['count_testing']
return val
[x for x in dct.values()]
можно упростить до list(dct.values())
Как это возвращает только поля count_testing
?
Смотрите мой отредактированный ответ @Barmar
что такое
dumps
?