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应用程序时,我沿着第二个选项使用了一些东西,代码和模板在彼此旁边。

这其中有两个原因 – 一是它附近保留了代码和模板,二是我的目录结构布局模仿了网站 – 使得(对我而言)更简单一些,记住一切都在哪里。