Google App Engine 的项目结构

119 投票
6 回答
28381 浏览
提问于 2025-04-11 09:16

我在Google App Engine刚推出的时候就开始了一个应用,想玩玩这项技术,同时也想做一个我一直想做但一直没开始的项目。结果就是这个BowlSK。不过,随着它的发展和功能的增加,保持项目的组织变得非常困难——主要是因为这是我第一个用Python做的项目,开始工作之前我对它一无所知。

我现在的结构是这样的:

  • 主目录包含:
    • 所有的.py文件(我不知道怎么做包)
    • 所有主页面的.html模板
  • 子目录:
    • 为css、图片、js等分别创建的文件夹
    • 存放子目录类型网址的.html模板的文件夹

举个例子:
http://www.bowlsk.com/对应首页(默认包),模板是“index.html”
http://www.bowlsk.com/games/view-series.html?series=7130对应查看系列页面(同样是默认包),模板是“games/view-series.html”

这结构真糟糕。我该怎么重构呢?我有两个想法:

  • 主文件夹包含:appdef、indexes、main.py?

    • 代码的子文件夹。这个必须是我的第一个包吗?
    • 模板的子文件夹。文件夹结构和包结构一致
    • 为css、图片、js等分别创建的子文件夹
  • 主文件夹包含appdef、indexes、main.py?

    • 代码和模板的子文件夹。这样我可以把处理类和模板放在一起,因为在这个阶段,我添加了很多功能,所以一个的修改意味着另一个也要修改。同样,这个文件夹名必须是我的类的第一个包名吗?我希望文件夹叫“src”,但我不想我的类叫“src.WhateverPage”

有没有什么最佳实践?随着Django 1.0即将推出,我现在能做些什么来提高我将来与它集成的能力呢?我本来想试试这些方法,看看哪个更好,但pyDev的重构支持似乎对包的移动处理得不好,所以要让这一切重新工作可能会是一项不小的任务。

6 个回答

11

今天我实现了一个谷歌应用引擎的基础模板,并把它放到了GitHub上。这是按照上面Nick Johnson的描述做的,他以前在谷歌工作过。

你可以点击这个链接查看 gae-boilerplate

17

我通常的项目结构大概是这样的:

  • app.yaml
  • index.yaml
  • request.py - 里面包含了基本的WSGI应用
  • lib
    • __init__.py - 这里有一些通用功能,包括一个请求处理的基类
  • controllers - 这里包含了所有的处理器,request.yaml会引用这些处理器。
  • templates
    • 所有的django模板,供处理器使用
  • model
    • 所有的数据存储模型类
  • static
    • 静态文件(比如css、图片等)。在app.yaml中映射到/static

如果这些内容不太清楚,我可以提供我的app.yaml、request.py、lib/init.py和一些示例处理器的例子。

104

首先,我建议你看看这本书:“用Python、Django和Google App Engine快速开发”。

GvR在他的幻灯片演示的第10页上描述了一个通用的项目结构。

在这里,我会贴出一个稍微修改过的结构版本。我自己也基本上是按照这个模式来做的。你还提到你在使用包的时候遇到麻烦。只要确保每个子文件夹里都有一个__init__.py文件就可以了,里面可以是空的。

基础文件

  • 这些文件在不同项目之间几乎没有变化
  • app.yaml: 将所有非静态请求指向main.py
  • main.py: 初始化应用并处理所有请求

项目结构

  • static/*: 静态文件;由App Engine直接提供服务
  • myapp/*.py: 应用特定的Python代码
    • views.py、models.py、tests.py、__init__.py等
  • templates/*.html: 模板文件(或者是myapp/templates/*.html)

这里有一些代码示例,可能会对你有帮助:

main.py

import wsgiref.handlers

from google.appengine.ext import webapp
from myapp.views import *

application = webapp.WSGIApplication([
  ('/', IndexHandler),
  ('/foo', FooHandler)
], debug=True)

def main():
  wsgiref.handlers.CGIHandler().run(application)

myapp/views.py

import os
import datetime
import logging
import time

from google.appengine.api import urlfetch
from google.appengine.ext.webapp import template
from google.appengine.api import users
from google.appengine.ext import webapp
from models import *

class IndexHandler(webapp.RequestHandler):
  def get(self):
    date = "foo"
    # Do some processing        
    template_values = {'data': data }
    path = os.path.join(os.path.dirname(__file__) + '/../templates/', 'main.html')
    self.response.out.write(template.render(path, template_values))

class FooHandler(webapp.RequestHandler):
  def get(self):
    #logging.debug("start of handler")

myapp/models.py

from google.appengine.ext import db

class SampleModel(db.Model):

我觉得这个结构对于新的、相对小到中等规模的项目非常合适。对于更大的项目,我建议将视图和模型分开,放到各自的子文件夹里,比如:

项目结构

  • static/: 静态文件;由App Engine直接提供服务
    • js/*.js
    • images/*.gif|png|jpg
    • css/*.css
  • myapp/: 应用结构
    • models/*.py
    • views/*.py
    • tests/*.py
    • templates/*.html: 模板文件

撰写回答