Google App Engine的项目结构

时间:2008-09-07 14:08:47

标签: python google-app-engine

我在Google App Engine中启动了一个应用程序,当它出现时,玩这项技术并开展一个我一直在考虑的宠物项目,但是从来没有开始过。结果是BowlSK。然而,随着它的发展和功能的增加,它变得非常难以保持组织 - 主要是因为这是我的第一个python项目,在我开始工作之前我对此一无所知。

我有什么:

  • 主要级别包含:
    • 所有.py文件(不知道如何使包工作)
    • 主要页面的所有.html模板
  • 子目录:
    • css,images,js等的单独文件夹。
    • 包含子目录类型网址的.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,images,js等的单个子文件夹
  • 包含appdef,index,main.py?

    的主文件夹
    • 代码+模板的子文件夹。这样我在模板旁边就有了处理程序类,因为在这个阶段,我添加了很多功能,所以修改一个就意味着修改另一个。同样,我必须将此文件夹名称作为我的类的第一个包名吗?我想文件夹是“src”,但我不希望我的课程是“src.WhateverPage”

有最好的做法吗?随着Django 1.0即将到来,当它成为官方的GAE模板引擎时,我现在能做些什么来提高我与它集成的能力?我只是开始尝试这些东西,看看哪个看起来更好,但是pyDev的重构支持似乎并没有很好地处理包移动,所以重新开始工作可能是一件非常重要的任务。

6 个答案:

答案 0 :(得分:104)

首先,我建议您查看“Rapid Development with Python, Django, and Google App Engine

GvR描述了他slide presentation第10页的一般/标准项目布局。

在这里,我将从该页面发布一个稍微修改过的版面布局/结构。我自己也非常关注这种模式。您还提到您在使用包时遇到问题。只需确保每个子文件夹都有一个__init__.py文件。如果它是空的,那就好了。

Boilerplate文件

  • 这些项目之间几乎没有差异
  • app.yaml:将所有非静态请求定向到main.py
  • main.py:初始化应用并发送所有请求

项目布局

  • static / *:静态文件;由App Engine直接提供
  • myapp / * .py:app特定的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):

我认为这种布局适用于新的和相对中小型项目。对于较大的项目,我建议将视图和模型分解为拥有自己的子文件夹,例如:

项目布局

  • static /:静态文件;由App Engine直接提供
    • JS​​ / *。JS
    • 图像/ * GIF |。PNG | JPG
    • CSS / *。CSS
  • myapp /:app结构
    • 模型/ *。PY
    • 视图/ *。PY
    • 测试/ *。PY
    • templates / * .html:templates

答案 1 :(得分:16)

我通常的布局看起来像这样:

  • 的app.yaml
  • index.yaml中
  • request.py - 包含基本的WSGI应用
  • LIB
    • __init__.py - 常用功能,包括请求处理程序基类
  • controllers - 包含所有处理程序。 request.yaml导入这些。
  • 模板
    • 控制器使用的所有django模板
  • 模型
    • 所有数据存储模型类
  • 静态
    • 静态文件(css,图像等)。通过app.yaml映射到/ static

如果不清楚,我可以提供我的app.yaml,request.py,lib / init .py和示例控制器的示例。

答案 2 :(得分:11)

我今天实施了一个谷歌应用引擎样板,并在github上进行了检查。这与上面的尼克·约翰逊(曾经为谷歌工作过)所描述的一致。

请点击此链接gae-boilerplate

答案 3 :(得分:7)

我认为第一种选择被认为是最佳做法。并将代码文件夹作为您的第一个包。由Guido van Rossum开发的Rietveld项目是一个非常好的模型。看看它:http://code.google.com/p/rietveld

关于Django 1.0,我建议你开始使用Django中继代码而不是内置django端口的GAE。再次,看看它是如何在Rietveld中完成的。

答案 4 :(得分:3)

我喜欢webpy所以我在Google App Engine上将其作为模板框架使用 我的包文件夹通常如下组织:

app.yaml
application.py
index.yaml
/app
   /config
   /controllers
   /db
   /lib
   /models
   /static
        /docs
        /images
        /javascripts
        /stylesheets
   test/
   utility/
   views/

Here就是一个例子。

答案 5 :(得分:1)

关于代码布局,我并不完全了解最新的最佳实践等等,但是当我完成第一个GAE应用程序时,我使用了第二个选项,其中代码和模板紧挨着海誓山盟。

这有两个原因 - 一个是它保持代码和模板附近,其次,我的目录结构布局模仿了网站 - 使它(对我来说)更容易记住一切都在哪里。