Google App Engine 的项目结构
-
09-06-2019 - |
题
当 Google App Engine 推出时,我就在它中启动了一个应用程序,来玩转该技术并致力于一个我已经考虑了很长时间但从未抽出时间开始的宠物项目。结果是 碗SK. 。然而,随着它的发展和功能的添加,让事情变得井井有条变得非常困难——主要是因为这是我的第一个 python 项目,在开始工作之前我对它一无所知。
我拥有的:
- 主要级别包含:
- 所有 .py 文件(不知道如何使包工作)
- 主级别页面的所有 .html 模板
- 子目录:
- 单独的文件夹用于 css、图像、js 等。
- 包含子目录类型 url 的 .html 模板的文件夹
例子:
http://www.bowlsk.com/ 映射到主页(默认包),模板位于“index.html”
http://www.bowlsk.com/games/view-series.html?series=7130 映射到 ViewSeriesPage(同样是默认包),模板位于“games/view-series.html”
太恶心了。我该如何重组?我有两个想法:
主文件夹包含:appdef、索引、main.py?
- 代码的子文件夹。这必须是我的第一个包裹吗?
- 模板的子文件夹。文件夹层次结构将与包层次结构匹配
- css、images、js 等的单独子文件夹。
主文件夹包含 appdef、索引、main.py?
- 代码+模板的子文件夹。这样,我就可以将处理程序类放在模板旁边,因为在这个阶段,我添加了很多功能,因此对一个功能的修改意味着对另一个功能的修改。再说一遍,我是否必须将此文件夹名称作为我的类的第一个包名称?我希望文件夹为“src”,但我不希望我的类为“src.WhateverPage”
有最佳实践吗?随着 Django 1.0 即将推出,当它成为官方 GAE 模板引擎时,我现在可以做些什么来提高与它集成的能力吗?我只是开始尝试这些事情,看看哪个看起来更好,但是 pyDev 的重构支持似乎不能很好地处理包移动,因此让所有这些再次工作可能是一项不简单的任务。
解决方案
首先,我建议您看一下“使用 Python、Django 和 Google App Engine 进行快速开发"
GvR 在他的第 10 页上描述了一般/标准项目布局 幻灯片演示.
在这里,我将发布该页面的布局/结构的稍微修改版本。我自己也几乎遵循这个模式。您还提到您在处理包裹时遇到了麻烦。只需确保每个子文件夹都有一个 __init__.py 文件。如果是空的也没关系。
样板文件
- 这些在项目之间几乎没有变化
- 应用程序.yaml:将所有非静态请求定向到 main.py
- 主要.py:初始化应用程序并向其发送所有请求
项目布局
- 静止的/*:静态文件;由 App Engine 直接提供服务
- myapp/*.py:应用程序特定的Python代码
- views.py、models.py、tests.py、__init__.py 等
- 模板/*.html:模板(或 myapp/templates/*.html)
以下是一些可能也有帮助的代码示例:
主要.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):
我认为这种布局非常适合新的和相对中小型的项目。对于较大的项目,我建议将视图和模型分解为拥有自己的子文件夹,其中包含以下内容:
项目布局
- 静止的/:静态文件;由 App Engine 直接提供服务
- js/*.js
- 图片/*.gif|png|jpg
- css/*.css
- 我的应用程序/:应用程序结构
- 模型/*.py
- 视图/*.py
- 测试/*.py
- 模板/*.html:模板
其他提示
我通常的布局看起来像这样:
- 应用程序.yaml
- 索引.yaml
- request.py - 包含基本的 WSGI 应用程序
- 库
__init__.py
- 通用功能,包括请求处理程序基类
- 控制器 - 包含所有处理程序。request.yaml 导入这些。
- 模板
- 控制器使用的所有 django 模板
- 模型
- 所有数据存储模型类
- 静止的
- 静态文件(css、图像等)。通过 app.yaml 映射到 /static
我可以提供我的 app.yaml、request.py、lib/ 的示例在里面.py,如果不清楚的话,示例控制器看起来像。
我今天实现了一个谷歌应用程序引擎样板并在 github 上检查了它。这与上面尼克·约翰逊(Nick Johnson)(曾在谷歌工作)描述的思路是一致的。
点击此链接 gae 样板
我认为第一个选项被认为是最佳实践。并将代码文件夹作为您的第一个包。Guido van Rossum 开发的 Rietveld 项目是一个非常值得学习的模型。看看它: http://code.google.com/p/rietveld
对于 Django 1.0,我建议您开始使用 Django trunk 代码,而不是 django 端口内置的 GAE。再次看看 Rietveld 是如何完成的。
在代码布局方面,我并不完全了解最新的最佳实践,等等,但是当我制作第一个 GAE 应用程序时,我在第二个选项中使用了一些东西,其中代码和模板彼此相邻。
这样做有两个原因 - 一是它使代码和模板保持在附近,二是我的目录结构布局模仿了网站的布局 - 让(对我来说)更容易记住所有东西在哪里。