Как увеличить счетчик просмотров в колбе? - PullRequest
0 голосов
/ 28 декабря 2018

Резюме и предыстория того, что я делаю:

Я создаю приложение , которое позволяет вам добавлять и хранить рецепты, и я хотел быбыть в состоянии организовать мой список рецептов, используя количество просмотров каждого рецепта.Я должен объяснить, что у меня есть список рецептов, и если вы нажмете на название одного из рецептов в этом списке, он откроет вам новую страницу и отобразит этот рецепт.Таким образом, я могу организовать свое приложение в три категории списков (Завтрак, Обед и Ужин).

Я использую MongoDB для размещения моих пар ключ / значение ("views": 0) и Я хочу иметь возможность увеличивать значениеиз "просмотров" на + 1 каждый раз, когда кто-то обновляет страницу.Я приведу свой код ниже, но я думаю, что моя проблема в том, что я не могу увеличить значение в моем HTML или MongoDB.Позвольте мне объяснить: я почти уверен, что мой код маршрутизации правильный.Я просмотрел множество учебных пособий по , которые описывают подходящий способ $ inc для значения в MongoDB , но я считаю, что мне не хватает чего-то из моего HTML, чтобы правильно соответствовать этому коду, и я не уверен, что это такое,

Когда я запускаю этот код , он все еще работает и не выдает предупреждение об ошибке, но когда я попадаю на любую страницу рецепта, счетчик просмотров не изменяется при обновлении этой страницы.Он остается только в 0.

Я должен также сказать, что у меня есть два отдельных маршрута, которые, я думаю, связаны друг с другом в этом случае: у меня есть маршрут "view_recipe", который показывает страницу рецепта, и яесть маршрут "view_count", который функционирует для подсчета просмотров.Ниже я приведу оба этих документа вместе с моим HTML-кодом, чтобы все могли их проверить.

Что я уже пробовал:

Для моего приложения рецептов яСледуя инструкциям на Youtube о том, как $ inc мой ключ / значение, я не уверен в информации, которую я должен предоставить своему HTML.Основываясь на других примерах, моя соответствующая информация о просмотре в HTML выглядит следующим образом:

<a href="{{url_for('view_recipe', recipe_id=recipe._id)}}" class="waves-effect waves-light btn btn_small blue">{{recipe.views})</a>

Я предоставил url_for для маршрута и сделал то, что мне показалось релевантным recipe_id = recipe._id, как я видел в других примерахЯ использовал таргетинг на идентификатор.

Мой код:

Вот мои маршруты для "view_recipe" и "view_count ":

@app.route('/view_recipe/<recipe_id>')
def view_recipe(recipe_id):
    the_recipe =  mongo.db.recipes.find_one({"_id": ObjectId(recipe_id)})
    return render_template('view_recipe.html', recipe=the_recipe)

@app.route('/view_count/<recipe_id>')
def view_count(recipe_id):
    mongo.db.recipes
    recipes.update({'_id': str(recipe_id)}, {'$inc': {'views': int(1)}})
    return url_for('view_recipe.html')

и вот раздел для подсчета просмотров, который я предоставил в моем " view_recipe.html ", где я размещаю {{recipe.view}}

<a href="{{url_for('view_recipe', recipe_id=recipe._id)}}" class="waves-effect waves-light btn btn_small blue">{{recipe.views})</a>

Что происходит, когда я запускаю этот код, против того, что я ожидаю:

Код выполняется, но не увеличиваетсякак я и ожидал.Счетчик просто остается на 0 и не повышается, когда я обновляю страницу.Я надеюсь, что после обновления страницы значение счетчика будет увеличиваться и отображаться в браузере и обновляться в моей коллекции MongoDb.

На всякий случай ...

Если вам нужна дополнительная информация, или если я не достаточно ясно объяснил или объяснил это хорошо, пожалуйста, дайте мне знать, и я исправлю это.

Спасибо.

1 Ответ

0 голосов
/ 28 декабря 2018

Может потребоваться некоторая настройка для базы данных Mongo, но почему бы просто не использовать функцию view_count без маршрута, поскольку ее не нужно вызывать через URL.Вместо этого вызовите его непосредственно в функции view_recipe.

@app.route('/view_recipe/<int:recipe_id>')
def view_recipe(recipe_id):
    the_recipe =  mongo.db.recipes.find_one({"_id": recipe_id})
    view_count(recipe_id) # call the other function here.
    return render_template('view_recipe.html', recipe=the_recipe)

def view_count(recipe_id):
    recipes = mongo.db.recipes
    recipes.update({'_id': recipe_id}, {'$inc': {'views': 1}})
    return True
  • В маршруте аргумент должен быть <int:recipe_id>, что гарантирует, что пользовательский ввод является целым числом.
  • Второйфункция больше не должна возвращать render_template, поэтому вместо этого возвращает True.
  • Вы не можете просто вызвать mongo.db.recipes в функции просмотра.Я изменил это, чтобы вы установили receipes на это, а затем получили доступ к receipes.update.Это было бы то же самое, что звонить mongo.db.recipes.update()

РЕДАКТИРОВАТЬ

Я предполагаю, что вы используете pymongo.Обратите внимание на приведенные выше изменения.

Мне было так любопытно, что я запустил тестовую коробку mongo DB и попробовал это.Я протестировал и загрузил этот гист с файлом shell.py, который показывает мою первоначальную конфигурацию, и приложением с колбами, которое импортирует db.py, чтобы продемонстрировать это.

Я думаюваша проблема заключалась в том, что ObjectID () на самом деле делает что-то не связанное.Вам просто нужно передать recipe_id, как показывает мой код.Затем я могу протестировать с несколькими выполнениями curl http://localhost:5000/1 и посмотреть вывод сервера dev, который увеличивает счетчик каждый раз:

Db script:  {'_id': 1, 'text': 'TEST', 'counter': 5}
Flask says:  {'_id': 1, 'text': 'TEST', 'counter': 6}
127.0.0.1 - - [30/Dec/2018 01:22:21] "GET /1 HTTP/1.1" 200 -
Flask says:  {'_id': 1, 'text': 'TEST', 'counter': 7}
127.0.0.1 - - [30/Dec/2018 01:22:22] "GET /1 HTTP/1.1" 200 -
Flask says:  {'_id': 1, 'text': 'TEST', 'counter': 8}
127.0.0.1 - - [30/Dec/2018 01:22:22] "GET /1 HTTP/1.1" 200 -
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...