javascript - 如何在 Python 中使用 Appengine 读写文件?

标签 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 不允许标准文件操作。

让它发挥作用的最简单方法是什么?

最佳答案

App Engine 让您可以很好地读取文件,只是不能写入。如果您需要读/写功能,可以使用许多纯文件替代方案,其中最好的两个通常是:(A) App Engine 数据存储,用于中等大小的"file"; (B) Google Cloud Storage,用于可能非常大的"file"。

您的用例似乎需要前者——即数据存储——所以我将重点关注这种可能性。

为表示您要在响应中发送的 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()

如果您想要“强一致性”(因为 key.get() 保证获取最新更新的内容,而从查询中获取,如果没有其他预防措施,可能会获取以前保存的数据版本——它只会显示 eventual 一致性,而不是“立即”更新)。

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

(对于大多数用例,可以从您的不完整规范中推断出,我可能会使用 name,在这里我将其建模为属性,而不是 idkey 的一部分——但是,我试图让事情变得简单,以匹配您所表达的关于您的规范的内容)。

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

这是 GCS 和通用文件系统之间的主要区别(虽然数据存储还在顶部提供了更多功能,例如实体的查询和排序——我们只是在这里不使用任何额外功能,因为您仅询问类似文件系统的行为)。

关于javascript - 如何在 Python 中使用 Appengine 读写文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29319244/

相关文章:

Python将列表中的字符串转换为数字

javascript - 暗光模式 : How to switch manifest and favicon?

javascript - rails - 在页面重新加载之前不显示 flash 消息?

Python - 无法使用 ctime 获取上次修改时间

javascript - 无法将数据推送到 Firebase onclick

html - 内部选项卡上的事件类

javascript - 将 Html 表导出到 Excel

javascript - 在没有警告的情况下通过 SSL 实现 StockTwits 小部件

javascript - 谷歌地图 Bootstrap 3

python - 在 Python 中实现请求重试