2

感觉就像我在这里遇到了一些相当简单的事情。

我不了解 AJAX 和 Flask。

我有一个项目,我在浏览器中显示 mongodb 记录,它一直运行良好。

我为用户添加了增加记录投票的功能;如果他们喜欢,请投票。但最初我用新的投票刷新了整个页面,使用重定向,这是笨拙的。所以我试图让 AJAX 将数据发送到 mongodb 记录,然后更新我希望投票出现的跨度,而无需重新加载整个页面。

问题是,我正在进行的设置,虽然仍在更新记录,但现在正在加载一个新页面,其中的 HTML 我只想返回到投票记录应该是的跨度(也就是说,它正在加载一个只有单词的新页面其中的“测试”(我当前返回的测试值))。

jQuery(我正在使用的库)加载正常,没有其他问题(据我所知)。

我在这里有相关的 HTML 和 JS:

<!-- All Standard HTML up here, removed for simplicity -->


<script>


  $('#vote_link').bind('click', function(e){
     e.preventDefault();
     var url = $(this).attr('href');
     $('#vote_tally').load(url);

  });


</script>



<a href='/vote_up/{{ item._id }}' id='vote_link'>Vote for Me!</a><br>
Likes: <span id='vote_tally'>{{ item.votes }}</span>


<!-- All Standard HTML down here, removed for simplicity -->

蟒蛇在这里:

from flask import Flask, render_template, request, redirect, flash, jsonify
#from mongokit import Connection, Document
#from flask.ext.pymongo import PyMongo
from pymongo import Connection#, json_util
#from pymongo.objectid import ObjectId #this is deprecated
import bson.objectid

'''my pymongo connection - removed for simplicity'''

'''bunch of other routes - also removed for same reason'''


#increment a vote
@app.route('/vote_up/<this_record>')
def vote_up(this_record):

  vandalisms.update({'_id':bson.objectid.ObjectId(this_record)}, 
            {"$inc" : { "votes": 1 }}, upsert=True)

  '''
  also trying to return value for votes field from mongo record, but one step at a 
  time here
  '''
  #result = vandalisms.find({'_id':bson.objectid.ObjectId(this_record)}, {'votes':1})

  result = 'test'

  return result

我也无法弄清楚如何将指定 mongodb 记录的个人投票值返回给浏览器,即使使用 jsonify (返回 {"votes":'_id'},但这是另一个问题。希望有人可以帮助我在这方面了解如何使用 Flask 使 AJAX 为我工作。

提前致谢,

编辑-24Jul2012-2:27PM CST:

我怀疑 jQuery 甚至没有激活。它似乎是根据链接的 href 属性加载新页面,因此e.prevenDefault();当它没有运行时没有用。此外,alert('I have been clicked');当点击事件发生时,永远不会运行。再次,jQuery 被加载,但点击事件没有激活 jQuery,我不知道为什么没有。

4

2 回答 2

3

我的猜测(根据您的编辑)是您在页面上有多个 ID 为的元素vote_link- 这在 HTML 中是不允许的(ID 属性在整个文档中必须是唯一的)。如果您想让多个链接共享相同的行为,请改用一个类($(".vote_link")例如)。

于 2012-07-25T02:29:41.827 回答
0

基本上,AJAX的工作方式是服务器使用 XML 或 JSON 进行回复。

在这种情况下, flask 中的jsonify函数将响应带有以下 HTTP 标头字段的消息:

Content-type: application/json

如果您需要接收的不仅仅是数字或一些文本,这是为了让浏览器和 JavaScript 理解语法。

因此,在 Flask 上使用 jsonify 作为文档示例,然后在 JavaScript 端使用 $.getJSON() 或 $.ajax()。

http://flask.pocoo.org/docs/patterns/jquery/#json-view-functions

https://github.com/mitsuhiko/flask/tree/master/examples/jqueryexample

于 2012-07-24T09:02:12.250 回答