118

Google App Engineがリリースされた直後にアプリケーションを開始し、テクノロジーを試して、長い間考えていたペットプロジェクトに取り組みましたが、開始することはできませんでした。結果はBowlSKです。しかし、それが成長し、機能が追加されるにつれて、物事を整理するのは非常に困難になりました-これは主にこれが私の最初のPythonプロジェクトであり、作業を開始するまで何も知りませんでした。

私が持っているもの:

  • メインレベルには以下が含まれます:
    • すべての.pyファイル(パッケージを機能させる方法がわかりませんでした)
    • メインレベルのページのすべての.htmlテンプレート
  • サブディレクトリ:
    • css、images、jsなどの個別のフォルダ。
    • サブディレクトリタイプのURLの.htmlテンプレートを保持するフォルダ

例:
http : //www.bowlsk.com/はホームページ(デフォルトパッケージ)にマップされ、「index.html」のテンプレートは
http://www.bowlsk.com/games/view-series.html?series=7130にマップされます。 ViewSeriesPage(これもデフォルトのパッケージ)、「games/view-series.html」のテンプレート

それは厄介です。どうすれば再構築できますか?私は2つのアイデアを持っていました:

  • 含むメインフォルダ:appdef、indexes、main.py?

    • コードのサブフォルダー。これは私の最初のパッケージである必要がありますか?
    • テンプレートのサブフォルダー。フォルダ階層はパッケージ階層と一致します
    • css、images、jsなどの個々のサブフォルダー。
  • appdef、indexes、main.pyを含むメインフォルダ?

    • コード+テンプレートのサブフォルダー。このように、テンプレートのすぐ隣にハンドラークラスがあります。この段階では、多くの機能を追加しているため、一方を変更すると、もう一方を変更することになります。繰り返しますが、このフォルダー名をクラスの最初のパッケージ名にする必要がありますか?フォルダを「src」にしたいのですが、クラスを「src.WhateverPage」にしたくありません。

ベストプラクティスはありますか?Django 1.0が間近に迫っていますが、公式のGAEテンプレートエンジンになったときに、Django 1.0と統合する能力を向上させるために今できることはありますか?私は単にこれらのことを試してみて、どちらが良いように見えるかを確認しますが、pyDevのリファクタリングサポートはパッケージの動きをうまく処理できないようです。したがって、これらすべてを再び機能させるのは簡単な作業ではないでしょう。

4

6 に答える 6

104

まず、「Python、Django、およびGoogleAppEngineを使用した迅速な開発」をご覧になることをお勧めします。

GvRは、スライドプレゼンテーションの10ページに一般的/標準的なプロジェクトレイアウトについて説明しています。

ここでは、そのページからレイアウト/構造のわずかに変更されたバージョンを投稿します。私はほとんどこのパターンに従います。また、パッケージに問題があるとのことでした。各サブフォルダに__init__。pyファイルがあることを確認してください。空でも大丈夫です。

ボイラープレートファイル

  • これらはプロジェクト間でほとんど変わりません
  • app.yaml:すべての非静的リクエストをmain.pyに送信します
  • main.py:アプリを初期化し、すべてのリクエストを送信します

プロジェクトのレイアウト

  • static / *:静的ファイル; AppEngineによって直接提供されます
  • 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 /:静的ファイル; AppEngineによって直接提供されます
    • js/*。js
    • images/*。gif|png | jpg
    • css/*。css
  • myapp /:アプリの構造
    • モデル/*.py
    • ビュー/*.py
    • tests/*。py
    • テンプレート/*.html:テンプレート
于 2008-09-16T08:10:50.747 に答える
17

私の通常のレイアウトは次のようになります。

  • app.yaml
  • index.yaml
  • request.py - 基本的な WSGI アプリが含まれています
  • ライブラリ
    • __init__.py- リクエスト ハンドラの基本クラスを含む共通機能
  • controllers - すべてのハンドラーが含まれています。request.yaml はこれらをインポートします。
  • テンプレート
    • コントローラーによって使用されるすべての django テンプレート
  • モデル
    • すべてのデータストア モデル クラス
  • 静的
    • 静的ファイル (css、画像など)。app.yaml によって /static にマップされます

明確でない場合は、app.yaml、request.py、lib/init.py、およびサンプル コントローラーがどのように見えるかの例を提供できます

于 2008-09-30T16:30:58.893 に答える
11

I implemented a google app engine boilerplate today and checked it on github. This is along the lines described by Nick Johnson above (who used to work for Google).

Follow this link gae-boilerplate

于 2012-09-21T17:07:02.227 に答える
7

最初のオプションがベスト プラクティスと見なされると思います。そして、code フォルダーを最初のパッケージにします。Guido van Rossum によって開発された Rietveld プロジェクトは、学ぶのに非常に優れたモデルです。それを見てください:http://code.google.com/p/rietveld

Django 1.0 に関しては、django ポートに組み込まれている GAE の代わりに、Django トランク コードの使用を開始することをお勧めします。繰り返しますが、Rietveld でどのように行われるかを見てください。

于 2008-09-15T22:11:12.310 に答える
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/

ここに例があります。

于 2010-06-23T20:30:50.180 に答える
1

コードレイアウトに関しては、最新のベストプラクティスなどについて完全に最新ではありませんが、最初のGAEアプリケーションを実行したときは、コードとテンプレートが隣り合っている2番目のオプションに沿って何かを使用しました。

これには2つの理由がありました。1つはコードとテンプレートを近くに保持したこと、もう1つはディレクトリ構造のレイアウトをWebサイトのレイアウトに似せたことです。これにより、(私にとっては)すべてがどこにあるかを覚えやすくなりました。

于 2008-09-07T14:25:20.330 に答える