WSGIフレームワークを理解した後、次のことがわかりました。実際、Webアプリは、すべてのHTTP要求に応答するWSGI処理関数を作成することです。
しかし、HTTPリクエストの処理方法は問題ではありません。問題は、100個の異なるURLを処理する方法です。
各URLはGETリクエストとPOSTリクエストに対応できます。もちろん、PUT、DELETE、その他のリクエストもありますが、通常は最も一般的なGETリクエストとPOSTリクエストのみを検討します。
最も簡単なアイデアの1つは、environ変数からHTTPリクエストの情報を抽出することです。これは、次のように1つずつ判断する方法です。
def application(environ, start_response):
method = environ['REQUEST_METHOD']
path = environ['PATH_INFO']
if method=='GET' and path=='/':
return handle_home(environ, start_response)
if method=='POST' and path='/signin':
return handle_signin(environ, start_response)
...
このようにコードを書き留めるだけでは、維持することは絶対に不可能です。
コードを維持できない理由は、WSGIによって提供されるインターフェイスはHTTPインターフェイスよりもはるかに高いものの、Webアプリの処理ロジックと比較するとまだ比較的低レベルであるためです。WSGIインターフェイスをさらに抽象化する必要があります。焦点を当てましょう関数を使用してURLを処理する場合、URLから関数へのマッピングはWebフレームワークに任されます。
Pythonを使用してWebフレームワークを開発するのは非常に簡単なので、Python用のオープンソースWebフレームワークは何百もあります。ここでは、さまざまなWebフレームワークの長所と短所については説明せず、より一般的なWebフレームワークであるFlaskを直接選択します。
Flaskを使用してWebアプリを作成するのはWSGIインターフェイスよりも簡単です(WSGIよりも複雑な場合、フレームワークを使用するのはなぜですか?)、最初にpipを使用してFlaskをインストールします。
$ pip install flask
次に、app.pyを記述して、次の3つのURLを処理します。
- GET /:ホームページ、ホームに戻る;
- GET / signin:ログインページ、ログインフォームを表示します。
- POST / signin:ログインフォームを処理し、ログイン結果を表示します。
同じURL / signinには、GETとPOSTの2種類のリクエストがあり、これらは2つの処理関数にマップされていることに注意してください。
Flaskは、Pythonデコレータを介して内部的にURLを関数に自動的に関連付けるため、作成するコードは次のようになります。
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def home():
return '<h1>Home</h1>'
@app.route('/signin', methods=['GET'])
def signin_form():
return '''<form action="/signin" method="post">
<p><input name="username"></p>
<p><input name="password" type="password"></p>
<p><button type="submit">Sign In</button></p>
</form>'''
@app.route('/signin', methods=['POST'])
def signin():
# 需要从request对象读取表单内容:
if request.form['username']=='admin' and request.form['password']=='password':
return '<h3>Hello, admin!</h3>'
return '<h3>Bad username or password.</h3>'
if __name__ == '__main__':
app.run()
python app.pyを実行すると、Flask自身のサーバーがポート5000でリッスンします。
$ python app.py
* Running on http://127.0.0.1:5000/
ブラウザを開き、ホームページアドレスhttp:// localhost:5000 /を入力します。
ホームページが正しく表示されます!
次に、ブラウザのアドレスバーにhttp:// localhost:5000 / signinと
入力すると、ログインフォームが表示されます。プリセットのユーザー名adminとパスワードパスワードを入力すると、ログインに成功します。
他の間違ったユーザー名とパスワードを入力しました。ログインに失敗しました:
実際のWebアプリは、ユーザー名とパスワードを取得し、データベースにアクセスしてクエリと比較を行い、ユーザーが正常にログインできるかどうかを判断する必要があります。
Flaskに加えて、一般的なPythonWebフレームワークには次のものがあります。
Django:用途の広いWebフレームワーク。
web.py:小さなWebフレームワーク。
ボトル:Flaskに似たWebフレームワーク。
Tornado:Facebookのオープンソース非同期Webフレームワーク。
もちろん、Python Webフレームワークの開発は難しくないので、Webフレームワークの開発内容についても後で説明します。
概要
Webフレームワークでは、Webアプリケーションを作成するときに、WSGI処理関数からURL +対応する処理関数に注意を移します。このようにしてWebアプリの作成が簡単になります。
URL処理関数を作成するときは、URLの構成に加えて、HTTPリクエストからユーザーデータを取得することも非常に重要です。Webフレームワークは、これらの機能を実装するための独自のAPIを提供します。Flaskは、request.form ['name']を介してフォームのコンテンツを取得します。
つまり、フレームワークが必要ない場合は、WSGI処理関数を自分で作成する必要があり、HTTPリクエストやURLにとっては非常に面倒です。リクエストタイプを決定するだけでなく、URLが何であるかを決定し、次に呼び出す関数を決定します
フレームワークを使用すると、デコレータを追加し、処理する対応するURLを追加して、処理関数を作成するだけで済みます。(ああ、これがフレームワークの目的であることに突然気づきました)