HTTPハンドラーを使用して、HTTPリクエストを効率的に処理できます。 関数が呼び出されると、function Computeは指定したハンドラーを使用してHTTPリクエストを処理します。 このトピックでは、PythonのHTTPハンドラーの構造と特性について説明します。
使用上の注意
HTTPハンドラーを使用する前に、HTTPトリガーがHTTP関数に設定されていることを確認してください。 詳細については、「HTTPリクエストで関数を呼び出すHTTPトリガーの設定」をご参照ください。
HTTPハンドラーの署名
PythonのHTTPハンドラーの署名は、Python Web Server Gateway Interface (WSGI) の仕様に従います。
次のサンプルコードでは、HTTPハンドラーの署名について説明します。
def handler(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [b'<h1>Hello, world!</h1>']
上記のコードでは、
handler
: HTTPリクエストに応答するために呼び出され、WSGI仕様に従う関数。 次のパラメータを渡すことができます。environ
: すべてのHTTPリクエストに関する情報。start_response
: HTTPレスポンスを送信する関数。
start_response('200 OK', [('Content-Type', 'text/html')])
: 2つのパラメータを含む関数の応答。 最初のパラメーターは、HTTPステータスコードを示します。 2番目のパラメーターは、Pythonリストオブジェクトのセットで構成されるHTTPヘッダーを示します。 各HTTPヘッダーは、2つのPython文字列を含むPythonタプルオブジェクトです。return [b'<h1>Hello, world!</h1>']
: HTTPレスポンスボディとしてサーバーからクライアントに返される戻り値。
例: Flaskアプリケーションの実装
サンプルコード
WSGI仕様に従うHTTPハンドラーを作成した後、FlaskやDjangoなどのwebフレームワークに基づいて構築されたアプリケーションをFunction Computeにすばやく移行できます。 次のコードは、Function ComputeのPythonランタイムでFlaskベースのhello world
アプリケーションを実行する方法を示しています。
フラスコ輸入フラスコからの
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Web App with Python Flask!'
def handler(environ, start_response):
return app(environ, start_response)
上記のサンプルコードでは、
パート1: Flaskベースのアプリケーションのコード。 この部分は、
from flask import Flask
で始まり、return 'Web App with Python Flask!'
で終わります。パート2:
ハンドラ
関数。 Function ComputeのPythonランタイムでFlaskやDjangoなどのwebフレームワーク上に構築されたアプリケーションを実行するには、handler
関数をreturn app(environ, start_response)
として実装するだけです。
あなたが始める前に
手順
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[サービスと機能] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [サービス] ページで、目的のサービスをクリックします。
[関数] ページで、[関数の作成] をクリックします。
実行環境がPython 3のHTTP関数を作成します。 詳細については、「関数の作成」をご参照ください。
[関数の詳細] ページで、[コード] タブをクリックし、コードエディターに前述のサンプルコードを入力します。 次に、
pip install flask -tを実行します。
TERMINALコードエディターで 現在のディレクトリにFlaskライブラリをインストールし、[デプロイ] をクリックします。 を選択します。[テスト関数] をクリックします。
レスポンスの確認
WebアプリとPythonフラスコ!
メッセージが表示されると、関数が実行されます。
HTTPリクエスト構造体 (environ)
HTTPリクエスト構造体は、HTTPリクエストに関する情報を格納するために使用されます。 リクエスト構造体はPython辞書構造です。 次の表に、リクエスト構造体に含まれる共通パラメーターを示します。 リクエスト構造体の詳細については、「environ Variables」をご参照ください。
パラメーター | データ型 | 説明 |
REQUEST_METHOD | String | GETやPOSTなどのHTTPリクエストメソッド。 |
HTTP_Variables | String | クライアントが提供するHTTPリクエストヘッダーに対応する変数。 |
CONTENT_TYPE | String | HTTP リクエストボディの型 |
CONTENT_LENGTH | String | HTTPリクエストボディの長さ。 |
REMOTE_ADDR | String | クライアントの IP アドレス。 |
wsgi.input | BytesIO | HTTPリクエストボディ。 |
fc.request_uri | String | クライアント要求のURL。 URLはFunction Computeによって定義されます。 |
fc.context | FCContext | コンテキスト。 コンテキストはFunction Computeによって定義されます。 |
request struct (environ) のHTTP_Variablesパラメーターは、key
がWSGI仕様に基づいてkey="HTTP_" + k.upper().replace("-","_")
として処理されるHTTPリクエストヘッダーです。 たとえば、リクエストヘッダーが 'x-Custom-key':'value' の場合、リクエスト構造体のHTTP_Variablesパラメーターはenviron['HTTP_X_CUSTOM_KEY ']='value'
と表されます。
次のサンプルコードは、HTTPハンドラーのリクエスト構造を取得する方法を示しています。
# Method 1: User provide the function. FC call the function to process request and send back response.
HELLO_WORLD = b"Hello world!\n"
def handler(environ, start_response):
context = environ['fc.context']
request_uri = environ['fc.request_uri']
for k, v in environ.items():
if k.startswith("HTTP_"):
# process custom request headers
pass
# get request_body
try:
request_body_size = int(environ.get('CONTENT_LENGTH', 0))
except (ValueError):
request_body_size = 0
request_body = environ['wsgi.input'].read(request_body_size)
# get request_method
request_method = environ['REQUEST_METHOD']
# get path info
path_info = environ['PATH_INFO']
# get server_protocol
server_protocol = environ['SERVER_PROTOCOL']
# get content_type
try:
content_type = environ['CONTENT_TYPE']
except (KeyError):
content_type = " "
# get query_string
try:
query_string = environ['QUERY_STRING']
except (KeyError):
query_string = " "
print ('request_body: {}'.format(request_body))
print ('method: {}\n path: {}\n query_string: {}\n server_protocol: {}\n'.format(request_method, path_info, query_string, server_protocol))
# do something here
status = '200 OK'
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
# return value must be iterable
return [HELLO_WORLD]
HTTPレスポンス構造体
HTTPハンドラーの応答構造体には、応答ステータス、応答ヘッダー、および応答本文が含まれます。 アプリケーションがレスポンス本文を返す前に、start_response()
関数を呼び出して、status
とheaders
の値をサーバーに返す必要があります。 応答ボディは反復オブジェクトでなければなりません。
は呼び出し可能です。 次のコードは、start_responseのサンプル構造を提供します。
start_response
の詳細については、「start_response() Callable」をご参照ください。
FCランタイムによって提供される
# Provided by FC runtime.
# status: a string like '200 OK' or '403 FORBIDDEN'
# return: must be a write(body_data) callable
def start_response(status, response_headers, exc_info=None):
...
次の項目は、パラメータについて説明します。
パラメーター | データ型 | 説明 |
status | String | HTTP応答のステータス。 |
response_headers | List | HTTP応答ヘッダー。 |
exc_info | List | サーバーがクライアントに返す必要があるタプル形式の例外情報。 このパラメーターはFunction Computeでは使用されません。 |
制限事項
リクエスト制限
リクエストが次のいずれかの制限を超えると、システムはステータスコード400とエラーInvalidArgumentを返します。
項目
説明
HTTPステータスコード
エラーコード
headers
リクエストヘッダーのキーと値の合計サイズは8 KBを超えることはできません。
400
InvalidArgument
パス
リクエストパスとクエリパラメーターの合計サイズは4 KBを超えることはできません。
body
同期呼び出し要求の本体の合計サイズは32 MBを超えることはできません。 非同期呼び出し要求の本体の合計サイズは128 KBを超えることはできません。
レスポンスの制限
応答が次のいずれかの制限を超えると、システムはステータスコード502とエラーBadResponseを返します。
項目
説明
HTTPステータスコード
エラーコード
headers
レスポンスヘッダーのキーと値の合計サイズは8 KBを超えることはできません。
502
BadResponse