Google App Engine 的项目结构

Posted

技术标签:

【中文标题】Google App Engine 的项目结构【英文标题】:Project structure for Google App Engine 【发布时间】:2010-09-08 02:05:44 【问题描述】:

我在 Google App Engine 推出时就在它中启动了一个应用程序,以使用该技术并从事一个我想了很长时间但一直没有开始的宠物项目。结果是BowlSK。然而,随着它的发展和功能的增加,让事情井井有条变得非常困难——主要是因为这是我的第一个 python 项目,在我开始工作之前我对它一无所知。

我有什么:

主层包含: 所有 .py 文件(不知道如何使包工作) 主要页面的所有 .html 模板 子目录: css、图片、js等的独立文件夹 包含子目录类型 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、索引、main.py?

代码的子文件夹。这必须是我的第一个包裹吗? 模板的子文件夹。文件夹层次结构将匹配包层次结构 css、图像、js 等的各个子文件夹。

包含 appdef、索引、main.py 的主文件夹?

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

有最佳实践吗?随着 Django 1.0 的出现,当它成为官方的 GAE 模板引擎时,我现在可以做些什么来提高我与它集成的能力吗?我会简单地开始尝试这些东西,看看哪个看起来更好,但是 pyDev 的重构支持似乎不能很好地处理包移动,所以让所有这些再次工作可能不是一件容易的事。

【问题讨论】:

【参考方案1】:

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

GvR 在他的slide presentation 的第 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 图片/*.gif|png|jpg css/*.css myapp/: 应用结构 models/*.py views/*.py 测试/*.py 模板/*.html:模板

【讨论】:

一旦您获得 20 或 30 个视图,以及一些只处理帖子然后重定向的“视图”,您是否会将它们分成单独的文件?也许在 myapp/views/view1.py、myapp/views/view2.py 中?或者只是我的 Java/C# 背景显示出来了? 我编辑了我的帖子以解决更大的项目。我希望这会有所帮助。请记住,在某些情况下,这将是一个判断电话。 我有类似的布局,但使用“app”而不是“myapp”。 有人可以为这样的项目布局提供一个工作示例吗?我还没有找到合适的。【参考方案2】:

我通常的布局是这样的:

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

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

【讨论】:

嗨,尼克,请这样做!我还需要比较不同的解决方案:)谢谢! 嗨,如果可能的话,我也想看看一些例子。谢谢。【参考方案3】:

我今天实现了一个谷歌应用引擎样板,并在 github 上检查了它。这与上面 Nick Johnson(他曾在 Google 工作)所描述的思路一致。

点击此链接gae-boilerplate

【讨论】:

你能扩展一下这个答案吗? github 链接很好,可以很好地支持您的答案,但您至少应该尝试介绍一下。 gae-boilerplate 根目录中的 README.md 说明了一切。 github.com/droot/gae-boilerplate/blob/master/README.md【参考方案4】:

我认为第一个选项被认为是最佳实践。并使代码文件夹成为您的第一个包。 Guido van Rossum 开发的 Rietveld 项目是一个很好的学习模型。看看吧:http://code.google.com/p/rietveld

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

【讨论】:

使用 Django 的最佳理由是什么?我一直在使用 WebApp,它一直很好地为我服务。此外,我希望谷歌能在不久的将来提供更好的两者整合。使用内置 Django 端口有什么缺点?【参考方案5】:

我喜欢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 就是一个例子。

【讨论】:

【参考方案6】:

在代码布局方面,我并不完全了解最新的最佳实践,等等,但是当我做我的第一个 GAE 应用程序时,我在你的第二个选项中使用了一些东西,其中代码和模板位于旁边彼此。

这有两个原因 - 第一,它保留了代码和模板,第二,我的目录结构布局模仿了网站 - 让(对我而言)更容易记住所有内容的位置。

【讨论】:

以上是关于Google App Engine 的项目结构的主要内容,如果未能解决你的问题,请参考以下文章

在 Google App Engine 上部署 Django 项目

Cron Job-具有Google App Engine的纯Django项目

尝试在 Google App Engine 项目中创建备份时出现 404

在单个 Google App Engine 项目中同时使用 Java 和 Python

Google App Engine 不提供静态文件

就文件夹结构而言,Google App Engine 应用程序中的默认服务/模块可以是非默认服务/模块的兄弟吗?