当前位置: 首页 > 面试题库 >

如何在Google App Engine(Python)中使用AJAX

路雅懿
2023-03-14
问题内容

我完全是AJAX的新手。我熟悉HTML / CSS,jQuery和GAE和Python的初学者。

为了理解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如何容纳在这里?


问题答案:

好吧,先生,我们走了…一个带有一个故事和无限投票的简单应用… ;-)

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(从评论)



 类似资料:
  • 问题内容: 如何设置Selenium与Python一起使用?我只想用Python编写/导出脚本,然后运行它们。是否有任何资源?我尝试使用谷歌搜索,但是发现的东西要么是指Selenium(RC)的过时版本,要么是Python的过时版本。 问题答案: 您是说Selenium WebDriver吗?… 先决条件 :根据您的操作系统安装Python 使用以下命令安装 并在您的代码中使用此模块 您还可以根据

  • 问题内容: 我打算为Python安装一个虚拟环境,以使我的Python包分开。这样做的动机之一也是在我的机器上同时存在两个版本的Python(Ubuntu 14.04)。我有以下奇观: 应该以什么顺序安装Python,PIP和virtualenv?有关系吗? 完成后,如何在virtualenv下将两个python版本分开? 假设我正在处理单独的项目,是否建议将每个项目都保存在virtualenv创

  • 问题内容: 我正在尝试对正在编写的C python扩展进行memcheck,但是我无法设置valgrind与python一起使用。我真的很感谢一些建议。仅出于上下文考虑,这是Ubuntu 13.10,python 2.7.5+和valgrind 3.8.1。 根据我的建议,我做了以下工作。 1)下载了python源 2)应用了代码补丁,即“在Objects / obmalloc.c中取消注释Py_

  • 问题内容: 我刚刚在Windows 7计算机上安装了OpenCV。结果,我得到一个新目录: 在此目录中,我有两个文件:和。 然后,我尝试使用from Python。我执行以下操作: 结果,我收到以下错误消息: 我究竟做错了什么? 添加 至于有人建议在这里,我抄的内容的。它没有帮助。 加了2 我的环境变量具有以下值: 我需要改变什么吗?我需要添加一些东西吗? 加3 我认为我的问题很笼统:如何使用图书

  • 问题内容: 我在Vim和Python之间浪费了很多时间。我发现手动将其从Python复制粘贴到Vim,反之亦然,这太慢了。一个坏的例子是: %!python在xrange(25)中为我 打印6 * i \ n 您如何在Vim中直接进行此类调整? [解决了] [说明] 我需要Vim要做的事情,例如打印序列,算术…-我无法在Vim中做的事情。 [?] 有人可以详细说明这一点:“您的脚本可以从stdin

  • 问题内容: 我找到了有关subprocess.check_output()的文档,但是找不到带有参数的文档,而且该文档也不是很深入。我正在使用Python 3(但试图通过Python 3运行Python 2文件) 我正在尝试运行以下命令: -i是argparse的位置参数,test.txt是-i,py2.py是要运行的文件 我尝试了很多(无效)变体,包括: 问题答案: 正确的答案(使用Python

  • 问题内容: 我试图了解Python中的线程。我看过文档和示例,但坦率地说,许多示例过于复杂,我难以理解它们。 你如何清楚地显示为多线程而划分的任务? 问题答案: 我将在下面进行总结-最终仅是几行代码: 这是以下内容的多线程版本: 描述 Map是一个很棒的小功能,是轻松将并行性注入Python代码的关键。对于那些不熟悉的人来说,地图是从Lisp等功能语言中提炼出来的。它是将另一个功能映射到序列上的功

  • 问题内容: 使用硒进行GUI测试时,我想使用browsermob监视网络连接。我在这里,这里和这里都找到了一些信息和文档,但是绝对不清楚如何真正使用它。 在文档中显示为: 但是那条路是什么?在哪里找到它? 我也看到了 但对于这个jar文件是什么(如果它是browsermob安装的一部分)或无关的东西,则根本没有任何解释。 如果有人可以提供有关如何使用browsermob以及我需要安装的所有工具的完