Google App Engine的项目结构
我刚开始使用Google App Engine的应用程序时,就开始使用这项技术,并且开展了一个我一直在想的很长时间但却从未着手过的项目。 结果是BowlSK 。 然而,随着它的发展和function的增加,组织起来确实很困难 – 主要是因为这是我的第一个Python项目,在我开始工作之前我一无所知。
我拥有的:
- 主要级别包含:
- 所有的.py文件(不知道如何使软件包工作)
- 主要级别页面的所有.html模板
- 子目录:
- 单独的文件夹为CSS,图像,JS等。
- 包含用于子目录types的URL的.html模板的文件夹
例:
http://www.bowlsk.com/映射到HomePage(默认包),模板在“index.html”
http://www.bowlsk.com/games/view-series.html?series=7130映射到ViewSeriesPage(再次,默认包),模板在“games / view-series.html”
这是讨厌的。 我如何重组? 我有两个想法:
-
主文件夹包含:appdef,indexes,main.py?
- 子文件夹的代码。 这是否必须是我的第一个包?
- 子文件夹的模板。 文件夹heirarchy将匹配包heirarchy
- 个人子文件夹的CSS,图像,JS等
-
主文件夹包含appdef,索引,main.py?
- 用于代码+模板的子文件夹。 这样,我有模板旁边的处理程序类,因为在这个阶段,我添加了很多function,所以修改一个意味着修改到另一个。 同样,我是否必须将此文件夹名称作为我的类的第一个包名称? 我想要的文件夹是“src”,但我不希望我的课是“src.WhateverPage”
有最佳做法吗? 随着Django 1.0的发展,我们现在能做些什么来提高我与它的整合能力,当它成为官方的GAE模板引擎? 我只是开始尝试这些东西,看看哪个更好,但pyDev的重构支持似乎不能很好地处理包移动,所以这可能是一个不重要的任务,使所有这一切再次运行。
首先,我build议你看看“ Python,Django和Google App Engine的快速开发 ”
GvR在他幻灯片演示的第10页描述了一个通用/标准的项目布局。
在这里,我将从该页面发布一个稍微修改版本的布局/结构。 我自己几乎遵循这个模式。 你也提到你有包的麻烦。 只要确保每个子文件夹都有一个__init__.py文件。 没关系,如果它是空的。
锅炉文件
- 这些项目之间几乎不一样
- app.yaml:将所有非静态请求指向main.py
- main.py:初始化应用程序并发送所有请求
项目布局
- 静态/ *:静态文件; 由App Engine直接提供
- myapp / *。py:应用程序特定的Python代码
- views.py,models.py,tests.py,__init__.py,等等
- templates / *。html:templates(或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):
我认为这种布局适用于新的和相对中小的项目。 对于较大的项目,我build议分手的意见和模型有自己的子文件夹,如:
项目布局
- 静态/:静态文件; 由App Engine直接提供
- JS / *。JS
- 图片/ * GIF |。PNG | JPG
- CSS / *。CSS
- myapp /:app结构
- 车型/ *。PY
- 意见/ *。PY
- testing/ *。PY
- 模板/ *。html:模板
我通常的布局看起来像这样:
- 的app.yaml
- index.yaml中
- request.py – 包含基本的WSGI应用程序
- LIB
-
__init__.py
– 通用function,包括请求处理程序基类
-
- 控制器 – 包含所有的处理程序。 request.yaml导入这些。
- 模板
- 所有的控制器使用的Django模板
- 模型
- 所有的数据存储模型类
- 静态的
- 静态文件(CSS,图像等)。 映射到/静态app.yaml
如果不清楚,我可以提供我的app.yaml,request.py,lib / init .py和示例控制器的样子。
我今天实施了谷歌应用程序引擎样板,并在github上检查它。 这是上面Nick Johnson所描述的(曾经为Google工作的)。
按照这个链接gae-boilerplate
我认为第一个select被认为是最好的做法。 并将代码文件夹作为您的第一个软件包。 Guido van Rossum开发的Rietveld项目是一个很好的学习模式。 看看它: http : //code.google.com/p/rietveld
关于Django 1.0,我build议你开始使用Django中继代码,而不是使用django端口中的GAE。 再次看看Rietveld是如何完成的。
我喜欢webpy,所以我将它作为Google App Engine上的模板框架。
我的包文件夹通常是这样组织的:
app.yaml application.py index.yaml /app /config /controllers /db /lib /models /static /docs /images /javascripts /stylesheets test/ utility/ views/
这是一个例子。
在代码布局方面,我没有完全掌握最新的最佳实践,等等,但是当我做了第一个GAE应用程序时,我沿着第二个选项使用了一些东西,代码和模板在彼此旁边。
这其中有两个原因 – 一是它附近保留了代码和模板,二是我的目录结构布局模仿了网站 – 使得(对我而言)更简单一些,记住一切都在哪里。