如何在烧瓶中增加视图计数器



我正在做的事情的摘要和背景:

我正在创建一个应用程序,它允许您添加和存储食谱,我希望能够使用每个食谱收到的浏览次数来组织我的食谱列表。我应该解释一下,我有一个食谱列表,如果你点击列表中某个食谱的标题,它会把你带到一个新页面并显示该食谱。通过这种方式,我可以将我的应用程序分为三类列表(早餐、午餐和晚餐)。

我使用MongoDB来托管我的键/值对("视图":0),并且我希望每次有人刷新页面时都能将"视图"的值增加+1。我将在下面提供我的代码,但我认为我的问题是,我似乎无法在HTML或MongoDB中增加值。让我解释一下:我几乎可以肯定我的路由代码是正确的。我看过许多关于在MongoDB中$inc a值的适当方法的教程,但我认为我的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,并制作了我认为相关的recipe_id=配方_id,就像我在其他例子中看到的那样,我用它来瞄准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集合中更新。

以防万一

如果你需要更多的信息,或者如果我还不够清楚或解释得不够好,请告诉我,我会解决的。

谢谢。

可能需要对Mongo-DB的内容进行一些调整,但为什么不在没有路由的情况下使用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进行测试,并观察每次递增计数的开发服务器输出:

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 -

最新更新