Google App Engine的项目结构
我刚问世时就在Google App Engine中启动了一个应用程序,以使用该技术并从事一个我一直在考虑但一直没有开始的宠物项目。结果是BowlSK。但是,随着它的增长和功能的添加,使其变得井井有条变得非常困难,这主要是因为这是我的第一个python项目,在开始工作之前我对此一无所知。
我有的:
- 主页面的所有.html模板
- 包含用于子目录类型url的.html模板的文件夹
例子:
http://www.bowlsk.com/映射到HomePage(默认程序包),模板位于" index.html"
http://www.bowlsk.com/games/view-series.html?series=7130映射到ViewSeriesPage(还是默认包),模板位于" games / view-series.html"
真讨厌我如何重组?我有两个想法:
- 模板的子文件夹。文件夹层次结构将与包层次结构匹配
- CSS,图片,JS等的单个子文件夹。
有最佳做法吗?随着Django 1.0的出现,当它成为正式的GAE模板引擎时,我现在可以做些什么来提高与它的集成能力?我将简单地开始尝试这些事情,然后看一看似乎更好,但是pyDev的重构支持似乎不能很好地处理程序包的移动,因此使所有这些再次工作可能不是一件容易的事。
解决方案
回答
关于代码布局,我并不完全了解最新的最佳实践等,但是当我完成第一个GAE应用程序时,我在第二个选项中使用了一些东西,其中代码和模板彼此相邻。
这样做的原因有两个,它使代码和模板保持在附近,其次,我的目录结构布局模仿了网站的布局,这使它(对我来说)变得更容易一点,也记得所有内容在哪里。
回答
我认为第一种选择是最佳实践。并将代码文件夹作为第一个软件包。 Guido van Rossum开发的Rietveld项目是一个很好的学习模型。看看吧:http://code.google.com/p/rietveld
关于Django 1.0,建议我们开始使用Django主干代码,而不要使用内置在django端口中的GAE。再次,看看如何在Rietveld中完成它。
回答
首先,我建议我们看一下"使用Python,Django和Google App Engine进行快速开发"
GvR在幻灯片演示的第10页上描述了常规/标准项目布局。
在这里,我将从该页面上发布布局/结构的稍作修改的版本。我本人几乎遵循这种模式。我们还提到过我们在使用软件包时遇到了麻烦。只要确保每个子文件夹都有一个__init__.py文件即可。如果它为空也可以。
样板文件
- 这些项目之间几乎没有差异
- app.yaml:将所有非静态请求定向到main.py
- main.py:初始化应用并发送所有请求
项目布局
- static / *:静态文件;由App Engine直接提供
- 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):
我认为这种布局非常适合新的和相对较小的项目。对于较大的项目,我建议分解视图和模型以拥有自己的子文件夹,其中包括:
项目布置
- 图片/*.gif|png|jpg
- css / *。css
- 视图/*.py
- 测试/*.py
- templates / *。html:模板
回答
我通常的布局如下所示:
- app.yaml
- index.yaml
- request.py-包含基本的WSGI应用程序
- 控制器-包含所有处理程序。 request.yaml导入这些。
如果不清楚,我可以提供有关我的app.yaml,request.py,lib / init.py和示例控制器的外观的示例。
回答
我喜欢webpy,因此已将其用作Google App Engine上的模板框架。
我的软件包文件夹通常是这样组织的:
app.yaml application.py index.yaml /app /config /controllers /db /lib /models /static /docs /images /javascripts /stylesheets test/ utility/ views/
这是一个例子。