GAE:使用静态HTML文件vs数据库来提供内容



我的新站点(用于阅读书籍)实际上使用静态内容来提供页面:我将HTML文件保存在一个文件夹中,为了提供页面,我读取它并将内容传递给jinja2模板,以显示所有内容。没有数据库匹配,除了获取书ID来知道书名。

这工作得很好,很快,但很明显,我必须"上传"每一本新书与"部署"选项从GAE SDK(从我所读到的,没有办法从外部访问GAE的文件系统,像FTP),这不是最佳的方式。

所以我在考虑保存HTML内容到数据库,但是:这会增加数据库命中很多吗?我使用的是NDB,所以从理论上讲,每个读取图书的用户在第一次读取图书时都会从NDB缓存中获得缓存的结果。这样对吗?

将html传递给数据库会更好吗?就大小而言,每个html页面将超过8k。这些页面也有图片文件,所以,为了避免最初每本新书都要上传的问题,我必须把图片也保存在数据库中,对吗?

书的示例页将是这样的

Google应用引擎有一个专门的文件上传服务,叫做Blobstore。

你可以写一个管理页面,让你上传和发布文件。您只需要使用数据库来存储每个对象的元数据:书名,作者,相关图片…

这里有一些文档

如果你想要一个"穷人"的实现,在你的应用程序文件夹的顶层创建一个名为" books "的文件夹。在里面,为每本书创建一个文件夹,在每本书中,为每一章创建一个文件夹。这将为你的库提供一个树状结构。

然后,在每本书的文件夹中,创建一个index.html文件,作为封面页和目录。它应该有链接到每一章。在每个章节的文件夹中,创建另一个index.html文件,其中包含该章节的HTML。该章的所有图片都在该文件夹下的index.html文件旁边,所有链接都是相对的,即:href="picture.jpeg"

更改app.yaml,将'books'文件夹作为静态目录提供:

handlers:
- url: /books
  static_dir: books

如果您永远不需要更改图书的内容,您可以只发布每本书一次并部署它。这样做的美妙之处在于,除了编辑HTML和app.yaml之外,不需要编程。

为什么不使用Google Drive上传您的内容并将其保存在NDB中呢?读取成本不高,而且NDB数据存储非常快。

可以使用blobstore存储图像。看看Google高性能图像服务,它利用了来自图像API的blobstore和get_serving_url。

如果你的ndb实体结构正确,开销将非常小。

基本上,总是做基于键的读取。

假设你有:

def Template (ndb.model):
   data = ndb.TextProperty()

那么你可以这样做:

key = ndb.Key(Template, 'bookname.html')
data = key.get().data

ndb将自动memcache这些读取。因此,在memcache将它们清除之前,它们将非常快并且完全自由。

真正要考虑的是大小——ndb实体被限制为(IIRC) 1MB。如果你所有的模板都比这个小,那就很好了。如果它们更大,我建议使用Blob Store。不过,您仍然需要使用ndb来存储对Blob store的引用:)

最新更新