Google App Engine的项目结构


119

我刚问世时就在Google App Engine中启动了一个应用程序,以使用该技术并从事一个我一直想了很久但从未尝试过的宠物项目。结果是BowlSK。但是,随着它的增长和功能的添加,使其变得井井有条变得非常困难-主要是因为这是我的第一个python项目,在开始工作之前我对此一无所知。

我有的:

  • 主级别包含:
    • 所有.py文件(不知道如何使程序包正常工作)
    • 主页面的所有.html模板
  • 子目录:
    • 用于CSS,图片,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,索引,main.py?

    • 代码的子文件夹。这一定是我的第一个包裹吗?
    • 模板的子文件夹。文件夹层次结构将与包层次结构匹配
    • CSS,图像,JS等的单个子文件夹。
  • 主文件夹包含appdef,索引,main.py?

    • 代码+模板的子文件夹。这样,我就在模板旁边设置了处理程序类,因为在此阶段,我要添加许多功能,因此对一个进行修改意味着对另一个进行了修改。同样,我必须将此文件夹名称作为班级的第一个软件包名称吗?我希望文件夹为“ src”,但我不希望我的班级为“ src.WhateverPage”

有最佳做法吗?随着Django 1.0的出现,当它成为正式的GAE模板引擎时,我现在可以做些什么来提高与它的集成能力?我将简单地开始尝试这些事情,然后看一看似乎更好,但是pyDev的重构支持似乎不能很好地处理程序包的移动,因此使所有这些再次工作可能不是一件容易的事。

Answers:


104

首先,我建议您看看“ 使用Python,Django和Google App Engine进行快速开发

GvR在幻灯片演示文稿的第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 /:应用程序结构
    • 型号/*.py
    • 视图/*.py
    • 测试/*.py
    • templates / *。html:模板

2
一旦获得20或30个视图,以及几个仅处理帖子然后重定向的“视图”,您是否将它们分解为单独的文件?也许在myapp / views / view1.py,myapp / views / view2.py中?还是仅仅通过我的Java / C#背景显示出来?
克里斯·马拉斯蒂·乔治

1
我编辑了帖子,以解决更大的项目。希望对您有所帮助。请记住,在某些情况下,这将是一个判断电话。
fuentesjr

1
我有类似的布局,但是使用“ app”而不是“ myapp”。
亚历山大·科耶夫尼科夫

有人可以为这样的项目布局提供一个可行的例子吗?我没有找到合适的东西。
herrherr 2010年

16

我通常的布局如下所示:

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

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


5
嗨尼克,请这样做!我还需要在不同的解决方案之间进行比较:)谢谢!
藩范2009年

2
嗨,如果可能的话,我也想看看一些例子。谢谢。

11

我今天实现了一个Google App Engine样板,并在github上进行了检查。这与尼克·约翰逊(Nick Johnson)(曾为Google工作)所描述的思路一致。

点击此链接gae-boilerplate


1
您能否在这个答案上扩大一点?github链接很好地支持了您的答案,但是您至少应该尝试介绍一下它。
Shog9 2012年

1
gae-boilerplate根目录中的README.md对此进行了说明。github.com/droot/gae-boilerplate/blob/master/README.md
Ed Randall

7

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

关于Django 1.0,建议您开始使用Django主干代码,而不要使用内置在django端口中的GAE。再次,看看Rietveld的工作方式。


使用Django的最佳理由是什么?我一直在使用WebApp,并且一直在为我服务。此外,我希望Google能够在不久的将来更好地整合两者。使用内置Django端口的不利之处是什么?
jamtoday

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/

是一个例子。


1

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

造成这种情况的原因有两个:一是将代码和模板保留在附近,其二,我的目录结构布局与网站的布局相似,这对我来说使它变得更容易一点,也记住所有内容在哪里。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.