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

use*_*048 1 html javascript python 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)
Run Code Online (Sandbox Code Playgroud)

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

最简单的方法是什么?

Ale*_*lli 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()
Run Code Online (Sandbox Code Playgroud)

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

page = Page.query(Page.name == the_name).get()
if page is None:
    page = Page(name=the_name, html=MAIN_PAGE_HTML1)
    page.put()
Run Code Online (Sandbox Code Playgroud)

并在page以前提取的现有页面上设置新的,修改过的html内容

page.html = new_html_content
page.put()
Run Code Online (Sandbox Code Playgroud)

put调用返回一个key你可能希望保存(例如memcache)如果你想"强一致性"(因为key.get()是保证获取最新的更新内容,同时从查询得到,没有其他预防措施,可能会得到的以前保存的版本数据 - 它只显示最终的一致性,而不是"立即"更新.

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

(对于大多数用例,可以从你不完整的规格中推断出来,我可能会使用,我name在这里建模为一个属性,而不是作为一个属性的id一部分key- 但是,我试图保持简单的匹配你对你的规格表达的很少).

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

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