关于python:Google App Engine的项目结构

关于python:Google App Engine的项目结构

Project structure for Google App Engine

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

p>我有什么:/ p>

UL>
li>主要包含:

UL>
li>所有.py文件(不知道如何使包工作)/ li>
li>主要级别页面的所有.html模板/ li>
/ UL> / LI>
LI>子目录:

UL>
li> css,images,js等的单独文件夹
li>包含子目录类型urls / li>的.html模板的文件夹
/ UL> / LI>
/ UL>

P>实施例:BR />
a href ="http://www.bowlsk.com/"rel ="noreferrer"> http://www.bowlsk.com//a>映射到HomePage(默认包),模板位于"index.html"br />
a href ="http://www.bowlsk.com/games/view-series.html?series=7130"rel ="noreferrer"> http://www.bowlsk.com/games/view-series.html? series = 7130 / a>映射到ViewSeriesPage(再次,默认包),模板"games / view-series.html"/ p>

这是令人讨厌的。我该如何重组?我有两个想法:/ p>

UL>
li> p>主文件夹包含:appdef,indexes,main.py?/ p>

UL>
li>代码的子文件夹。这是否是我的第一个包裹?/ li>
li>模板的子文件夹。文件夹heirarchy将匹配包heirarchy / li>
li> css,images,js等的单个子文件夹./li>
/ UL> / LI>
li> p>包含appdef,index,main.py?/ p>的主文件夹

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

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


首先,我建议您查看"a href ="http://sites.google.com/site/io/rapid-development-with-python-django-and-google-app-engine"rel ="noreferrer">使用Python,Django和Google App Engine快速开发/ a>"/ p>

p> GvR描述了他的a href ="http://sites.google.com/site/io/rapid-development-with-python-django-and-google-app-engine的第10页上的一般/标准项目布局/rapid_development_with_django_gae.pdf?attredirects=0"rel ="noreferrer">幻灯片演示文稿/ a>。 / P>

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

h2> Boilerplate文件/ h2>

UL>
li>项目之间几乎没有差异/ li>
li> app.yaml:将所有非静态请求指向main.py / li>
li> main.py:初始化app并发送所有请求/ li>
/ UL>

h2>项目布局/ h2>

UL>
li> static / *:静态文件;由App Engine / li>直接提供
li> myapp / * .py:app特定的python代码

UL>
li> views.py,models.py,tests.py,__ init__.py等等/ li>
/ UL> / LI>
li> templates / * .html:templates(或myapp / templates / * .html)/ li>
/ UL>

p>以下是一些可能有用的代码示例:/ p>

H2> main.py/h2>

pre> code> import wsgiref.handlers

来自google.appengine.ext导入webapp
来自myapp.views import *

application = webapp.WSGIApplication([
('/',IndexHandler),
('/ foo',FooHandler)
],debug = True)

def main():
wsgiref.handlers.CGIHandler()。运行(应用程序)
/代码> / PRE>

H2>的myapp / views.py / H2>

pre> code> import os
导入日期时间
导入日志记录
进口时间

来自google.appengine.api import urlfetch
来自google.appengine.ext.webapp导入模板
来自google.appengine.api导入用户
来自google.appengine.ext导入webapp
来自型号进口*

class IndexHandler(webapp.RequestHandler):
def get(self):
date ="foo"
#做一些处理
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("处理程序的开头")
/代码> / PRE>

H2>的myapp / models.py / H2>

pre> code>来自google.appengine.ext import db

class SampleModel(db.Model):
/代码> / PRE>

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

h2>项目布局/ h2>

UL>
li> static /:静态文件;由App Engine直接提供

UL>
LI> JS?? / *。JS / LI>
LI>图片/ * GIF |。PNG | JPG / li>
LI> CSS / *。CSS / LI>
/ UL> / LI>
li> myapp /:app结构

UL>
LI>型号/ *。PY / li>
LI>视图/ *。PY / LI>
LI>测试/ *。PY / li>
li> templates / * .html:templates / li>
/ UL> / LI>
/ UL>


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

UL>
LI>的app.yaml / LI>
LI> index.yaml中/ LI>
li> request.py - 包含基本的WSGI app / li>
LI> LIB

UL>
li> code> __ init __。py / code> - 常用功能,包括请求处理程序基类/ li>
/ UL> / LI>
li> controllers - 包含所有处理程序。 request.yaml import these./li>
LI>模板

UL>
li>控制器/ li>使用的所有django模板
/ UL> / LI>
LI>模型

UL>
li>所有数据存储模型类/ li>
/ UL> / LI>
LI>静

UL>
li>静态文件(css,图像等)。通过app.yaml / li>映射到/ static
/ UL> / LI>
/ UL>

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


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

p>点击此链接a href ="https://github.com/droot/gae-boilerplate"> gae-boilerplate / a> / p>


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

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


p>我喜欢href ="http://webpy.org/"> webpy / a>所以我在Google App Engine上采用它作为模板框架.br>
我的包文件夹通常如下组织:/ p>

预>代码>的app.yaml
application.py
index.yaml中
/应用
/配置
/控制器
/D b
/ lib目录
/楷模
/静态的
/文档
/图片
/ JavaScript的
/样式表
测试/
效用/
意见/
/代码> / PRE>

p> a href ="http://github.com/systempuntoout/stackprinter">这里/ a>是一个例子./p>


在谈到代码布局时,我并不完全了解最新的最佳实践,但是当我完成第一个GAE应用程序时,我使用了第二个选项,其中代码和模板紧挨着彼此./p>

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


推荐阅读