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

2022-09-28 22:04:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新来的,需要你的帮助。你知道吗

我要显示的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不允许标准的文件操作。你知道吗

最简单的方法是什么?你知道吗


Tags: 文件importself图形mainhtmlpagescriptbodyjavascriptgraphrequesthandlerwebapp2mainpagehtml1
1条回答
网友
1楼 ·

App Engine允许您读取文件,而不是写入文件。如果您需要读/写功能,可以使用许多替代普通文件的方法,其中最好的两种方法通常是:(A)App Engine数据存储,用于中等大小的“文件”;(B)Google云存储,用于可能相当大的“文件”。你知道吗

您的用例似乎需要前者,即数据存储,所以我将重点讨论这种可能性。你知道吗

为表示要在响应中发送的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,如果您想要“强一致性”(因为key.get()保证在从查询获取时获取最新更新的内容,而无需其他预防措施),则可能需要保存该key(例如在memcache),可能会获得以前保存的数据版本(它只显示最终的一致性,而不是“立即”更新)。你知道吗

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

(对于大多数用例,我们可以从您不完整的规范中推断,我可能会使用name,这里我已经建模为一个属性,而不是作为id,一个key的一部分,但是,我正试图保持简单,以匹配您对规范所表达的很少内容)。你知道吗

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

这就是GCS和普通文件系统之间的主要区别(虽然数据存储还提供了更多的功能,比如查询和实体排序,但我们这里不使用任何额外的功能,因为您只要求类似文件系统的行为)。你知道吗

热门问题