Web2py-quick-guide
Web2py-はじめに
*web2py* は、データベース駆動型Webアプリケーションを含むアジャイル開発用の無料のオープンソースWebフレームワークとして定義されています。 Pythonで記述され、Pythonでプログラム可能です。 これはフルスタックフレームワークです。必要なすべてのコンポーネントで構成されているため、開発者は完全に機能するWebアプリケーションを構築する必要があります。
*web2py* フレームワークは、従来のパターンとは異なり、Webアプリケーションを実行する *Model-View-Controller* パターンに従います。
- *モデル*は、データのロジックを含むアプリケーションの一部です。 モデル内のオブジェクトは、データベースからデータを取得および保存するために使用されます。
- View はアプリケーションの一部であり、データの表示をエンドユーザーに表示するのに役立ちます。 データの表示はモデルから取得されます。
- Controller は、ユーザーの操作を処理するアプリケーションの一部です。 コントローラーは、ビューからデータを読み取り、ユーザー入力を制御し、特定のモデルに入力データを送信できます。
- web2py には、Cookieとセッションを管理する機能が組み込まれています。 (SQLに関して)トランザクションをコミットした後、セッションも同時に保存されます。
- web2py には、特定のアクションの完了後、スケジュールされた間隔でタスクを実行する能力があります。 これは CRON で実現できます。
web2py –ワークフロー
以下のワークフロー図をご覧ください。
ワークフロー図を以下に説明します。
- Models 、 Views 、および Controller コンポーネントは、ユーザーweb2pyアプリケーションを構成します。
- web2pyの同じインスタンスで複数のアプリケーションをホストできます。
- ブラウザはHTTPリクエストをサーバーに送信し、サーバーは Model 、 Controller および View と対話して必要な出力を取得します。
- 矢印は、データベースエンジンとの通信を表します。 データベースクエリは生のSQLまたはweb2py Database Abstraction Layer(これ以降の章で説明します)を使用して記述できるため、 web2py アプリケーションコードはデータベースエンジンに依存しません。
- Model は、データベースとのデータベース接続を確立し、 Controller と対話します。 一方、 Controller は View と対話して、データの表示をレンダリングします。
- Dispatcher は、HTTP応答で指定された要求されたURLをコントローラーの関数呼び出しにマップします。 関数の出力は、文字列またはハッシュテーブルです。
- データは View によってレンダリングされます。 ユーザーがHTMLページを要求すると(デフォルト)、データはHTMLページにレンダリングされます。 ユーザーがXMLで同じページを要求すると、web2pyはXMLで辞書をレンダリングできるビューを見つけようとします。
- web2pyのサポートされているプロトコルには、HTML、XML、JSON、RSS、CSV、およびRTFが含まれます。
モデルビューコントローラ
web2pyの model-view-controller 表現は次のとおりです-
モデル
"db.py" is the model:
db = DAL('sqlite://storage.sqlite')
db.define_table(employee, Field('name'), Field(‘phone’))
モデル*には、アプリケーションデータのロジックが含まれています。 上の図で説明したように、データベースに接続します。 SQLiteが使用されており、従業員として定義されたテーブルとともに *storage.sqlite ファイルに保存されていると考えてください。 テーブルが存在しない場合、web2pyはそれぞれのテーブルを作成することで役立ちます。
コントローラ
プログラム "default.py" は Controller です。
def employees():
grid = SQLFORM.grid(db.contact, user_signature = False)
return locals()
*web2py* では、URLマッピングは関数とモジュールへのアクセスに役立ちます。 上記の例では、コントローラーには従業員と呼ばれる単一の機能(または「アクション」)が含まれています。
*Controller* が実行するアクションは、文字列またはPython辞書を返します。これは、変数のローカルセットを含むキーと値の組み合わせです。
View
*"default/contactsl"* は *View* です。
{{extend 'layoutl'}}
<h1>Manage My Employees</h1>
{{=grid}}
特定の例では、 View は、関連するコントローラー関数が実行された後の出力を表示します。
この*表示*の目的は、HTMLの形式である辞書の変数をレンダリングすることです。 View ファイルはHTMLで記述されていますが、 \ {\ {および}} 区切り記号を使用してPythonコードを埋め込みます。
HTMLに埋め込まれたコードは、辞書のPythonコードで構成されています。
web2pyから始める
*web2py* は、Windows、UNIX、Mac OS Xなどのすべての主要なオペレーティングシステム用のバイナリパッケージで提供されます。
web2pyをインストールするのは簡単です。なぜなら-
- Pythonインタープリターで構成されているため、プリインストールする必要はありません。 すべてのオペレーティングシステムで実行されるソースコードバージョンもあります。
- 次のリンクは、ユーザーのニーズに応じてダウンロードできる web2py のバイナリパッケージで構成されています-http://www.web2py.com/init/default/download[www.web2py.com]
- web2py フレームワークは、他のフレームワークとは異なり、事前インストールを必要としません。 ユーザーは、オペレーティングシステムの要件に従って、zipファイルをダウンロードして解凍する必要があります。
- web2py フレームワークはPythonで記述されています。Pythonは、実行にコンパイルや複雑なインストールを必要としない完全な動的言語です。
- Javaや.netなどの他のプログラミング言語と同様に仮想マシンを使用し、開発者が作成したソースコードを透過的にバイトコンパイルできます。
Operating System | Command |
---|---|
Unix and Linux (source distribution) | python web2py.py |
OS X (binary distribution) | open web2py.app |
Windows (binary web2py distribution) | web2py.exe |
Windows (source web2py distribution) | c:/Python27/python.exe web2py.py |
Web2py-Python言語
Pythonは、オブジェクト指向言語と対話型言語の組み合わせとして定義できます。 オープンソースソフトウェアです。 Guido van Rossumは1980年代後半にpythonを考案しました。
PythonはPERL(Practical Extraction and Reporting Language)に似た言語であり、その明確な構文と読みやすさから人気を得ています。
Pythonの主な注目すべき機能は次のとおりです-
- Pythonは比較的簡単に学習でき、移植性があると言われています。 そのステートメントは、UNIXベースのシステム、 Mac OS 、 MS-DOS 、 OS/2 、およびWindowsのさまざまなバージョンを含む多くのオペレーティングシステムで簡単に解釈できます。
- Pythonはすべての主要なオペレーティングシステムで移植可能です。 わかりやすい構文を使用して、ユーザーフレンドリーなプログラムを作成します。
- 多くのタスクをサポートする大規模な標準ライブラリが付属しています。
上記の図から、Pythonはスクリプト言語とプログラミング言語の組み合わせであることがはっきりとわかります。 スクリプト言語のような別のプログラム内で解釈されます。
Pythonのバージョン
Pythonには、CPython、Jython、IronPythonと呼ばれる3つの製品品質の実装があります。 これらは、Pythonのバージョンとも呼ばれます。
- Classic Python a.k.a CPython はコンパイラー、インタープリターであり、標準C言語で実装される組み込みおよびオプションの拡張モジュールで構成されます。
- Jython は、Java仮想マシン(JVM)のPython実装です。
- IronPython はMicrosoftによって設計されており、Common Language Runtime(CLR)が含まれています。 一般に.NETとして知られています
起動
オペレーティングシステムの基本的なPythonプログラムは、ヘッダーから始まります。 プログラムは .py 拡張子で保存され、プログラムの実行にはPythonコマンドが使用されます。
たとえば、 python_rstprogram.py は必要な出力を提供します。 また、存在する場合はエラーを生成します。
Pythonはインデントを使用してコードブロックを区切ります。 ブロックはコロンで終わる行で始まり、次の行と同様またはそれ以上のインデントを持つ同様の方法ですべての行に続きます。
# Basic program in Python
print "Welcome to Python!\n"
プログラムの出力は次のようになります-
Welcome to Python!
インデント
Pythonでは、プログラムのインデントは非常に重要です。 Pythonの初心者である開発者に対するPythonのインデントルールには、いくつかの偏見と神話があります。
すべてのプログラマーの経験則は次のとおりです-
'_「ホワイトスペースはPythonソースコードで重要です。」_
Pythonの論理行の先頭にスペースとタブを含む先頭の空白は、行のインデントレベルを計算します。
Note
- インデントレベルは、ステートメントのグループ化も決定します。
- 4つのスペースを使用するのが一般的です。 インデントの各レベルのタブ。
- タブとスペースを混在させないでください。混乱を招く可能性があります。
また、インデントが不足している場合、Pythonはコンパイル時エラーを生成します。
IndentationError: expected an indented block
制御フローステートメント
Pythonプログラムの制御フローは、条件ステートメント、ループ、および関数呼び出しによって規制されています。
- If ステートメントは、elseおよびelif(else-ifの組み合わせ)とともに、指定された条件下でコードのブロックを実行します。
- For ステートメントは、オブジェクトを反復処理し、各要素をローカル変数にキャプチャして、添付ブロックで使用します。
- While ステートメントは、 True の条件下でコードのブロックを実行します。
- With ステートメントは、コンテキストマネージャー内のコードブロックを囲みます。 try/finally ステートメントのより読みやすい代替として追加されました。
# If statement in Python
x = int(raw_input("Please enter an integer: ")) #Taking input from the user
if x<0:
print "1 - Got a negative expression value"
print x
else:
print "1 - Got a positive expression value"
print x
print "Good bye!"
出力
sh-4.3$ python main.py
Please enter an integer: 4
1 - Got a positive expression value
4
Good bye!
関数
典型的なPythonプログラムのステートメントは、*「関数」*と呼ばれる特定の形式で編成およびグループ化されます。 関数は、要求に基づいてアクションを実行するステートメントのグループです。 Pythonは多くの組み込み関数を提供し、プログラマーが独自の関数を定義できるようにします。
Pythonでは、関数はプログラミング言語の他のオブジェクトと同様に処理される値です。
*def* ステートメントは、関数を定義する最も一般的な方法です。 *def* は、次の構文を持つ単一節の複合文です-
def function-name (parameters):statement(s)
次の例は、ジェネレーター関数を示しています。 同様の方法でオブジェクトを作成する反復可能なオブジェクトとして使用できます。
def demo ():
for i in range(5):
yield (i*i)
for j in demo():
print j
出力
sh-4.3$ python main.py
0
1
4
9
16
特別な属性、メソッド、および演算子
クラスの二重アンダースコアで始まる属性、メソッド、および演算子は、通常、動作がプライベートです。 それらのいくつかは、特別な意味を含む予約キーワードです。
それらの3つは以下にリストされています-
- len
- getitem
- setitem
他の特別な演算子には、getattrおよびsetattrが含まれます。これらは、クラスの get および set 属性を定義します。
ファイルI/O関数
Pythonには、特定のファイルを開いたり閉じたりする機能が含まれています。 これは、* open()、 write()、および close()*関数を使用して実現できます。
ファイルの入出力に役立つコマンドは次のとおりです-
Sr.No | Command & Functionality |
---|---|
1 |
open() ファイルまたはドキュメントを開くのに役立ちます |
2 |
write() ファイルまたはドキュメントに文字列を書き込むのに役立ちます |
3 |
read() 既存のファイルのコンテンツを読み取るのに役立ちます |
4 |
close() このメソッドは、ファイルオブジェクトを閉じます。 |
例
- 「demo.txt」*という名前のファイルを考えてみましょう。このファイルには、「This is a demo file」というテキストが既に存在します。
#!/usr/bin/python
# Open a file
fo = open("demo.txt", "wb")
fo.write( "Insering new line \n");
# Close opend file
fo.close()
ファイルを開いた後に利用可能な文字列は次のようになります-
This is a demo file
Inserting a new line
Web2py-フレームワークの概要
web2pyは、開発者がWebアプリケーションを完全に開発するために使用できるフルスタックWebフレームワークです。 プログラムを設計するためのSQLデータベース統合とマルチスレッドWebサーバーが含まれています。
ユーザーのプログラムを設計するためのWebインターフェイス
オペレーティングシステムごとにコマンドが実行されると、web2pyはスタートアップウィンドウを表示し、ユーザーに選択を求めるGUIウィジェットを表示します-
- ワンタイム管理者パスワード、
- Webサーバーに使用されるネットワークインターフェイスのIPアドレス、
- リクエストを処理するポート番号。
管理者には、新しいWebアプリケーションを追加および編集するためのすべての権限が含まれています。
デフォルトでは、web2pyはWebサーバーを 127.0.0.1:8000 (localhostのポート8000)で実行しますが、ユーザーは要件に従って任意の使用可能なIPアドレスとポートで実行できます。
以下に示すように、web2py GUIウィジェットが表示されます。
パスワードは、新しいモジュールの変更のために管理インターフェースで使用されます。
ユーザーが管理パスワードを設定した後、web2pyは次のURLを持つページでWebブラウザを起動します- http://127.0.0.1:8000/
以下に示すように、フレームワークのウェルカムページが表示されます。
web2pyで基本プログラムを設計する
上記のURLを使用してweb2pyアプリケーションを起動すると、管理インターフェイスを使用して、新しいモジュール(*“ helloWorld” *など)を作成できます。
管理者は新しいWebアプリケーションを追加および編集するためのすべての権限を保持しているため、管理インターフェイスは認証目的でパスワードを要求します。
上記のスナップショットには、インストールされているすべてのweb2pyアプリケーションがリストされ、管理者がそれらを管理できるページの詳細が含まれています。 デフォルトでは、web2pyフレームワークには3つのアプリケーションが付属しています。 彼らは-
- ユーザーが現在実装している admin アプリケーション。
- オンラインのインタラクティブなドキュメントとweb2py公式ウェブサイトのインスタンスを含む examples アプリケーション。
- ようこそ*アプリケーション。 他のweb2pyアプリケーション用の基本テンプレートが含まれています。 *scaffolding application としても知られています。 このアプリケーションは、スタートアップのユーザーも歓迎します。
新しいアプリケーションの名前を*“ helloWorld” *にします。
新しいアプリケーションが作成されると、ユーザーはそれぞれのアプリケーションのビュー、モデル、コントローラーで構成されるページにリダイレクトされます。
ユーザーは、次のURLに言及することにより、新しく作成されたアプリケーションを見ることができます- http://127.0.0.1:8000/helloWorld
デフォルトでは、ユーザーは上記のURLにアクセスすると次の画面を表示できます。
指定されたWebアプリケーション*「helloWorld」のメッセージを印刷するために、 *default.py コントローラーで変更が行われます。
“ index” *という名前の関数は、値を返し、必要な出力を表示するためのデフォルトの関数です。 上記のように、文字列「Hello World-最初のWebアプリケーションへようこそ」*が戻り値として使用され、出力が画面に表示されます。
出力は次のように表示されます-
ポストバック
フォームの入力を検証するメカニズムは非常に一般的であり、このような優れたプログラミング手法とは見なされません。 入力は毎回検証されますが、これは検証の負担となります。
web2pyのより良いパターンは、フォームを生成する同じアクションにフォームを送信することです。 このメカニズムは、web2pyの主な機能である「ポストバック」*と呼ばれます。 要するに、自己投稿は*ポストバック*で達成されます。
def first():
if request.vars.visitor_name: #if visitor name exists
session.visitor_name = request.vars.visitor_name
redirect(URL('second'))#postback is implemented
return dict()
CRUDアプリケーション
web2pyには、作成、取得、更新、削除の機能を実行するアプリケーションが含まれています。 CRUD サイクルは、永続的なデータベースの要素機能を記述します。
すべてのアプリケーションロジックはモデルで記述され、コントローラーによって取得され、ビューの助けを借りてユーザーに表示されます。
appadmin
PHPの場合、アプリケーションサーバーには、 phpmyadmin の下にすべてのデータベースのリストが含まれます。 同様に、web2pyは、テーブルまたはデータベースを管理、作成、削除するためのインターフェースを提供します。これは*「appadmin」*と呼ばれます
テーブルの背後にあるロジックを実装する前に、データベースとその関連テーブルを作成する必要があります。
*appadmin* にアクセスするためのURL-
*http://127.0.0.1:8000/applicationname/appadmin*
URLを押すと、ユーザーは特定のアプリケーションに関連付けられたテーブルのリストを取得します。
このインターフェースは、公開されることを意図していません。 データベースに簡単にアクセスできるように設計されています。 これは、2つのファイル、つまりコントローラ*「appadmin.py」とビュー「appadminl」*で構成されます。
一度に最大100件のレコードをページ分割できます。 *「appadmin」*の使用法については、以降の章で説明します。
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* の作成とその出力については、次の章で説明します。
Web2py-ビュー
web2pyフレームワークは、アプリケーションで Models 、 Controllers および Views を使用します。 適切なPythonの使用に課される制限なしに、より読みやすいコードのために Views にわずかに変更されたPython構文が含まれています。
web2py View の主な目的は、PythonコードをHTMLドキュメントに埋め込むことです。 ただし、次のようないくつかの問題に直面しています-
- HTMLドキュメントに埋め込まれたpythonコードのエスケープ。
- Pythonに基づいたインデントに従うと、HTMLルールに影響する場合があります。
問題を回避するために、web2pyはビューセクションで区切り文字\ {\ {..}}を使用します。 区切り文字は、埋め込まれたpythonコードのエスケープに役立ちます。 また、インデントのHTMLルールに従うのに役立ちます。
*\ {\ {..}}* 区切り文字に含まれるコードには、意図しないPythonコードが含まれています。 Pythonは通常インデントを使用してコードブロックを区切るため、デリミター内の意図しないコードは適切な方法で維持する必要があります。 この問題を克服するために、web2pyは*“ pass” *キーワードを使用します。
行で始まるコードブロックはコロンで終わり、パスで始まる行で終わります。
注意-パスはPythonのキーワードであり、web2pyのキーワードではありません。
次のコードは、パスキーワードの実装を示しています-
{{
if num > 0:
response.write('positive number')
else:
response.write('negative number')
pass
}}
HTMLヘルパー
web2pyには、プログラムでHTMLを構築するために使用できるヘルパークラスが含まれています。 「HTMLヘルパー」と呼ばれるHTMLタグに対応します。
たとえば-
[(A('Home', _href = URL('default', 'home')), False, None, []), ...]
ここで、 A はHTMLのアンカー <a> タグに対応するヘルパーです。 HTMLアンカー <a> タグをプログラムで構築します。
HTMLヘルパーは、 positional 引数と named 引数の2つのタイプで構成されています。
- Positional 引数は、HTMLの開始タグと終了タグの間に含まれるオブジェクトとして解釈されます。
- *名前付き*引数はアンダースコアで始まり、HTMLタグとして解釈されます。
ヘルパーは、 _ str_ およびxmlメソッドを使用した文字列のシリアル化にも役立ちます。 たとえば-
>>> print str(DIV(“hello world”))
出力
<div> hello world </div>
注-HTMLヘルパーは、ドキュメントオブジェクトモデル(DOM)のサーバー側の表現を提供します。
XMLヘルパー
XMLは、エスケープしないテキストをカプセル化するオブジェクトと呼ばれます。 テキストには有効なXMLが含まれている場合と含まれていない場合があります。
たとえば、下記のコードの場合、JavaScriptを含めることができます。
>>> print XML('<script>alert("unsafe!")</script>')
出力
<script> alert(“unsafe!”)</script>
組み込みヘルパー
web2pyでは多くの組み込みヘルパーが使用されています。 HTML組み込みヘルパーの一部を以下にリストします。
Name | Usage | Example |
---|---|---|
A | This helper is used to build links. It corresponds to the anchor tag |
|
B | This helper helps in making the contents of the text, bold. |
|
BODY | This helper makes the body of a page. It also includes a multiplication operator to increase the number of breaks. |
|
CODE | It performs syntax highlighting for Python, C, CPLUSPLUS and web2py code. This helper also has the ability to link an API documentation. |
|
FIELDSET | It creates an input field together with its label. |
|
HEAD | It helps in tagging <head> tag of an HTML page. |
|
IMG | It helps in embedding images for the given HTML page. |
|
カスタムヘルパー
これらのヘルパーは、要件に従ってタグをカスタマイズするために使用されます。 web2pyは次のカスタムヘルパーを使用します-
TAG
web2pyはTAGをユニバーサルタグジェネレーターとして使用します。 カスタマイズされたXMLタグの生成に役立ちます。 一般的な構文は次のとおりです-
{{ = TAG.name('a', 'b', _c = 'd')}}
次のようにXMLコードを生成します。<name c = "d"> ab </name>
TAGはオブジェクトであり、 `+ TAG.name `または ` TAG ['name'] +`は一時的なヘルパークラスを返す関数です。
MENU
このヘルパーは、リスト項目またはメニュー項目の値のリストを作成し、メニューを表すツリーのような構造を生成します。 メニュー項目のリストは、 response.menu の形式です。 たとえば-
print MENU([[One', False, 'link1'], ['Two', False, 'link2']])
出力は次のように表示されます-
<ul class = "web2py-menu web2py-menu-vertical">
<li><a href = "link1">One</a></li>
<li><a href = "link2">Two</a></li>
</ul>
美しい
リストや辞書を含む複合オブジェクトの表現を構築するのに役立ちます。 例えば、
{{ = BEAUTIFY({"a": ["hello", XML("world")], "b": (1, 2)})}}
XMLにシリアル化可能なXMLオブジェクトを、コンストラクター引数の表現とともに返します。 この場合、表現は次のようになります-
{"a": ["hello", XML("world")], "b": (1, 2)}
出力は次のようにレンダリングされます-
<table>
<tr>
<td>a</td>
<td>:</td>
<td>hello<br/>world</td>
</tr>
<tr>
<td>b</td>
<td>:</td>
<td>1<br/>2</td>
</tr>
</table>
サーバー側のDOMレンダリング
サーバー側のレンダリングにより、ユーザーはweb2pyコンポーネントの初期状態を事前にレンダリングできます。 派生ヘルパーはすべて、サーバー側でDOMをレンダリングするための検索要素を提供します。
*element* は、指定された条件に一致する最初の子要素を返します。 一方、 *elements* は、一致するすべての子のリストを返します。 両方とも同じ構文を使用します。
これは、次の例で実証することができます-
a = DIV(DIV(DIV('a', _id = 'target',_class = 'abc')))
d = a.elements('div#target')
d[0][0] = 'changed'
print a
出力は次のように与えられます-
<div><div><div id = "target" class = "abc">changed</div></div></div>
ページレイアウト
ビューは、出力をエンドユーザーに表示するために使用されます。 他のビューも含めるだけでなく、拡張することもできます。 これにより、ツリーのような構造が実装されます。
例-「indexl」*は「layoutl」に拡張され、これには「menul」を含めることができ、次に「 headerl」*を含めることができます。
{{extend 'layoutl'}}
<h1>Hello World</h1>
{{include 'pagel'}}
例
前の章では、会社モジュール用のモデルとコントローラーを作成しました。 次に、データの表示のレンダリングに役立つビューの作成に焦点を当てます。
デフォルトでは、web2pyのビューには layoutl と indexl が含まれ、データを表示するセクション全体を定義します。
{{extend 'layoutl'}}
<h2>Companies</h2>
<table>
{{for company in companies:}}
<tr>
<td>{{ = A(company.name, _href = URL('contacts', args = company.id))}}</td>
<td>{{ = A('edit', _href = URL('company_edit', args = company.id))}}</td>
</tr>
{{pass}}
<tr>
<td>{{ = A('add company', _href = URL('company_create'))}}</td>
</tr>
</table>
出力は次のようになります-
Web2py-データベース抽象化レイヤー
- データベースアブストラクションレイヤー(DAL)*はweb2pyの主要な強みと考えられています。 DALは、基になるSQL構文に単純なアプリケーションプログラミングインターフェイス(API)を公開します。
この章では、タグで効率的に検索するクエリの構築や、階層的なカテゴリツリーの構築など、DALの重要なアプリケーションについて学びます。
DALの重要な機能は次のとおりです-
- web2pyには、PythonオブジェクトをデータベースオブジェクトにマッピングするAPIであるDatabase Abstraction Layer(DAL)が含まれています。 データベースオブジェクトには、クエリ、テーブル、およびレコードを使用できます。
- DALは、データベースバックエンドに指定された方言を使用して、リアルタイムでSQLを動的に生成するため、開発者が完全なSQLクエリを記述することは必須ではありません。
- DALを使用する主な利点は、アプリケーションがさまざまな種類のデータベースと移植できることです。
DALの使用開始
web2pyのほとんどのアプリケーションはデータベース接続を必要とします。 したがって、データベースモデルの構築は、アプリケーション設計の最初のステップです。
“ helloWorld” *という名前の新しく作成されたアプリケーションを検討してください。 データベースは、アプリケーションのモデルの下に実装されます。 それぞれのアプリケーションのすべてのモデルは、- models/db_custom.py。*という名前のファイルに含まれています。
次の手順は、DALの実装に使用されます-
ステップ1-DALコンストラクター
データベース接続を確立します。 これは、DALコンストラクターとも呼ばれるDALオブジェクトを使用して作成されます。
db = DAL ('sqlite://storage.sqlite')
DALの注目すべき機能は、異なる種類のデータベースであっても、同じデータベースまたは異なるデータベースとの複数の接続を許可することです。 この行は既にファイル models/db.py にあることが確認されています。 したがって、削除するか、別のデータベースに接続する必要がない限り、必要ない場合があります。 デフォルトでは、web2pyは storage.sqlite ファイルに保存されているSQLiteデータベースに接続します。
このファイルは、アプリケーションのデータベースフォルダーにあります。 ファイルが存在しない場合、アプリケーションが最初に実行されたときにweb2pyによって作成されます。
SQLiteは高速で、すべてのデータを1つのファイルに保存します。 これは、あるアプリケーションから別のアプリケーションにデータを簡単に転送できることを意味します。 実際、SQLiteデータベースはweb2pyによってアプリケーションと一緒にパッケージ化されています。 翻訳、結合、集計などの完全なSQLサポートを提供します。
SQLiteには2つの欠点があります。
- 1つは、列タイプを強制しないことであり、列の追加と削除を除いてALTER TABLEはありません。
- 他の欠点は、書き込みアクセスを必要とするトランザクションによってデータベース全体がロックされることです。
ステップ2-テーブルコンストラクター
データベースとの接続が確立されると、 define_table メソッドを使用して新しいテーブルを定義できます。
たとえば-
db.define_table('invoice',Field('name'))
上記のメソッドは、テーブルコンストラクターでも使用されます。 テーブルコンストラクターの構文は同じです。 最初の引数はテーブル名であり、その後に* Field(s)*のリストが続きます。 フィールドコンストラクタは、次の引数を取ります-
Sr.No | Arguments & Usage |
---|---|
1 |
The field name テーブル内のフィールドの名前。 |
2 |
The field type 文字列(デフォルト)、テキスト、ブール、整数などのデータ型のいずれかを持つ値を取ります。 |
3 |
Length 最大長を定義します。 |
4 |
default = None これは、新しいレコードが挿入されるときのデフォルト値です。 |
5 |
update = None これはデフォルトと同様に機能しますが、値は更新時にのみ使用され、挿入時には使用されません。 |
6 |
Notnull これは、フィールド値がNULLになるかどうかを指定します。 |
7 |
readable = True これは、フィールドがフォームで読み取り可能かどうかを指定します。 |
8 |
writable = True これは、フィールドがフォームで書き込み可能かどうかを指定します。 |
9 |
label = "Field Name" これは、フォームのこのフィールドに使用されるラベルです。 |
*define_table* メソッドも3つの名前付き引数を取ります-
構文
db.define_table('....',migrate=True, fake_migrate=False, format = '%(id)s')
- migrate = True -これはweb2pyにテーブルが存在しない場合は作成し、モデル定義と一致しない場合は変更するよう指示します。
- fake_migrate = False -モデルがデータベーステーブルの内容と一致する場合、fake_migrate = Trueを設定すると、web2pyがデータを再構築するのに役立ちます。
- format = '%(id)s' -これは、指定されたテーブルのレコードの表示方法を決定するフォーマット文字列です。
生SQLの生成
DALを使用すると、データベースへの接続を確立し、テーブルコンストラクターとフィールドコンストラクターを使用して新しいテーブルとそのフィールドを作成できます。
場合によっては、必要な出力に適合するようにSQLステートメントを生成する必要があります。 web2pyには、以下のように生のSQLを生成するのに役立つさまざまな機能が含まれています-
_インサート
特定のテーブルの挿入ステートメントをフェッチするのに役立ちます。 例えば、
print db.person._insert(name ='ABC')
「person」という名前のテーブルの挿入ステートメントを取得します。
SQLステートメントの出力-
INSERT INTO person(name) VALUES ('ABC');
_カウント
レコードの数を示すSQLステートメントのフェッチに役立ちます。 たとえば、「person」という名前のテーブルを考えてみましょう。「ABC」という名前の人の数を見つける必要があります。
print db(db.person.name ==' ABC ')._count()
SQLステートメントの出力-
SELECT count(*) FROM person WHERE person.name = ' ABC ';
_select
選択SQLステートメントの取得に役立ちます。 たとえば、「person」という名前のテーブルを考えてみましょう。「ABC」という名前の人物のリストを見つける必要があります。
print db(db.person.name == ' ABC ')._select()
SQLステートメントの出力-
SELECT person.name FROM person WHERE person.name = ' ABC ';
_delete
*delete SQL* ステートメントの取得に役立ちます。 たとえば、「person」という名前のテーブルについて検討し、「ABC」という名前のステートメントを削除する必要があるとします
print db(db.person.name == ' ABC ')._delete()
SQLステートメントの出力-
DELETE FROM person WHERE person.name = ' ABC ';4
_更新
更新されたSQLステートメントの取得に役立ちます。 たとえば、「person」という名前のテーブルを検討し、列名を他の値で更新する必要があります。
print db(db.person.name == ' ABC ')._update()
SQLステートメントの出力-
UPDATE person SET WHERE person.name = ’Alex’;
DALの問題(Gotchas)
SQLite
SQLiteには、列のドロップまたは変更のサポートがありません。 テーブルからフィールドを削除すると、データベース内でそのフィールドがアクティブのままになります。これにより、web2pyは加えられた変更を認識しなくなります。
この場合、 fake_migrate = True を設定する必要があります。これは、変更や削除などの変更がweb2pyの知識の下で保持されるように、メタデータを再定義するのに役立ちます。
SQLiteはブール型をサポートしていません。 このため、web2pyは内部的にブール値を1文字の文字列にマッピングし、「T」と「F」はそれぞれ true と False を表します。
MySQL
MySQLはALTER TABLE機能をサポートしていません。 したがって、データベースの移行には複数のコミットが含まれます。 この状況は、すべてのメタデータを保持するデータベースの定義中にパラメーター fake_migrate = True を設定することで回避できます。
オラクル
Oracleは、レコードのページネーション機能をサポートしていません。 また、キーワードOFFSETまたはlimitのサポートがありません。 このために、web2pyはDALの複雑な3ウェイネスト選択の助けを借りてページネーションを実現します。 Oracleデータベースが使用されている場合、DALはページネーションを単独で処理する必要があります。
Web2py-フォームとバリデーター
web2pyには、フォーム生成のための強力な機能が付属しています。 web2pyでフォームを構築する4つの異なる方法は次のとおりです-
- FORM -HTMLヘルパーに関しては、低レベルの実装と見なされます。 FORMオブジェクトは、そのフィールドの内容を認識しています。
- SQLFORM -既存のデータベースに対して、作成、更新、削除の機能を提供します。
- SQLFORM.factory -SQLFORMに類似したフォームを生成するSQLFORMの最上位の抽象化レイヤーと見なされます。 ここでは、新しいデータベースを作成する必要はありません。
- * CRUDメソッド*-名前が示すように、SQLFORMに基づいた同様の機能を持つCreate、Retrieve、Update、Delete機能を提供します。
FORM
ユーザーからの入力を受け入れ、応答を送信するための「送信」ボタンを備えたアプリケーションを考えます。
コントローラ
「default.py」コントローラには、次の関連関数が含まれます
def display_form():
return dict()
View
関連するビュー「default/display_forml」は、HTMLでのフォームの表示を次のようにレンダリングします-
{{extend 'layoutl'}}
<h2>Basic Form</h2>
<form enctype = "multipart/form-data" action = "{{= URL()}}" method = "post">
Your name:
<input name = "name"/>
<input type = "submit"/>
</form>
<h2>Submitted variables</h2>
{{= BEAUTIFY(request.vars)}}
上記の例は、ユーザー入力を要求する通常のHTMLフォームです。 FORMオブジェクトのようなヘルパーを使用して、同じフォームを生成できます。
コントローラ
def display_form():
form = FORM('Value:', INPUT(_value = 'name'), INPUT(_type = 'submit'))
return dict(form = form)
「default.py」コントローラーの上記の関数には、フォームの作成に役立つFORMオブジェクト(HTMLヘルパー)が含まれています。
View
{{extend 'layoutl'}}
<h2>Basic form</h2>
{{= form}}
<h2>Submitted variables</h2>
{{= BEAUTIFY(request.vars)}}
ステートメント \ {\ {= form}} によって生成されるフォームは、FORMオブジェクトをシリアル化します。 ユーザーがフォームに入力して送信ボタンをクリックすると、フォームが自己送信し、変数 request.vars.value とその入力値が下部に表示されます。
SQLFORM
既存のデータベースへのフォームの作成に役立ちます。 その実装手順を以下に説明します。
DALを使用してデータベースとの接続を確立します。これは、DALコンストラクターとも呼ばれるDALオブジェクトを使用して作成されます。 接続を確立した後、ユーザーはそれぞれのテーブルを作成できます。
db = DAL('sqlite://storage.sqlite')
db.define_table('employee', Field('name', requires = IS_NOT_EMPTY()))
したがって、「employee」という名前のテーブルを作成しました。 コントローラは、次のステートメントでフォームとボタンを構築します-
form = SQLFORM(
db.mytable,
record = mytable_index,
deletable = True,
submit_button = T('Update')
)
したがって、作成された従業員テーブルの場合、コントローラの変更は次のようになります-
def display_form():
form = SQLFORM(db.person)
*View* には変更はありません。 新しいコントローラーでは、テーブルdb.employeeから構築されたSQLFORMコンストラクターがモデルで定義されているため、FORMを構築する必要があります。 新しいフォームは、シリアル化されると、次のように表示されます-
<form enctype = "multipart/form-data" action = "" method = "post">
<table>
<tr id = "employee_name__row">
<td>
<label id = "person_name__label" for = "person_name">Your name: </label>
</td>
<td>
<input type = "text" class = "string" name = "name" value = "" id = "employee_name"/>
</td>
<td></td>
</tr>
<tr id = "submit_record__row">
<td></td>
<td><input value = "Submit" type = "submit"/></td>
<td></td>
</tr>
</table>
<input value = "9038845529" type = "hidden" name = "_formkey"/>
<input value = "employee" type = "hidden" name = "_formname"/>
</form>
フォーム内のすべてのタグには、テーブル名とフィールド名から派生した名前があります。
*SQLFORM* オブジェクトは、アップロードされたファイルを「アップロード」フォルダーに保存することにより、「アップロード」フィールドも処理します。 これは自動的に行われます。 SQLFORMは、 *"textareas"* を使用して、チェックボックスおよびテキスト値の形式で「ブール」値を表示します。
SQLFORMはプロセスメソッドも使用します。これは、ユーザーが関連するSQLFORMで値を保持する場合に必要です。
- form.process(keepvalues = True)*の場合、受け入れられます。
例
def display_form():
form = SQLFORM(db.employee)
if form.process().accepted:
response.flash = 'form accepted'
elif form.errors:
response.flash = 'form has errors'
else:
response.flash = 'please fill out the form'
return dict(form = form)
SQLFORM.factory
場合によっては、ユーザーは、データベースを実装せずに既存のデータベーステーブルがあるようにフォームを生成する必要があります。 ユーザーは、単にSQLFORM機能を利用したいだけです。
これは form.factory を介して行われ、セッションで維持されます。
def form_from_factory():
form = SQLFORM.factory(
Field('your_name', requires = IS_NOT_EMPTY()),
Field('your_image', 'upload'))
if form.process().accepted:
response.flash = 'form accepted'
session.your_name = form.vars.your_name
session.your_image = form.vars.your_image
elif form.errors:
response.flash = 'form has errors'
return dict(form = form)
フォームはSQLFORMのように表示され、フィールドとして名前と画像が表示されますが、データベースにはそのような既存のテーブルはありません。
「default/form_from_factoryl」ビューは次のように表されます-
{{extend 'layoutl'}}
{{= form}}
CRUDメソッド
*CRUD* は、SQLFORMの上で使用されるAPIです。 名前が示すように、適切なフォームの作成、取得、更新、削除に使用されます。
CRUDは、web2pyの他のAPIと比較して、公開されていません。したがって、インポートする必要があります。
from gluon.tools import Crud
crud = Crud(db)
上記で定義されたCRUDオブジェクトは、次のAPIを提供します-
Sr.No | API & Functionality |
---|---|
1 |
crud.tables() データベースで定義されているテーブルのリストを返します。 |
2 |
crud.create(db.tablename)
|
3 |
crud.read(db.tablename, id)
|
4 |
crud.delete(db.tablename, id) レコードを削除します |
5 |
crud.select(db.tablename, query) テーブルから選択されたレコードのリストを返します。 |
6 |
crud.search(db.tablename) フォームが検索フォームであるタプル(フォーム、レコード)を返します。 |
7 |
crud() request.args()に基づいて上記のいずれかを返します。 |
フォームの作成
フォームを作成しましょう。 以下のコードに従ってください。
モデル
アプリケーションの models フォルダーの下に新しいモデルが作成されます。 ファイルの名前は*“ dynamic_search.py” *になります。
def build_query(field, op, value):
if op == 'equals':
return field == value
elif op == 'not equal':
return field != value
elif op == 'greater than':
return field > value
elif op == 'less than':
return field < value
elif op == 'starts with':
return field.startswith(value)
elif op == 'ends with':
return field.endswith(value)
elif op == 'contains':
return field.contains(value)
def dynamic_search(table):
tbl = TABLE()
selected = []
ops = ['equals',
'not equal',
'greater than',
'less than',
'starts with',
'ends with',
'contains']
query = table.id > 0
for field in table.fields:
chkval = request.vars.get('chk'+field,None)
txtval = request.vars.get('txt'+field,None)
opval = request.vars.get('op'+field,None)
row = TR(TD(INPUT(_type = "checkbox",_name = "chk"+field,value = chkval == 'on')),
TD(field),TD(SELECT(ops,_name = "op"+field,value = opval)),
TD(INPUT(_type = "text",_name = "txt"+field,_value = txtval)))
tbl.append(row)
if chkval:
if txtval:
query &= build_query(table[field], opval,txtval)
selected.append(table[field])
form = FORM(tbl,INPUT(_type="submit"))
results = db(query).select(*selected)
return form, results
コントローラ
関連付けられたファイル、すなわち*「dynamic_search.py」*のコントローラセクションには、次のコードが含まれます-
def index():
form,results = dynamic_search(db.things)
return dict(form = form,results = results)
View
次のビューでこれをレンダリングできます。
{{extend 'layoutl'}}
{{= form}}
{{= results}}
ここにそれがどのように見えるかです-
Web2py-メールとSMS
web2pyには、ユーザーに電子メールとSMSを送信する機能が含まれています。 ライブラリを使用して、電子メールとSMSを送信します。
メールを設定する
組み込みクラス、つまり gluon.tools.Mail クラスは、web2pyフレームワークでメールを送信するために使用されます。 メーラーはこのクラスで定義できます。
from gluon.tools import Mail
mail = Mail()
mail.settings.server = 'smtp.example.com:25'
mail.settings.sender = '[email protected]'
mail.settings.login = 'username:password'
上記の例で説明した送信者の電子メールとパスワードは、電子メールが送信されるたびに認証されます。
ユーザーが何らかのデバッグ目的で実験または使用する必要がある場合、これは次のコードを使用して実現できます。
mail.settings.server = 'logging'
これで、すべてのメールは送信されませんが、コンソールに記録されます。
メールを送る
メールオブジェクトを使用してメールの構成設定を設定すると、多くのユーザーにメールを送信できます。
- mail.send()*の完全な構文は次のとおりです-
send(
to, subject = 'Abc',
message = 'None', attachments = [],
cc = [], bcc = [], reply_to = [],
sender = None, encoding = 'utf-8',
raw = True, headers = {}
)
- mail.send()*の実装を以下に示します。
mail.send(
to = ['[email protected]'], subject = 'hello',
reply_to = '[email protected]',
message = 'Hello ! How are you?'
)
*Mail* は、メールがエンドユーザーによって受信されるというメールサーバーの応答に基づいてブール式を返します。 ユーザーへのメール送信に成功した場合は *True* を返します。
to、 cc 、および bcc の属性には、メールの送信が意図されている有効なメールアドレスのリストが含まれます。
SMSを送信する
SMSメッセージを送信するための実装は、web2pyフレームワークで電子メールを送信する場合とは異なります。これは、メッセージを受信者に中継できるサードパーティのサービスが必要になるためです。 サードパーティのサービスは無料のサービスではなく、地理的な地域(国によって)によって明らかに異なります。
web2pyは、次のプロセスでSMSを送信するのに役立つモジュールを使用します-
from gluon.contrib.sms_utils
import SMSCODES, sms_email
email = sms_email('1 (111) 111-1111','T-Mobile USA (abc)')
mail.send(to = email, subject = 'test', message = 'test')
上記の例では、 SMSCODES はweb2pyが管理する辞書で、主要な電話会社の名前を電子メールアドレスの接尾辞にマッピングします。
電話会社は通常、サードパーティのサービスから送信された電子メールをスパムとして扱います。 より良い方法は、電話会社自身がSMSを中継することです。 すべての電話会社には、ストレージ内のすべての携帯電話番号に固有の電子メールアドレスが含まれており、SMSを直接電子メールに送信できます。
上記の例では、
- sms_email 関数は電話番号(文字列として)を受け取り、電話の電子メールアドレスを返します。
- scaffoldingアプリにはいくつかのファイルが含まれています。 それらの1つはmodels/db.pyで、4つをインポートします。
- gluon.tools のクラスにはメールライブラリも含まれ、さまざまなグローバルオブジェクトを定義します。
- scaffoldingアプリケーションは、 db.auth_user などのauthオブジェクトに必要なテーブルも定義します。 デフォルトの足場アプリケーションは、ファイル数を最小限に抑えるように設計されており、モジュール式ではありません。 特に、モデルファイル db.py には、実稼働環境では個別のファイルに保存するのが最適な構成が含まれています。
ここでは、構成ファイルを作成することをお勧めします-
from gluon.storage import Storage
settings = Storage()
settings.production = False
if
settings.production:
settings.db_uri = 'sqlite://production.sqlite'
settings.migrate = False
else:
settings.db_uri = 'sqlite://development.sqlite'
settings.migrate = True
settings.title = request.
settings.subtitle = 'write something here'
settings.author = 'you'
settings.author_email = '[email protected]'
settings.keywords = ''
settings.description = ''
settings.layout_theme = 'Default'
settings.security_key = 'a098c897-724b-4e05-b2d8-8ee993385ae6'
settings.email_server = 'localhost'
settings.email_sender = '[email protected]'
settings.email_login = ''
settings.login_method = 'local'
settings.login_config = ''
Web2py-アクセス制御
認証
ほとんどすべてのアプリケーションは、ユーザーを認証し、権限を設定できる必要があります。 web2pyには、広範囲でカスタマイズ可能なロールベースのアクセス制御 mechanism.web2py が付属しています。 また、CAS、OpenID、OAuth 1.0、LDAP、PAM、X509などのプロトコルもサポートしています。
web2pyには、ロールベースのアクセス制御メカニズム(RBAC)として知られるメカニズムが含まれています。これは、承認されたユーザーへのシステムアクセスを制限するアプローチです。 RBACを実装するweb2pyクラスはAuthと呼ばれます。
以下のスキーマを見てください。
- 認証*は、次の表を定義します-
Sr.No | Table Name & Description |
---|---|
1 |
auth_user ユーザーの名前、メールアドレス、パスワード、ステータスを保存します。 |
2 |
auth_group ユーザーのグループまたはロールを多対多の構造で保存します |
3 |
auth_membership リンクのユーザーとグループの情報を多対多の構造で保存します |
4 |
auth_permission テーブルはグループと権限をリンクします。 |
5 |
auth_event 他のテーブルの変更と成功したアクセスを記録します |
6 |
auth_cas 中央認証サービスに使用されます |
認証のカスタマイズ
Authをカスタマイズするには2つの方法があります。
カスタム db.auth_user テーブルを最初から定義するには。
web2pyに auth テーブルを定義させます。
*auth* テーブルを定義する最後の方法を見てみましょう。 *db.py* モデルでは、次の行を置き換えます-
auth.define_tables()
次のコードに置き換えます-
auth.settings.extra_fields['auth_user'] = [
Field('phone_number',requires = IS_MATCH('\d{3}\-\d{3}\-\d{4}')),
Field('address','text')
]
auth.define_tables(username = True)
各ユーザーは電話番号、ユーザー名、住所で構成されていると仮定しています。
*auth.settings.extra_fields* は追加フィールドの辞書です。 キーは、追加フィールドを追加する認証テーブルの名前です。 値は追加フィールドのリストです。 ここで、 *phone_numberとaddress* の2つの追加フィールドを追加しました。
*username* は、通常は電子メールフィールドに基づいている認証プロセスに関係しているため、特別な方法で処理する必要があります。 ユーザー名引数を次の行に渡すと、web2pyにユーザー名フィールドが必要であることが通知され、メールフィールドの代わりにログインに使用するようになります。 主キーのように機能します。
auth.define_tables(username = True)
ユーザー名は一意の値として扱われます。 通常の登録フォーム以外で登録が行われる場合があります。 また、新しいユーザーがログインを強制されて登録を完了することもあります。
これは、デフォルトで False に設定され、プロファイルを更新するときに True に設定されるダミーフィールド complete_registration を使用して実行できます。
auth.settings.extra_fields['auth_user'] = [
Field('phone_number',requires = IS_MATCH('\d{3}\-\d{3}\-\d{4}'),
comment = "i.e. 123-123-1234"),
Field('address','text'),
Field('complete_registration',default = False,update = True,
writable = False, readable = False)
]
auth.define_tables(username = True)
このシナリオでは、ログイン時に新しいユーザーが登録を完了することを意図している場合があります。
*db.py* では、modelsフォルダに、次のコードを追加できます-
if auth.user and not auth.user.complete_registration:
if not (request.controller,request.function) == ('default','user'):
redirect(URL('default','user/profile'))
これにより、新しいユーザーが要件に従ってプロファイルを編集するように強制されます。
承認
これは、ユーザーに何らかのアクセスを許可したり、何かの許可を与えるプロセスです。
web2pyでは、新しいユーザーが作成または登録されると、そのユーザーを含む新しいグループが作成されます。 新しいユーザーの役割は、通常「「user_ [id]」」と呼ばれます。ここで、idはユーザーの一意のIDです。
新しいグループの作成のデフォルト値は-
auth.settings.create_user_groups = "user_%(id)s"
ユーザー間のグループの作成は、次の方法で無効にできます-
auth.settings.create_user_groups = None
作成、特定のメンバーへのアクセス許可、および許可は、appadminを使用してプログラムで実現することもできます。
実装のいくつかは次のようにリストされています-
Sr.No | Command & Usage |
---|---|
1 |
auth.add_group('role', 'description') 新しく作成されたグループのIDを返します。 |
2 |
auth.del_group(group_id) 指定されたIDを持つグループを削除します |
3 |
auth.del_group(auth.id_group('user_7')) 指定されたIDのユーザーグループを削除します。 |
4 |
auth.user_group(user_id) 指定されたユーザーに一意に関連付けられたグループのidの値を返します。 |
5 |
auth.add_membership(group_id, user_id) 指定されたgroup_idのuser_idの値を返します |
6 |
auth.del_membership(group_id, user_id) 指定されたmember_idのアクセスを取り消します。 指定されたグループのuser_id。 |
7 |
auth.has_membership(group_id, user_id, role) user_idが指定されたグループに属しているかどうかを確認します。 |
中央認証サービス(CAS)
web2pyは業界標準、つまりクライアント認証サービス–クライアントとサーバーの両方に組み込まれたweb2pyのCASを提供します。 これはサードパーティの認証ツールです。
これは、分散認証用のオープンプロトコルです。 CASの動作は次のとおりです-
- ユーザーがWebサイトにアクセスすると、プロトコルはユーザーが認証されているかどうかを確認します。
- ユーザーがアプリケーションに対して認証されていない場合、プロトコルはユーザーがアプリケーションに登録またはログインできるページにリダイレクトします。
- 登録が完了すると、ユーザーは電子メールを受け取ります。 登録は、ユーザーが電子メールを確認するまで完了しません。
- 登録に成功すると、ユーザーはキーで認証され、CASアプライアンスで使用されます。
- このキーは、バックグラウンドで設定されるHTTP要求を介してユーザーの資格情報を取得するために使用されます。
Web2py-サービス
web2pyは、XML、JSON、RSS、CSV、XMLRPC、JSONRPC、AMFRPC、SOAPなどのさまざまなプロトコルのサポートを提供します。 それらのプロトコルのそれぞれは、複数の方法でサポートされており、私たちは区別します-
- 関数の出力を特定の形式でレンダリングします。
- リモートプロシージャコール。
辞書のレンダリング
セッションのカウントを維持する次のコードを検討してください。
def count():
session.counter = (session.counter or 0) + 1
return dict(counter = session.counter, now = request.now)
上記の関数は、ユーザーがページにアクセスしたときのカウント数を増やします。 与えられた関数がweb2pyアプリケーションの*“ default.py” コントローラーで定義されていると仮定します。 ページは次のURLでリクエストできます- *http://127.0.0.1:8000/app/default/count
web2pyは、上記のページをさまざまなプロトコルで、URLに拡張子を追加することでレンダリングできます-
*http://127.0.0.1:8000/app/default/countl*
*http://127.0.0.1:8000/app/default/count.xml*
*http://127.0.0.1:8000/app/default/count.json*
上記のアクションによって返される辞書は、HTML、XML、およびJSONでレンダリングされます。
リモートプロシージャコール
web2pyフレームワークは、関数をWebサービスに変換するメカニズムを提供します。 ここで説明するメカニズムは、前述のメカニズムとは異なります。
- 関数に引数を含める。
- 関数はモデルで定義する必要があります。
- より厳密なURL命名規則が適用されます。
- プロトコルの固定セットで機能し、簡単に拡張可能です。
- この機能を使用するには、サービスオブジェクトをインポートして開始する必要があります。
このメカニズムを実装するには、最初に、サービスオブジェクトをインポートしてインスタンス化する必要があります。
from gluon.tools import Service
service = Service()
これは、scaffoldingアプリケーションの "db.py" モデルファイルに実装されています。 Db.py モデルはweb2pyフレームワークのデフォルトモデルであり、データベースとコントローラーと対話して、ユーザーへの望ましい出力を実現します。
実装後、必要に応じて、モデルのサービスにコントローラーからアクセスできます。
次の例は、Webサービスなどを使用したリモートプロシージャコールのさまざまな実装を示しています。
ウェブサービス
Webサービスは、XML、SOAP、WSDL、UDDIなどのプロトコルを使用してWebベースのアプリケーションを統合する標準化された方法として定義できます。
web2pyはそれらのほとんどをサポートしていますが、統合は非常に難しいでしょう。
jQueryでweb2py JSONサービスを使用する
JSONフォームweb2pyを返す方法は多数ありますが、ここではJSONサービスの場合を考えます。 たとえば-
def consumer():return dict()@service.json
def get_days():return ["Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat"]
def call():return service()
ここでは、それを観察します-
- 関数は、空の辞書を返すだけでビューをレンダリングし、サービスを消費します。
- get_days はサービスを定義し、関数呼び出しはすべての登録済みサービスを公開します。
- get_days はコントローラーにある必要はなく、モデルに含めることができます。
- call は常にdefault.py scaffoldコントローラーにあります。
消費者の行動とビューは次のとおりです-
{{extend 'layoutl'}}
<div id = "target"></div>
<script>
jQuery.getJSON("{{= URL('call',args = ['json','get_days'])}}",
function(msg){
jQuery.each(msg, function(){ jQuery("#target").
append(this + "<br/>"); } )
}
);
</script>
*jQuery.getJSON* の最初の引数は、次のサービスのURLです- *http://127.0.0.1:8000/app/default/call/json/get_days*
これは常にパターンに従います-
http://<domain>/<app>/<controller>/call/<type>/<service>
URLはサーバー側で解決されるため、 \ {\ {…}} の間にありますが、他のすべてはクライアント側で実行されます。 jQuery.getJSON の2番目の引数はコールバックで、JSON応答が渡されます。
この場合、コールバックは応答の各アイテム(文字列としての曜日のリスト)をループし、各文字列を <br/> が <div id = "target"> に追加します。
このように、web2pyは jQuery.getJSON を使用してWebサービスの実装を管理します。
Web2py-Ajaxエフェクトの追加
この章では、 jQuery プラグインと web2py の統合の例を説明します。 これらのプラグインは、フォームとテーブルをよりインタラクティブで使いやすいものにし、アプリケーションの使いやすさを向上させるのに役立ちます。
特に、学習します
- インタラクティブな追加オプションボタンを使用して複数選択のドロップダウンを改善する方法、
- 入力フィールドをスライダーで置き換える方法、および
- jqGrid および WebGrid を使用して表形式データを表示する方法。
web2pyはサーバー側の開発コンポーネントですが、 welcome scaffoldingアプリにはベースの jQuery ライブラリが含まれています。 このscaffolding web2pyアプリケーション「ようこそ」には、 views/web2py_ajaxl というファイルが含まれています。
ビューの内容は次のとおりです-
<script type = "text/javascript"><!--
//These variables are used by the web2py_ajax_init function in web2py_ajax.js
(which is loaded below).
var w2p_ajax_confirm_message = "{{= T('Are you sure you want to delete this object?')}}";
var w2p_ajax_disable_with_message = "{{= T('Working...')}}";
var w2p_ajax_date_format = "{{= T('%Y-%m-%d')}}";
var w2p_ajax_datetime_format = "{{= T('%Y-%m-%d %H:%M:%S')}}";
var ajax_error_500 = '{{=T.M('An error occured, please [[reload %s]] the page') %
URL(args = request.args, vars = request.get_vars) }}'
//--></script>
{{
response.files.insert(0,URL('static','js/jquery.js'))
response.files.insert(1,URL('static','css/calendar.css'))
response.files.insert(2,URL('static','js/calendar.js'))
response.files.insert(3,URL('static','js/web2py.js'))
response.include_meta()
response.include_files()
}}
このファイルは、JavaScriptの実装とAJAX実装で構成されています。 web2pyは、PrototypeやExtJSなどの他のAJAXライブラリを使用できないようにします。これは、このようなライブラリを実装する方が簡単であることが常に観察されるためです。
JQueryエフェクト
*<select multiple = "true"> .. </select>* のデフォルトのレンダリングは、特に連続していないオプションを選択する必要がある場合、あまり直感的ではないと見なされます。 これはHTMLの欠点とは言えませんが、ほとんどのブラウザーの設計が貧弱です。 JavaScriptを使用して、複数選択の表示を上書きできます。 これは、 *jquery.multiselect.js* というjQueryプラグインを使用して実装できます。
このため、ユーザーは jquery.muliselect.js を* http://abeautifulsite.net/2008/04/jquery-multiselect*からダウンロードし、対応するファイルを static/js/jquery.multiselectに配置する必要があります。 js および static/css/jquery.multiselect.css 。
例
次のコードは、対応するビューの \ {\ {extend ‘layoutl’}} の前に追加する必要があります
{{
response.files.append('https://ajax.googleapis.com/ajax\
/libs/jqueryui/1.8.9/jquery-ui.js')
response.files.append('https://ajax.googleapis.com/ajax\
/libs/jqueryui/1.8.9/themes/ui-darkness/jquery-ui.css')
response.files.append(URL('static','js/jquery.multiSelect.js'))
response.files.append(URL('static','css/jquery.\multiSelect.css'))
}}
*\ {\ {extend 'layoutl'}}* の後に以下を配置します-
<script>
jQuery(document).ready(function(){jQuery('[multiple]').multiSelect();});
</script>
これは、指定されたフォームの multiselect のスタイル設定に役立ちます
コントローラ
def index():
is_fruits = IS_IN_SET(['Apples','Oranges','Bananas','Kiwis','Lemons'], multiple = True)
form = SQLFORM.factory(Field('fruits','list:string', requires = is_fruits))
if form.accepts(request,session):response.flash = 'Yummy!'
return dict(form = form)
このアクションは、次のビューで試すことができます-
{{
response.files.append('https://ajax.googleapis.com/ajax\
/libs/jqueryui/1.8.9/jquery-ui.js')
response.files.append('https://ajax.googleapis.com/ajax\
/libs/jqueryui/1.8.9/themes/ui-darkness/jquery-ui.css')
response.files.append(URL('static','js/jquery.multiSelect.js'))
response.files.append(URL('static','css/jquery.\multiSelect.css'))
}}
{{extend 'layoutl}}
<script>
jQuery(document).ready(function(){jQuery('[multiple]'). multiSelect();});
</script>
{{= form}}
出力のスクリーンショットは次のとおりです-
便利なJqueryイベントのいくつかは、次の表に記載されています-
Sr.No. | Event & Usage |
---|---|
1 |
onchange 要素が変更されたときに実行される |
2 |
onsubmit フォームが送信されたときに実行される |
3 |
onselect 要素が選択されたときに実行される |
4 |
onblur 要素がフォーカスを失ったときに実行される |
5 |
onfocus 要素がフォーカスを取得したときに実行される |
JQueryおよびAjax-jqGrid
jqGridは、jQueryに基づいて構築されたAjax対応のJavaScriptコントロールであり、表形式のデータを表現および操作するためのソリューションを提供します。 jqGrid はクライアント側のソリューションであり、Ajaxコールバックを通じてデータを動的にロードするため、ページネーション、検索ポップアップ、インライン編集などが提供されます。
jqGridはPluginWikiに統合されていますが、ここでは、プラグインを使用しないweb2pyプログラムのスタンドアロンとして説明します。 jqGridは独自の本に値しますが、ここでは基本的な機能と最も単純な統合についてのみ説明します。
jqGridの構文は次のようになります-
def JQGRID(
table, fieldname = None,
fieldvalue = None, col_widths = [],
colnames = [], _id = None, fields = [],
col_width = 80, width = 700,
height = 300, dbname = 'db'
):
Web2py-コンポーネント
コンポーネントは、Webページの機能部分として定義され、自律的に動作します。 Webページに埋め込まれているモジュール、コントローラー、ビューで構成できます。 アプリケーションのコンポーネントはローカライズされたタグである必要があり、パフォーマンスはモジュールに依存しないと見なされます。
web2pyの主な焦点は、ページにロードされ、AJAX経由でコンポーネントコントローラーと通信するコンポーネントの使用です。
web2pyには LOAD 関数と呼ばれる関数が含まれており、明示的なJavaScriptまたはAJAXプログラミングなしでコンポーネントの実装を容易にします。
ファイル「 models/db_comments.py 」のカスタムモデルでweb2pyアプリケーションを拡張する単純なWebアプリケーション、すなわち「 test 」を考えてください。
db.define_table(
'comment_post', Field('body','text',
label = 'Your comment'),auth.signature
)
上記のコードは、適切なテーブル定義を持つテーブル「 comment_post 」を作成します。 アクションは、「 controllers/comments.py 」の関数の助けを借りて実装されます。
def post():
return dict(
form = SQLFORM(db.comment_post).process(),
comments = db(db.comment_post).select()
)
対応するビューは次のように表示されます-
{{extend 'layoutl'}}
{{for post in comments:}}
<div class = "post">
On {{= post.created_on}} {{= post.created_by.first_name}}
says <span class = "post_body">{{= post.body}}</span>
</div>
{{pass}}
{{= form}}
指定されたURLを使用してページにアクセスできます- http://127.0.0.1:8000/test/comments/post
上記の方法は、ビューにアクセスする従来の方法であり、LOAD関数の実装で変更できます。
これは、レイアウトを拡張しない拡張子 "。load" で新しいビューを作成することで実現できます。
作成される新しいビューは "views/comments/post.load" になります-
<div class = "post">
On {{= post.created_on}} {{= post.created_by.first_name}}
says <blockquote class = "post_body">{{= post.body}}</blockquote>
</div>
{{pass}}
{{= form}}
ページにアクセスするためのURLは- http://127.0.0.1:8000/test/comments/post.load になります。
LOADコンポーネントはweb2pyアプリケーションの他のページに埋め込むことができます。 これは、次のステートメントを使用して実行できます。
{{= LOAD('comments','post.load',ajax = True)}}
たとえば、 Controllers は次のように編集できます-
def index():
return dict()
- 表示*では、コンポーネントを追加できます-
{{extend 'layoutl'}}
{{= LOAD('comments','post.load',ajax = True)}}
このページにはURLでアクセスできます- http://127.0.0.1:8000/test/default/index
コンポーネントプラグイン
コンポーネントプラグインは、*コンポーネント*を一意に定義するプラグインです。 コンポーネントは、モデル定義を使用してデータベースに直接アクセスします。
前の例で述べたように、 comments_plugin へのコメントコンポーネントは、 Models セクションで実行できます-
「 models/plugin_comments.py 」-
db.define_table(
'plugin_comments_comment',
Field('body','text', label = 'Your comment'),
auth.signature
)
- コントローラ*には次のプラグインが含まれます-
def plugin_comments():
return LOAD('plugin_comments','post',ajax = True)
Web2py-デプロイメント
Ubuntuでのweb2pyのインストール(Linux)
次の手順は、Ubuntuデスクトップでweb2pyをインストールするために実装されています。
- ステップ1 *-web2pyをダウンロードする
cd/home
mkdir www-dev
cd www-dev
wget http://www.web2py.com/examples/static/web2py_src.zip
- ステップ2 *-ダウンロードが完了したら、解凍します。
unzip -x web2py_src.zip
- ステップ3 *-GUIにアクセスする必要がある場合、オプションでPythonのtkライブラリをインストールします。
sudo apt-get install python-tk
- ステップ4 *-web2pyを起動するには、web2pyディレクトリにアクセスしてweb2pyを実行します。
cd web2py
python web2py.py
GUIは次のように表示されます-
インストール後、実行するたびに、web2pyはパスワードの選択を求めてきます。 このパスワードは管理パスワードです。 パスワードを空白のままにすると、管理インターフェイスは無効になります。
サーバーが起動すると、web2pyは次のURLで画面にリダイレクトされます- http://127.0.0.1:8000/
これにより、web2pyはUbuntuデスクトップで完全に実行されていると結論付けられます。
Ubuntuでの運用展開
- ステップ1 *-web2pyの実行に必要なすべてのモジュールのインストール。
postgreSQLのインストール
sudo apt-get install postgresql
解凍してssh-serverを開きます
sudo apt-get install unzip
sudo apt-get install openssh-server
Apache 2およびmod-wsgiのインストール
sudo apt-get install apache2
sudo apt-get install libapache2-mod-wsgi
- ステップ2 *-/home/www-dataへのweb2pyのインストール
これは、運用環境での適切な展開に役立ちます。
sudo apt-get install unzip
sudo apt-get install openssh-server
cd/home
sudo mkdir www-data
cd www-data
web2pyサイトからweb2pyソースを入手してください-
sudo wget http://web2py.com/examples/static/web2py_src.zip
sudo unzip web2py_src.zip
sudo chown -R www-data:www-data web2py
- ステップ3 *-自己署名証明書を作成します。 SSL証明書は、信頼できる認証局から取得する必要があります。 証明書を含むSSLフォルダーを維持します。
- ステップ4 *-実稼働環境の要件に従ってApache構成を編集します。
- ステップ5 *-Apacheサーバーを再起動し、特定のIPアドレスで本番環境が機能するかどうかを確認します。
Windowsにweb2pyをインストールする
Windows環境(実行可能ファイルと標準ライブラリのパッケージ化)用のバイナリ配布がありますが、web2pyはオープンソースであり、通常のPythonインストールで使用できます。
この方法により、web2pyの最新リリースで作業し、使用するPythonモジュールをカスタマイズできます。
ステップ1 *-web2py公式ウェブサイトからソースパッケージをダウンロードします- http://www.web2py.com/examples/static/web2py_src.zip*を解凍します。
web2pyはインストールを必要としないため、ユーザーは任意のフォルダーでそれを解凍できます。
ステップ2 *-起動するには、 *web2py.py をダブルクリックします。 コンソールから-
cd c:\web2py
c:\python27\python.exe web2py.py
- ステップ3 *-ここで、コマンドラインパラメータを追加できます(管理パスワードを設定するには-a、代替ポートを指定するには-p)。 起動オプションは次の方法で表示されます-
C:\web2py>c:\python27\python.exe web2py.py --help
Note
- web2pyは、実行可能なコンパイルや複雑なインストールを必要としない、移植可能で解釈された動的言語であるPythonで書かれています。
- 仮想マシン(Javaや.Netなど)を使用し、スクリプトを実行するときに、ソースコードをその場で透過的にバイトコンパイルできます。
データベースおよびテスト用のweb2pyの機能
これは、web2pyモデルの作成を支援し、対応するコードを生成するSQLDesignerと呼ばれるソフトウェアです。 以下にスクリーンショットの一部を示します-
SQLDesignerは、テーブルの関係を簡単な方法で維持するのに役立ち、特定のアプリケーションのモデルに対応するコードを生成します。
機能テスト
機能テストには、コンポーネントまたはシステム全体の機能のテストが含まれます。 要件とビジネスプロセスに基づくことができます。
web2pyにはモジュール gluon.contrib.webclient が付属しており、リモートおよびローカルのweb2pyアプリケーションで機能テストを実行します。 基本的にweb2pyセッションとポストバックを理解するように設計されています。
必要なのは、特定のモジュールで機能テストが実装されるようにパッケージをインポートすることだけです。
パッケージをインポートするための構文は次のとおりです-
from gluon.contrib.webclient import WebClient
Web2py-セキュリティ
前の章では、さまざまなツールを使用したweb2pyの実装に関する完全な情報がありました。 web2pyアプリケーションの開発に関する主な懸念は、ユーザーの観点からのセキュリティです。
web2pyのユニークな機能は次のとおりです-
- ユーザーは簡単に実装を学習できます。 インストールや依存関係は必要ありません。
- ローンチ当日から安定しています。
- web2pyは軽量で、データ抽象化レイヤーとテンプレート言語のライブラリが含まれています。
- Webサーバーとアプリケーション間の通信として機能するWebサーバーゲートウェイインターフェイスの助けを借りて動作します。
Open Web Application Security Project(OWASP)は、Webアプリケーションのセキュリティ違反をリストするコミュニティです。
セキュリティ違反
OWASPに関して、Webアプリケーションに関連する問題とweb2pyがそれらをどのように克服するかを以下で説明します。
クロスサイドスクリプティング
XSSとも呼ばれます。 アプリケーションがユーザー提供のデータを取得し、コンテンツをエンコードまたは検証せずにユーザーのブラウザーに送信するたびに発生します。 攻撃者は、クロスサイドスクリプティングを使用してスクリプトを実行し、ワームとウイルスを注入します。
web2pyは、 View でレンダリングされたすべての変数を防止することにより、XSSの防止に役立ちます。
情報漏洩
時々、アプリケーションは内部の仕組み、プライバシー、構成に関する情報を漏らします。 攻撃者はこれを使用して機密データを侵害し、深刻な攻撃につながる可能性があります。
web2pyはチケットシステムによりこれを防ぎます。 すべてのエラーを記録し、エラーが登録されているユーザーにチケットが発行されます。 これらのエラーは、管理者のみがアクセスできます。
壊れた認証
多くの場合、アカウントの資格情報は保護されていません。 攻撃者は、パスワード、認証トークンを侵害して、ユーザーの身元を盗みます。
web2pyは、管理インターフェースのメカニズムを提供します。 また、クライアントが「localhost」ではない場合、安全なセッションの使用を強制します。
安全でない通信
アプリケーションがネットワークトラフィックの暗号化に失敗する場合があります。 機密性の高い通信を保護するには、トラフィックを管理する必要があります。
web2pyはSSL対応の証明書を提供して、通信の暗号化を提供します。 これは、機密通信を維持するのにも役立ちます。
URLアクセスの制限
Webアプリケーションは通常、一部のユーザーへのリンクとURLの表示を防止することにより、機密機能を保護します。 攻撃者は、URLに何らかの情報を操作することにより、一部の機密データを侵害しようとすることができます。
wb2pyでは、URLは指定されたファイルではなくモジュールと機能にマップされます。 また、どの機能がパブリックであり、どの機能がプライベートとして維持されるかを指定するメカニズムも含まれています。 これは、問題の解決に役立ちます。