Google App Engine 的项目结构
我在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 个回答
今天我实现了一个谷歌应用引擎的基础模板,并把它放到了GitHub上。这是按照上面Nick Johnson的描述做的,他以前在谷歌工作过。
你可以点击这个链接查看 gae-boilerplate
我通常的项目结构大概是这样的:
- 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和一些示例处理器的例子。
首先,我建议你看看这本书:“用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: 模板文件