Web2py-core
Web2py-コア
コマンドラインオプション
前の章で、GUIウィジェットを使用してweb2pyサーバーを起動する方法を学びました。
このウィジェットは、*コマンドライン*プロンプトからサーバーを起動することでスキップできます。
python web2py.py -a 'your password' -i 127.0.0.1 -p 8000
web2pyサーバーが起動するたびに、ファイル「 parameters_8000.py 」が作成され、すべてのパスワードがハッシュ形式で保存されます。
追加のセキュリティ目的のために、次のコマンドラインを使用できます-
python web2py.py -a '<recycle>' -i 127.0.0.1 -p 8000
上記のシナリオでは、web2pyは「 parameters_8000.py 」に保存されているハッシュ化されたパスワードを再利用します。
ファイル「 parameters_8000.py 」が誤ってまたは他の何らかの理由で削除された場合、web2pyではWebベースの管理インターフェースが無効になります。
URLマッピング/ディスパッチ
web2pyの機能は、URLを特定の形式でマップするmodel-view-controllerに基づいています- http://127.0.0.1:8000/a/d/fl
コントローラ d.py で言及されている関数*“ f()” が“ a”という名前のアプリケーションの下にあるまでルーティングします。 コントローラーがアプリケーションに存在しない場合、web2pyは“ default.py” *という名前のデフォルトコントローラーを使用します。
URLで指定された関数が存在しない場合、* init()*と呼ばれるデフォルトの関数が使用されます。 URLの動作は、下の画像に模式的に示されています。
拡張子 l は、URLではオプションです。 拡張機能は、コントローラで定義された関数の出力をレンダリングする View の拡張機能を決定します。 同じコンテンツが、html、xml、json、rssなどの複数の形式で提供されます。
関数に基づいてリクエストが渡され、関数は引数を受け入れ、適切な出力をユーザーに提供します。 これはコントローラーであり、ユーザーのニーズに応じて出力を提供するために、アプリケーションのモデルおよびビューと対話します。
web2py –ワークフロー
web2pyのワークフローは以下で説明されています-
- Webサーバーは、独自のスレッドですべてのHTTP要求を同時に管理します。
- HTTP要求ヘッダーが解析され、ディスパッチャーに渡されます。
- Dispatcherは、アプリケーション要求を管理し、関数呼び出しのURLに PATH_INFO をマップします。 すべての関数呼び出しはURLで表されます。
- 静的フォルダーに含まれるファイルに対するすべての要求は直接管理され、大きなファイルはクライアントにストリーミングされます。
- 静的ファイル以外のリクエストはアクションにマッピングされます。
- 要求ヘッダーにアプリのセッションCookieが含まれている場合、セッションオブジェクトが取得されます。または、セッションIDが作成されます。
- アクションが文字列として値を返す場合、これはクライアントに返されます。
- アクションが反復可能を返す場合、それはデータをループしてクライアントにストリーミングするために使用されます。
条件付きモデル
前の章で、 Controllers の機能を見ました。 web2pyは、各アプリケーションでモデル、ビュー、コントローラーを使用します。 したがって、*モデル*の機能を理解することも必要です。
他のMVCアプリケーションとは異なり、web2pyのモデルは条件付きとして扱われます。 サブフォルダー内のモデルは、コントローラーの使用状況に基づいて実行されます。 これは、次の例で実証することができます-
URLを検討します- http://127.0.0.1:8000/a/d/fl
この場合、 ’a’ はアプリケーションの名前、 ’d’ はコントローラーの名前、* f()*はコントローラーに関連付けられた関数です。 実行されるモデルのリストは次のとおりです-
applications/a/models/*.py
applications/a/models/d/*.py
applications/a/models/d/f/*.py
図書館
web2pyにはライブラリが含まれており、すべてのアプリケーションにオブジェクトとして公開されています。 これらのオブジェクトは、「gluon」という名前のディレクトリの下のコアファイル内で定義されます。
DALテンプレートのようなモジュールの多くは依存関係がなく、web2pyのフレームワークの外に実装できます。 また、グッドプラクティスと見なされる単体テストも維持します。
アプリケーション
web2pyアプリケーションを図形式で以下に示します。
web2pyで開発された*アプリケーション*は、次の部分で構成されています-
- モデル-データとデータベースのテーブルを表します。
- コントローラ-アプリケーションのロジックとワークフローを説明します。
- Views -データの表示のレンダリングを支援します。
- 言語-アプリケーション内の文字列をサポートされているさまざまな言語に翻訳する方法を説明します。
- 静的ファイル-処理を必要としません(例: 画像、CSSスタイルシートなど)。
- ABOUT および README -プロジェクトの詳細。
- エラー-アプリケーションによって生成されたエラーレポートを保存します。
- セッション-特定の各ユーザーに関連する情報を保存します。
- データベース-SQLiteデータベースと追加のテーブル情報を保存します。
- キャッシュ-キャッシュされたアプリケーション項目を保存します。
- モジュール-モジュールは他のオプションのPythonモジュールです。
- Private -含まれているファイルはコントローラーによってアクセスされますが、開発者から直接アクセスされません。
- アップロード-モデルはファイルにアクセスしますが、開発者が直接アクセスすることはできません。
API
web2pyでは、 models 、 controllers 、および views は、開発者向けに特定のオブジェクトがインポートされる環境で実行されます。
グローバルオブジェクト-リクエスト、レスポンス、セッション、キャッシュ。
ヘルパー-web2pyには、プログラムでHTMLを構築するために使用できるヘルパークラスが含まれています。 *「HTMLヘルパー」*と呼ばれるHTMLタグに対応します。
たとえば、A、B、FIELDSET、FORMなど。
セッション
セッションは、サーバー側の情報のストレージとして定義できます。これは、Webアプリケーション全体でのユーザーの対話全体にわたって保持されます。
web2pyのセッションはストレージクラスのインスタンスです。
たとえば、変数はセッションに次のように保存できます。
session.myvariable = "hello"
この値は次のように取得できます
a = session.myvariable
同じユーザーが同じセッションでコードを実行する限り、変数の値を取得できます。
セッションのためのweb2pyの重要な方法の1つは*「忘れる」*です-
session.forget(response);
セッションを保存しないようweb2pyに指示します。
バックグラウンドでタスクを実行する
HTTP要求がWebサーバーに到着し、Webサーバーが各要求を独自のスレッドで並行して処理します。 アクティブなタスクはフォアグラウンドで実行され、他のタスクはバックグラウンドで実行されます。 バックグラウンドタスクの管理もweb2pyの主要な機能の1つです。
時間のかかるタスクはバックグラウンドで保持することが望ましい。 バックグラウンドタスクを管理するメカニズムの一部を以下に示します-
- CRON
- キュー
- スケジューラー
CRON
web2pyでは、 CRON は指定された時間内にタスクを実行する機能を提供します。 各アプリケーションには、その機能を定義するCRONファイルが含まれています。
スケジューラー
組み込みのスケジューラは、優先度を設定することにより、バックグラウンドでタスクを実行するのに役立ちます。 タスクを作成、スケジュール、および変更するためのメカニズムを提供します。
スケジュールされたイベントは、ファイル名*“ scheduler.py” *でモデルにリストされます。
アプリケーションの構築
web2pyでモデルとコントローラーを作成する概要がありました。 ここでは、*“ Contacts” *という名前のアプリケーションの作成に焦点を当てます。 アプリケーションは、企業のリスト、およびそれらの企業で働く人々のリストを維持する必要があります。
モデルの作成
ここでは、データディクショナリのテーブルの識別がモデルです。 連絡先アプリケーションのモデルは、「 models 」フォルダーの下に作成されます。 ファイルは models/db_contacts.py に保存されます。
# in file: models/db_custom.py
db.define_table('company', Field('name', notnull = True, unique = True), format = '%(name)s')
db.define_table(
'contact',
Field('name', notnull = True),
Field('company', 'reference company'),
Field('picture', 'upload'),
Field('email', requires = IS_EMAIL()),
Field('phone_number', requires = IS_MATCH('[\d\-\(\) ]+')),
Field('address'),
format = '%(name)s'
)
db.define_table(
'log',
Field('body', 'text', notnull = True),
Field('posted_on', 'datetime'),
Field('contact', 'reference contact')
)
上記のファイルが作成されると、URL http://127.0.0.1:8000/contacts/appadmin を使用してテーブルにアクセスできます。
コントローラーの作成
*Controller* には、連絡先を一覧表示、編集、削除するためのいくつかの機能が含まれます。
# in file: controllers/default.py
def index():return locals()
def companies():companies = db(db.company).select(orderby = db.company.name)
return locals()
def contacts():company = db.company(request.args(0)) or redirect(URL('companies'))
contacts = db(db.contact.company == company.id).select(orderby = db.contact.name)
return locals()
@auth.requires_login()
def company_create():form = crud.create(db.company, next = 'companies')
return locals()
@auth.requires_login()
def company_edit():company = db.company(request.args(0)) or redirect(URL('companies'))
form = crud.update(db.company, company, next='companies')
return locals()
@auth.requires_login()
def contact_create():db.contact.company.default = request.args(0)
form = crud.create(db.contact, next = 'companies')
return locals()
@auth.requires_login()
def contact_edit():contact = db.contact(request.args(0)) or redirect(URL('companies'))
form = crud.update(db.contact, contact, next = 'companies')
return locals()
def user():return dict(form = auth())
*view* の作成とその出力については、次の章で説明します。