我的新网站(阅读书籍)实际上使用静态内容来提供页面:我将HTML文件保存在文件夹中,为了服务页面,我阅读它并将内容传递给jinja2模板,以显示全部一起。除了获取书籍ID以了解标题之外,没有数据库命中。
这个工作正常而且很快,但很明显我必须使用GAE SDK中的“部署”选项“上传”每本新书(从我读过的内容来看,无法访问文件系统)来自外部的GAE,就像使用FTP),这不是最佳方式。
所以我正在考虑将HTML内容保存到数据库中,但是:这会增加数据库的命中率吗?我正在使用NDB,所以从理论上讲,读取书籍的每个用户都会在第一次被readed时从NDB缓存中获得缓存结果。这是对的吗?
将html传递给数据库会更好吗?在大小方面,每个html页面将超过8k。页面也有图像文件,因此,为了避免每个新书上传它的初始问题,我还必须将图像保存在数据库中,对吗?
图书的示例页面为like this
答案 0 :(得分:5)
Google应用引擎拥有专门的文件上传服务,称为Blobstore。
您可以编写一个管理页面,让您上传文件并发布它们。您将需要仅使用数据库来存储有关每个对象的元数据:书名,作者,相关图像......
答案 1 :(得分:2)
如果您想要“穷人”的实现,请在应用程序文件夹的顶层创建一个名为“books”的文件夹。在其中,为每本书创建一个文件夹,并在每个书中,为每个章节创建一个文件夹。这将为您提供库的树结构。
然后,在每本书的文件夹中,创建一个index.html文件,作为封面和目录。它应该包含每章的链接。在每个章节的文件夹中,创建另一个包含该章节HTML的index.html文件。该章的所有图像都与该文件夹中的index.html文件并列,并且所有链接都是相对的,即:href =“picture.jpeg”
更改您的app.yaml以将“books”文件夹作为静态目录提供:
handlers:
- url: /books
static_dir: books
如果您不必更改图书的内容,则只需发布一次图书并进行部署即可。这样做的好处是除了编辑HTML和app.yaml之外,不需要编程。
答案 2 :(得分:1)
为什么不使用Google云端硬盘上传您的内容并将内容保存在NDB中。读取并不昂贵,NDB数据存储非常快。
您可以将blobstore用于图像。查看Google高性能图像服务,它使用了来自Image API的blobstore和get_serving_url。
答案 3 :(得分:1)
如果正确构建ndb实体,开销将非常小。
基本上,只需要进行基于密钥的读取。
假设你有:
def Template (ndb.model):
data = ndb.TextProperty()
然后你可以这样做:
key = ndb.Key(Template, 'bookname.html')
data = key.get().data
ndb将自动memcache这些读取。因此,在memcache驱逐它们之前,它们将非常快速且完全免费。
真正要考虑的是size - ndb实体仅限于(IIRC)1MB。如果你的所有模板都小于那个,那么你就是好的。如果它们更大,我建议使用Blob商店。您仍然希望使用ndb来存储对Blob存储的引用,但是:)