このチュートリアルでは、PythonでPyramidフレームワークを使用する方法について学びます。PyramidはModel-View-Controller (MVC) アーキテクチャパターンを使用し、Web Server Gateway Interface (WSGI) をベースとしたオープンソースのWeb開発フレームワークです。Pyramidフレームワークは、Web開発をより便利にする便利なアドオンパッケージをたくさん持っています。PythonでのWeb開発で人気のある他の選択肢には、DjangoとFlaskがあります。
前提条件
このチュートリアルでは、HTMLの基本的な知識を持っている必要があります。もし、HTMLの経験がなくても、心配はいりません。このチュートリアルに沿って、Pyramidの動作を理解することはできますが、実際のWebアプリケーションを開発するためには、もう一度HTMLを学習する必要があります。
アーキテクチャ
コードを見る前に、まずWSGIとMVCを理解しましょう。
WSGIは基本的に、PythonベースのWebアプリケーションがサーバーと対話する方法を定義する標準です。サーバーにリクエストを送信し、サーバーからレスポンスを受信するプロセスを管理します。
モデルはアプリケーションのデータとビジネスロジックを含み、ビューはユーザーに関連情報を表示し、コントローラはモデルとビューの間のインタラクションを担当します。
Google Mapsは、MVCアーキテクチャの完璧な例です。Google Mapsの経路探索機能を使う場合、モデルにはA地点からB地点までの最短経路を見つけるアルゴリズムのコードが含まれ、ビューには経路がラベル付けされた地図を含む画面が表示され、コントローラにはモデルが見つけた最短経路を使用してビューを通してユーザーに表示するコードが含まれます。また、コントローラは、ビューから(ユーザーからの)リクエストを受け取り、それをモデルに転送してレスポンスを生成し、モデルからのレスポンスをビューを通じてユーザーに表示するコードと見ることもできます。
WSGIとMVCの他に、もう2つ知っておくべき用語があります。それは、「ルート」と「スクリプト」です。ルートは、Webサイトを異なるWebページに分割し、それぞれのWebページが異なる機能を実行することを可能にします。
Facebookを例にとって考えてみましょう。自分のメッセージを見たい場合は、そのための別のビューを持つ新しいウェブページが開かれ、自分のプロフィールを見たい場合は、そのための新しいウェブページが開かれますが、それらはすべてメインのウェブサイトとつながっているのです。それはルートを通じて行われます。ボタンやリンクをクリックするたびに、アプリケーション内のルートで指定された新しいウェブページにリダイレクトされます。
スクリプトについては、アプリケーションの構成設定を含むだけで、アプリケーションの管理を支援します。
これらの用語については、Pyramidを使って基本的なWebアプリケーションを作成するときに詳しく学びます。では、はじめましょう。
インストール
オンラインにデプロイされるウェブアプリケーションを開発するときは、常に最初に仮想環境を作成することが良い習慣とされています。仮想環境には、Web アプリを実行するために必要なすべてのライブラリやフレームワーク、その他すべての依存関係が含まれています。こうしておけば、アプリをサーバーにデプロイする際に、サーバーにこれらのライブラリをすべて再インストールするだけで、アプリをスムーズに動作させることができます。
では、先に仮想環境を作ってしまいましょう。ターミナルで以下のコマンドを実行し、仮想環境モジュールをインストールします。
$ pip install virtualenv
インストールが成功したかどうかを確認するために、以下のコマンドを実行します。
$ virtualenv --version
コンソールにバージョン番号が表示されたら、インストールは成功です(または virtualenv
がすでにシステムにインストールされています)。
仮想環境を作成するには、まず仮想環境を作成したいフォルダに移動し、以下のコマンドを実行します。
$ virtualenv myvenv
注:仮想環境の名前は自由につけることができます。ここでは、デモのために「myenv」を使用しています。
最後のステップは、仮想環境を有効にすることです。Macの場合、ターミナルで以下のコマンドを実行します。
$ source myvenv/bin/activate
Windowsマシンでは、以下のコマンドで環境を有効化できます。
'Installation folder'\myvenv\Scriptsctivate.bat
これで仮想環境が構築できたので、そこにPyramidをインストールしましょう。その際、パッケージマネージャのpipを使用します。
$ pip install pyramid
Note: アプリケーションでの作業が終わり、仮想環境を無効にしたい場合は、ターミナルで次のコマンドを実行してください。
$ deactivate
コーディング演習
このセクションでは、まずスケルトンアプリをコーディングして、Pyramid アプリがどのように構成され、どのように通信するのかを基本的なレベルで理解します。その後、複数のビューを持つアプリケーションを作成する方法を確認します。
Python Pyramidの簡単な例
# intro.py
# Import necessary functions to run our web app
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
# This function receives a request from the user, and returns a response
def intro(request):
return Response('Hi, My name is Junaid Khalid')
# This function will start a server on our computer (localhost), define the
# routes for our application, and also add a view to be shown to the user
def main():
with Configurator() as config:
config.add_route('intro', '/')
config.add_view(intro, route_name='intro')
application = config.make_wsgi_app()
# 8000 is the port number through which the requests of our app will be served
server = make_server('0.0.0.0', 8000, application)
server.serve_forever()
main()
Note: Configurator
モジュールは、特定のビューを特定のルートに接続するために使用されます。例えば、Facebookでは、”My Profile “ビューと “News Feed “ビューは異なるものであり、両者は異なるURLも持っています。これはまさにコンフィギュレータが行うことです。特定のURL/ルートを特定のビューに接続します。
次に make_server
メソッドを使用して、ポート番号を割り当てたローカルの HTTP サーバーでアプリケーションを実行します。
intro` 関数は、ユーザーから受け取ったリクエストを処理して、そのレスポンスをビューに返すために使用される。レスポンスを送信する前のリクエストの処理は、すべてこの関数の内部で行うことができます。
上記のアプリケーションをワークステーションで実行するには、ターミナルに移動して、先ほど作成した .py ファイルを実行します。
$ python3 intro.py
私の場合、ファイル名は intro.py ですが、あなたが決めた名前によって異なるかもしれません。
次に、PC上の任意のウェブブラウザを開き、次のアドレスにアクセスします。http://localhost:8000`。すると、「Hi, My name is Junaid Khalid」と美観を損ねるような書き方をしたウェブページが表示されるはずです。もっと見栄えをよくするために、HTMLコードもレスポンスとして返すことができます。簡単な例として、intro関数を編集してみましょう。
def intro(request):
return Response('<h2 style="text-align: center; font-family: verdana; color: blue;"Hi, My name is Junaid Khalid.</h2')
intro関数を上の関数に置き換えて、出力を見てみましょう。かなり良くなったでしょう?これはほんの一例です。もっともっと良くすることができます。
注意: コードを変更したとき、サーバーは自動的にそれを記録するわけではありません。変更を反映させるには、サーバーを停止して再起動する必要があります。これを行うには、サーバーが動作しているターミナルを開き、Control+C
を押してください、これでサーバーは終了します。これでサーバーが終了します。その後、通常通りサーバーを再起動すれば、変更を確認できます。
複数のビューを分離して表示する
このセクションでは、いくつかのビューを追加し、メインファイル(‘intro.py’ファイル)からビューを削除し、新しい別のファイル(‘all_views.py’)にまとめます。これはコードをモジュール化し、見た目をすっきりさせ、さらに新しいビューをより簡単に追加できるようにします。では、やってみましょう。
# all_views.py
# Import necessary functions to run our web app
from pyramid.compat import escape
from pyramid.response import Response
from pyramid.view import view_config
# view_config functions tells Pyramid which route's view is going to be defined in the function that follows
# the name of the function does not matter, you can name it whatever you like
@view_config(route_name='intro')
def home_page(request):
header = '<h2 style="text-align: center;"Home Page</h2'
body = '<br/<br/<p style="text-align: center; font-family: verdana; color: blue;"Hi, My name is Junaid Khalid.</p'
body += '<p style="text-align: center; font-family: verdana;" This is my portfolio website.</p'
footer = '<p style="text-align: center; font-family: verdana;"Checkout my <a href="/jobs"previous jobs</a.</p'
# In the 'a' tag, notice that the href contains '/jobs', this route will be defined in the intro.py file
# It is simply telling the view to navigate to that route, and run whatever code is in that view
return Response(header + body + footer)
@view_config(route_name='jobs')
def job_history(request):
header = '<h2 style="text-align: center;"Job History</h2'
job1 = '<p style="text-align: center; font-family: verdana;"Jr. Software Developer at XYZ</p'
return Response(header + job1)
注:初心者のレベルでは、上記の戦略に従ってHTMLコードを記述することができます。いずれは、Jinjaのようなテンプレートエンジンを使って、HTMLの生成をもっとシンプルにしたいと思うでしょう。
このアプリケーションはまだ実行されませんので、intro.py ファイルを編集する必要があります。
# intro.py
# Import necessary functions to run our web app
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
def main():
with Configurator() as config:
# In add_route function, the first parameter defines the name of the route
# and the second parameter defines the 'route' or the page location
config.add_route('intro', '/')
config.add_route('jobs', '/jobs')
# The scan function scans our project directory for a file named all_views.py
# and connects the routes we provided above with their relevant views
config.scan('all_views')
application = config.make_wsgi_app()
# The following lines of code configure and start a server which hosts our
# website locally (i.e. on our computer)
server = make_server('0.0.0.0', 8000, application)
server.serve_forever()
main()
見てわかるように、以前のビューのコードを削除しました。もしこれらのビューを1つのファイルで宣言していたら、ファイルはもっとごちゃごちゃした感じになっていたことでしょう。今はどちらのファイルもとてもきれいに見えますし、それぞれのファイルが一つの目的を果たすようになりました。それでは、私たちのウェブアプリが今どのように見えるか見てみましょう。
出力です。
上の画像で、私たちのホームページを見ることができます。これはルート ‘http://localhost:8000’ に位置しています。見た目はあまり美しくありませんが、チュートリアルの最初に述べたように、これは私たちの目的ではありません。もし、見た目を美しくしたいのであれば、HTMLのスタイル属性やCSSを使用して多くのスタイルを追加したり、Bootstrapのテンプレートを使用したりすることができます。
続けて、「前の仕事」というハイパーリンクも表示されています。これをクリックすると、別のルートを持つ新しいウェブページに移動します。次の画像で、その出力を見てみましょう。
出力です。
上の画像は私たちの Jobs ページです。これはルート http://localhost:8000/jobs
に位置しています。このルートは ‘intro.py’ ファイルで指定しました。例として、1つのジョブだけを追加してみました。
結論
PyramidはPythonベースのWeb開発フレームワークで、簡単にWebアプリケーションを構築することができます。このチュートリアルでは、仮想環境内にPyramidをインストールし、ローカルに作成したサーバー上で動作するPyramidを使った基本的なWebアプリケーションを作成する方法を学びました。
もっと詳しく知りたい方は、Pyramidのドキュメントをご覧ください。