首页 文章

Google App Engine的项目结构

提问于
浏览
118

我刚开始在谷歌应用引擎中启动了一个应用程序,玩这项技术并开展一个我一直在考虑的宠物项目,但是从来没有开始过 . 结果是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,索引,main.py的主文件夹?

  • 代码模板的子文件夹 . 这样我在模板旁边就有了处理程序类,因为在这个阶段,我喜欢这个文件夹是"src",但是我不希望我的类成为"src.WhateverPage"

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

6 回答

  • 1

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

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

  • 3

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

    • 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和示例控制器的示例,如果不清楚的话 .

  • 7

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

    点击此链接gae-boilerplate

  • 11

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

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

  • 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:特定于应用程序的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

    • images / * .gif | png | jpg

    • css / * .cs

    • myapp /:app结构

    • models / * .py

    • views / * .py

    • tests / * .py

    • templates / * .html:templates

  • 16

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

相关问题