我完全是AJAX的新手。我熟悉GAE和Python的HTML / CSS,jQuery和初学者。
为了理解AJAX的工作原理,我想知道下面这个例子中如何使用AJAX(实际代码)。让我们使用类似reddit的例子,其中投票上升/下降被激活:
这是故事种类:
class Story(ndb.Model):
title = ndb.StringProperty(required = True)
vote_count = ndb.IntegerProperty(default = 0)
HTML看起来像这样:
<h2>{{story.title}}</h2>
<div>
{{story.vote_count}} | <a href="#">Vote Up Story</a>
</div>
AJAX如何适应这里?
答案 0 :(得分:26)
好的先生,我们先走了......一个简单的应用程序,有一个故事和无限投票...... ;-)
<强> app.yaml
强>
application: anotherappname
version: 1
runtime: python27
api_version: 1
threadsafe: true
default_expiration: "0d 0h 5m"
libraries:
- name: jinja2
version: latest
- name: webapp2
version: latest
handlers:
- url: .*
script: main.app
<强> main.py
强>
import logging
from controllers import server
from config import config
import webapp2
app = webapp2.WSGIApplication([
# Essential handlers
('/', server.RootPage),
('/vote/', server.VoteHandler)
],debug=True, config=config.config)
# Extra Hanlder like 404 500 etc
def handle_404(request, response, exception):
logging.exception(exception)
response.write('Oops! Naughty Mr. Jiggles (This is a 404)')
response.set_status(404)
app.error_handlers[404] = handle_404
<强> models/story.py
强>
from google.appengine.ext import ndb
class Story(ndb.Model):
title = ndb.StringProperty(required=True)
vote_count = ndb.IntegerProperty(default = 0)
<强> controllers/server.py
强>
import os
import re
import logging
import config
import json
import webapp2
import jinja2
from google.appengine.ext import ndb
from models.story import Story
class RootPage(webapp2.RequestHandler):
def get(self):
story = Story.get_or_insert('Some id or so', title='A voting story again...')
jinja_environment = self.jinja_environment
template = jinja_environment.get_template("/index.html")
self.response.out.write(template.render({'story': story}))
@property
def jinja_environment(self):
jinja_environment = jinja2.Environment(
loader=jinja2.FileSystemLoader(
os.path.join(os.path.dirname(__file__),
'../views'
))
)
return jinja_environment
class VoteHandler(webapp2.RequestHandler):
def post(self):
logging.info(self.request.body)
data = json.loads(self.request.body)
story = ndb.Key(Story, data['storyKey']).get()
story.vote_count += 1
story.put()
self.response.out.write(json.dumps(({'story': story.to_dict()})))
最后
<强> views/index.html
强>
<!DOCTYPE html>
<html>
<head>
<base href="/">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
</head>
<body>
<h2>{{story.title}}</h2>
<div>
<span class="voteCount">{{story.vote_count}}</span> | <a href="javascript:VoteUp('{{story.key.id()}}');" >Vote Up Story</a>
</div>
<script>
function VoteUp(storyKey){
$.ajax({
type: "POST",
url: "/vote/",
dataType: 'json',
data: JSON.stringify({ "storyKey": storyKey})
})
.done(function( data ) { // check why I use done
alert( "Vote Cast!!! Count is : " + data['story']['vote_count'] );
$('.voteCount').text(data['story']['vote_count']);
});
};
</script>
</body>
</html>
组装,阅读它很简单并运行。如果您需要一个有效的git示例,请注释。
githublink(来自评论)
答案 1 :(得分:0)
这是GitHub上的一个小prototype网络应用程序,用于测试如何使用AJAX,Python和Google App Engine处理HTML表单提交中的错误消息。它将给出一个起点,看看这三种技术如何融合在一起。你可以测试这个&#34; app&#34;在https://ajax-prototype.appspot.com/
以下是它在客户端的工作原理:
<form method="post" action="javascript:ajaxScript();">
<label>Please pick a name</label>
<input id="input" type="text">
<input type="submit">
<div id="error" style="color:red"></div>
它会触发JavaScript function ajaxScript
:
function ajaxScript() {
var input = $("#input").val();
$.ajax({
type: "POST",
url: "/",
data: JSON.stringify({
"name": input
}),
dataType: "json"
})
.done(function(jsonResponse) {
$("#error").html(jsonResponse.message);
});
}
jQuery .ajax()
方法处理请求,而.done()
方法最终将处理从服务器获取的响应。
在服务器端:
main.py
文件使用我们的handler class AjaxHandler
来处理业务的服务器端,webapp2.RequestHandler
post
继承自GAE内置类def post(self):
data = json.loads(self.request.body)
username = data["name"]
if not re.match(r"^[a-zA-Z0-9_-]{3,20}$", username):
if len(username) < 3:
message = "Your name must be at least 3 characters long."
else:
message = "Allowed characters are \
a-z, A-Z, 0-9, underscores \
and hyphens."
else:
message = "Congrats!"
self.response.write(json.dumps({"message": message}))
在此类中,json
方法处理AJAX请求:
json.loads
基本上,方便的json.dumps
模块提供了两个关键的Python成分
self.request.body
处理浏览器发送给服务器的数据。json.loads
处理服务器发送的数据,以响应浏览器的请求。echo
echo $FILENAME | hadoop fs -put - filesystem:///url
参数是此过程中使用的唯一不太常见的GAE,因为它特定于任务。顾名思义,它从客户端发送的Ajax请求中获取正文。