在Google App Engine中使用Ajax发布请求后的方法进行渲染

时间:2017-05-21 15:21:07

标签: jquery ajax google-app-engine webapp2

我使用Ajax $ .post()将表单内容发布到Google应用引擎中的控制器。表单主要是尝试使用html5地理位置和用户输入来查找lat / lng。

        <form method="post" id="simple-form" action="/search">
        <div>
            <input type="text" placeholder="Keyword" name="searchQuery"  id="searchQuery">
            <input type="button" id="simple-submit-button">
        </div> </form>

试图找到地理位置

$('#simple-submit-button').click(function () {
     navigator.geolocation.getCurrentPosition(onSuccess, onError);
})

function onSuccess(position) {
    document.getElementById('Latitude').value = position.coords.latitude;
    document.getElementById('Longitude').value = position.coords.longitude;
    var x = document.getElementById('Latitude').value;
    if (x != undefined || x != null) {
        submitform();
    }
}

使用jquery $ .post()将内容发布到方法并呈现另一个页面。

function submitform() {
    var where = $("#simple-firm").attr("action");
    var fi = $("#Latitude").val();
    var fj = $("#Longitude").val();
    var gk = $("#searchQuery").val();
    var what = {Latitude: fi, Longitude: fj, searchQuery: gk};
    $.post(where, what, handleResponse, "json");
}

以下是我的router.py

from webapp2 import WSGIApplication
from webapp2 import Route

app = WSGIApplication([
    Route('/search', handler='app.serp.Search'),
}

和我的方法

class Search():
def get(self):
    self.redirect('/')

def post(self):
    query_name = self.request.get('searchQuery')
    lat = float(self.request.get('Latitude'))
    lng = float(self.request.get('Longitude'))
    print query_name,lat, lng
    #self.response.out.write('<html><body>You wrote:<pre>')
    self.render('serp/serp.html')

虽然我可以在终端中看到正在打印的query_name,lat,lng的值,但是既没有显示self.render也没有self.response。我基本上想要渲染另一个名为serp.html的页面。这里出了什么问题。如何解决它。

2 个答案:

答案 0 :(得分:0)

需要了解更多信息。但是,这里有一些尝试:

1)检查日志以查看错误的位置。

2)此项目的/serp/中有sys.path吗?尝试: self.render('serp.html') self.render('/serp.html') self.render('/serp/serp.html')

3)使用jinja2,也许还有Flask。这些使渲染模板变得容易。

答案 1 :(得分:0)

首先,阅读有关渲染模板的this webapp2 documentation。模板基本上只是html文件,您可以在服务页面之前将自己的变量注入到html中(或者您可以按原样提供html)。

根据该文档判断,您可能希望这样做:

import os
import webapp2
from google.appengine.ext.webapp import template

# don't forget to extend webapp2.RequestHandler
class Search(webapp2.RequestHandler):
    def get(self):
        self.redirect('/')

    def post(self):
        query_name = self.request.get('searchQuery')
        lat = float(self.request.get('Latitude'))
        lng = float(self.request.get('Longitude'))
        print query_name,lat, lng

        template_values = {
            'query_name': query_name,
            'lat': lat,
            'lng': lng
        }
        path = os.path.join(os.path.dirname(__file__), 'serp/serp.html')
        self.response.out.write(template.render(path, template_values))

然而,你的问题对我来说有点奇怪。您正在将一个html页面返回给AJAX帖子请求?通常,您要么:

  1. 正常的HTTP Post(不是AJAX,同步,基本上是发布普通表单),响应将是一个新的网页(你的html)文件
  2. 一个AJAX帖子,你的jquery / javascript处理响应,响应是XML或JSON,而不是html。
  3. 你正在做两个混合的AJAX正在接收一个新的html页面,你仍然可以使工作得很好,但它有点奇怪。您可能会发现使用json或xml更容易回复,并使用jquery / AJAX通过设置post请求的json response来处理dataType或xml。你的电话。