【问题标题】:Rendering from method after Ajax post request in Google App Engine在 Google App Engine 中的 Ajax 发布请求后从方法渲染
【发布时间】:2017-10-21 06:20:19
【问题描述】:

我正在使用 Ajax $.post() 将表单的内容发布到我在谷歌应用引擎中的控制器。该表单基本上是尝试使用 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 的页面。这里出了什么问题。如何修复它。

【问题讨论】:

    标签: jquery ajax google-app-engine webapp2


    【解决方案1】:

    需要了解更多。但是,这里有一些事情可以尝试:

    1) 检查您的日志以查看错误所在。

    2) /serp/ 在您的 sys.path 中用于该项目吗?尝试: self.render('serp.html') self.render('/serp.html') self.render('/serp/serp.html')

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

    【讨论】:

      【解决方案2】:

      首先,阅读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。

      你正在做一些 AJAX 接收新 html 页面的混合,你仍然可以正常工作,但这有点奇怪。您可能会发现使用json 或xml 进行响应更容易,并通过设置post 请求的dataType 来使用jquery/AJAX 来处理json response 或xml。您的来电。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-02
        • 2017-04-22
        • 1970-01-01
        • 1970-01-01
        • 2022-08-19
        • 2017-03-16
        • 1970-01-01
        • 2012-10-15
        相关资源
        最近更新 更多