如何使用Python中的Appengine读取和写入文件?

时间:2015-03-28 15:58:23

标签: javascript python html google-app-engine

我是appengine的新手,我需要你的帮助。

我要显示的javascript会生成图表。

import webapp2

MAIN_PAGE_HTML1 = """\
<html>
<body>
<script>
  #My script comes here
  var graph = new Graph();
  graph.addNodes('a', 'b');
  graph.addEdges(['a', 'b']);
  #...
</script>
</body>
</html>
"""
class MainPage(webapp2.RequestHandler):
    def get(self):
        self.response.write(MAIN_PAGE_HTML1)


app = webapp2.WSGIApplication([
    ('/', MainPage),
], debug=True)

我的想法是将主html存储在一个文件中并在调用RequestHandler时读取它并在我从客户端发布新的图形元素时对其进行修改。我不能这样做,因为appengine不允许标准文件操作。

最简单的方法是什么?

1 个答案:

答案 0 :(得分:7)

App Engine可让您读取文件,只是不。如果您需要读/写功能,可以使用普通文件的许多替代方法,最好的两种方法通常是:(A)App Engine数据存储,适用于中等到中等大小的“文件”; (B)谷歌云存储,用于可能非常大的“文件”。

你的用例似乎要求前者 - 即数据存储 - 所以我将专注于这种可能性。

为表示要在响应中发送的HTML的实体定义模型类 - 通常这些“模型”最好保存在单独的model.py文件中,以便从其他Python文件导入,但这是正确的代码组织问题,而不是功能问题。对于后者,无论你放入什么文件,你的代码都会有点像:

from google.appengine.ext import ndb

class Page(ndb.Model):
    name = ndb.StringProperty()
    html = ndb.TextProperty()

当您需要按特定名称获取网页时,您的代码将类似于:

page = Page.query(Page.name == the_name).get()
if page is None:
    page = Page(name=the_name, html=MAIN_PAGE_HTML1)
    page.put()

并在以前提取的现有网页page上设置新的,已修改的html内容,只需

page.html = new_html_content
page.put()

如果您想要“强一致性”(put,则key调用会返回您要保存的memcache(例如在key.get()中)获取最新更新的内容,而从查询中获取,而无需其他预防措施,可能会获得以前保存的数据版本 - 它只显示最终一致性,而不是“立即”更新。

但很难更具体地提供有关如何最好地使用数据存储区的建议而不了解太多,更多关于您的确切要求 - 如何确定要显示和/或更新的确切页面(将是由我的示例代码中的name属性给出,如果您可以根据需要使用普通的读/写文件,它将由文件名给出,您的一致性(更新的即时性)要求是什么,等等类推。

(对于大多数用例,可以从您的不完整规范中推断出,我可能会使用name,我在此处将其建模为属性,而不是idkey的一部分{ {1}} - 但是,我正在努力保持简单,以便与您对规范的表达方式相符。)

请注意,在这种方法中,每次要更改时都会重写整个html内容 - 主要替代方案(建议用于可能更大的文件),Google云端存储:没有实际的“增量更新” “,只需完成重写即可影响对”文件“内容的任何更改。

这是GCS与公共文件系统之间的主要区别(虽然数据存储区还提供了更多功能,例如查询和实体排序 - 我们之前没有使用任何额外的功能,因为你是只是要求类似文件系统的行为。)