繁体   English   中英

从数据存储中提取数据并在python中的Json中将其转换(Google Appengine)

[英]Pulling data from datastore and converting it in Json in python(Google Appengine)

我正在使用Google Appengine创建一个应用程序,在该应用程序中,我从网站获取数据并将其存储在我的数据库(数据存储)中。现在,只要用户将我的应用程序网址作为“ application_url \\ name = xyz&city = abc”打入,我就是从数据库中获取数据并想将其显示为json。现在我正在使用过滤器根据名称和城市获取数据,但输出为[ ]。我不知道如何从中获取数据。我的代码看起来像这样:

class MainHandler(webapp2.RequestHandler):
    def get(self):
        commodityname = self.request.get('veg',"Not supplied")
        market = self.request.get('market',"No market found with this name")
        self.response.write(commodityname)
        self.response.write(market)
        query = commoditydata.all()
        logging.info(commodityname)
        query.filter('commodity = ', commodityname)
        result = query.fetch(limit = 1)
        logging.info(result)

和“商品数据”表的数据库结构是

class commoditydata(db.Model):
        commodity= db.StringProperty()
        market= db.StringProperty()
        arrival= db.StringProperty()
        variety= db.StringProperty()
        minprice= db.StringProperty()
        maxprice= db.StringProperty()
        modalprice= db.StringProperty()
        reporteddate= db.DateTimeProperty(auto_now_add = True)

谁能告诉我如何使用名称和市场从db中获取数据并在Json中对其进行隐蔽。首先从db中获取数据是更优先的事项。任何建议都将很有用。

如果您从一个新的应用程序开始,我建议使用NDB API而不是旧的DB API。 您的代码看起来几乎一样。

据我从您的代码示例可以看出,只要请求中的HTTP查询参数与数据存储区中的实体对象匹配,查询就应为您提供结果。

我可以想到导致空结果的一些可能原因:

  • 您只认为输出为空,因为您过早使用write() 应用程序引擎不支持响应流,您必须一次性编写所有内容,并在查询数据存储区后执行此操作
  • 您正在过滤的属性尚未在数据存储区中建立索引(至少尚未为您要查找的实体建立索引)
  • 过滤器什么都不匹配(请检查日志中从请求中获得的值)
  • 您的查询使用的名称空间与存储数据的位置不同(但是,如果您未在任何地方显式设置名称空间,则不太可能)

在Cloud Developer Console中,您可以查询数据存储,甚至可以应用过滤器,因此无需编写实际代码即可看到结果。

  1. 前往https://console.developers.google.com
  2. 在左侧,选择存储>云数据存储>查询
  3. 选择名称空间(默认应该可以)
  4. 选择种类“商品数据”
  5. 添加带有您期望从请求中获得的示例值的过滤器,并查看获得了多少结果

还可以查看Monitoring> Log ,它与您的logging.info()调用一起真正有助于更好地了解请求期间的情况。

数据获取后,转换为JSON相当容易。 在您的请求处理程序中,创建一个空的词典列表。 对于从查询结果中获得的每个对象:设置要发送的属性,在dict中定义一个键,然后将该值设置为从数据存储中获得的值。 最后,将字典作为JSON字符串转储。

class MainHandler(webapp2.RequestHandler):
    def get(self):
        commodityname = self.request.get('veg')
        market = self.request.get('market')
        if commodityname is None and market is None:
            # the request will be complete after this:
            self.response.out.write("Please supply filters!")
        # everything ok, try query:
        query = commoditydata.all()
        logging.info(commodityname)
        query.filter('commodity = ', commodityname)
        result = query.fetch(limit = 1)
        logging.info(result)
        # now build the JSON payload for the response
        dicts = []
        for match in result:
            dicts.append({'market': match.market, 'reporteddate': match.reporteddate})
        # set the appropriate header of the response:
        self.response.headers['Content-Type'] = 'application/json; charset=utf-8'
        # convert everything into a JSON string    
        import json
        jsonString = json.dumps(dicts)
        self.response.out.write( jsonString )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM