Google App Engine的项目结构

Chr*_*org 119 python google-app-engine

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

是)我有的:

  • 主要包含:
    • 所有.py文件(不知道如何使包工作)
    • 主级别页面的所有.html模板
  • 子目录:
    • 用于css,图像,js等的单独文件夹
    • 包含子目录类型网址的.html模板的文件夹

示例:
http://www.bowlsk.com/ maps到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,图像,js等的单个子文件夹
  • 主文件夹包含appdef,索引,main.py?

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

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

fue*_*sjr 104

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

GvR描述了幻灯片演示文稿第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)
Run Code Online (Sandbox Code Playgroud)

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")
Run Code Online (Sandbox Code Playgroud)

的myapp/models.py

from google.appengine.ext import db

class SampleModel(db.Model):
Run Code Online (Sandbox Code Playgroud)

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

项目布局

  • static /:静态文件; 由App Engine直接提供
    • JS/*.JS
    • 图片/*GIF |.PNG | JPG
    • CSS/*.CSS
  • myapp /:app结构
    • 车型/*.PY
    • 意见/*.PY
    • 测试/*.PY
    • templates/*.html:templates

  • 一旦你获得20或30个视图,以及一些仅仅处理帖子然后重定向的"视图",你会将它们分成单独的文件吗?也许在myapp/views/view1.py,myapp/views/view2.py?或者只是我的Java/C#背景显示? (2认同)

Nic*_*son 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认同)
  • 嗨,我想看一些例子,如果可能的话.谢谢. (2认同)

小智 11

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

点击此链接gae-boilerplate


Jia*_* Yu 7

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

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