我是 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
,在这里我将其建模为属性,而不是 id
,key
的一部分——但是,我试图让事情变得简单,以匹配您所表达的关于您的规范的内容)。
请注意,在这种方法中,每次您想要更改它时,整个 html 内容都会被重写——主要替代方案也是如此(建议用于可能更大的文件),谷歌云存储:没有实际的“增量更新” ",只需完成重写即可影响对"file"内容的任何更改。
这是 GCS 和通用文件系统之间的主要区别(虽然数据存储还在顶部提供了更多功能,例如实体的查询和排序——我们只是在这里不使用任何额外功能,因为您仅询问类似文件系统的行为)。
关于javascript - 如何在 Python 中使用 Appengine 读写文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29319244/