[解決済み] Google App Engineのプロジェクト構成
質問
私は、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: テンプレート
関連
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] __init__.py は何のためにあるのですか?
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] Pythonのswitch文の代用品?
-
[解決済み] Pythonで型をチェックする標準的な方法は何ですか?
-
[解決済み] Google App EngineとGoogle Compute Engineの違いは何ですか?
-
[解決済み】forループを使った辞書の反復処理
-
[解決済み] python-requests モジュールからのすべてのリクエストをログに記録します。
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] データクラスとtyping.NamedTupleの主な使用例
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] SQLAlchemy: セッションの作成と再利用
-
[解決済み] なぜ(0-6)は-6=偽なのか?重複
-
[解決済み] 文字列のリストを内容に基づいてフィルタリングする
-
[解決済み] python-requests モジュールからのすべてのリクエストをログに記録します。
-
[解決済み] 古いバージョンのPythonにおける辞書のキーの並び順
-
[解決済み] PyMongoで.sortを使用する
-
[解決済み] Jupyter (IPython)ノートブックのセッションをpickleして保存する方法
-
[解決済み] Pandasのデータフレーム内の文字列を'date'データ型に変換するにはどうしたらいいですか?
-
[解決済み] virtualenvsはどこに作成するのですか?
-
[解決済み] Pythonでリストが空かどうかをチェックする方法は?重複