1. ホーム
  2. python

[解決済み] Google App Engineのプロジェクト構成

2022-09-16 03:47:16

質問

私は、Google App Engine がリリースされたときに、その技術と、長い間考えていたけれども着手できなかったペットプロジェクトに取り組むために、アプリケーションを開始しました。 その結果 BowlSK . しかし、それが成長し、機能が追加されるにつれて、物事を整理しておくことが本当に難しくなってきました - 主に、これが私の最初の python プロジェクトであり、作業を開始するまでそれについて何も知らなかったという事実のためです。

私が持っているもの

  • メインレベルには
    • すべての .py ファイル (パッケージを動作させる方法を知りませんでした)
    • メインレベルページのためのすべての .html テンプレート
  • サブディレクトリです。
    • css、images、jsなどの別フォルダ。
    • サブディレクトリ型 URL 用の .html テンプレートを格納するフォルダ



http://www.bowlsk.com/ は、HomePage (デフォルト・パッケージ) の "index.html" にあるテンプレートにマップされます。

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

これは厄介です。 どのように再構築すればよいのでしょうか。 2つのアイデアがありました。

  • メインフォルダの内容:appdef, indexes, main.py?

    • コード用のサブフォルダ。 これは私の最初のパッケージでなければなりませんか?
    • テンプレート用のサブフォルダー。 フォルダの階層はパッケージの階層と同じになるはずです。
    • css、画像、js などのための個別のサブフォルダー。
  • appdef、indexes、main.pyを含むメインフォルダ?

    • サブフォルダには、コードとテンプレートを格納します。 この段階では、私は多くの機能を追加しているので、一方への変更は他方への変更を意味するので、この方法で私はハンドラクラスをテンプレートのすぐ隣に持っています。 繰り返しになりますが、このフォルダ名は、クラスの最初のパッケージ名でなければならないのでしょうか? 私はフォルダを "src"にしたいのですが、私のクラスが "src.WhateverPage" にならないようにしたいのです。

ベストプラクティスはありますか? Django 1.0が目前に迫っていますが、GAE公式テンプレートエンジンになったときに統合する能力を向上させるために今できることはありますか? しかし、pyDevのリファクタリングサポートはパッケージの移動をあまりうまく扱わないようなので、これらすべてを再び動作させるのはおそらく非自明なタスクになるでしょう。

どのように解決するのですか?

まず、"をご覧いただくことをお勧めします。 Python、Django、Google App Engineによる迅速な開発 "をご覧ください。

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

ここでは、そのページのレイアウト/構造を少し修正したものを掲載します。私自身、ほとんどこのパターンに従っています。また、パッケージでトラブルがあったとのことですが、これはどうすればいいのでしょうか?各サブフォルダに __init__.py ファイルがあることを確認してください。それが空であっても大丈夫です。

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

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

プロジェクトレイアウト

  • static/*: 静的ファイル; App Engineから直接提供されます。
  • myapp/*.py: アプリ固有のPythonコード
    • views.py、models.py、tests.py、 __init__.py など。
  • templates/*.html: テンプレート(または 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/*.css
  • myapp/: アプリの構造
    • モデル/*.py
    • ビュー/*.py
    • テスト/*.py
    • templates/*.html: テンプレート