すべてのプロダクト
Search
ドキュメントセンター

Function Compute:HTTPハンドラー

最終更新日:Aug 30, 2024

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) として実装するだけです。

あなたが始める前に

サービスの作成

手順

  1. Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[サービスと機能] をクリックします。

  2. 上部のナビゲーションバーで、リージョンを選択します。 [サービス] ページで、目的のサービスをクリックします。

  3. [関数] ページで、[関数の作成] をクリックします。

    実行環境がPython 3のHTTP関数を作成します。 詳細については、「関数の作成」をご参照ください。

  4. [関数の詳細] ページで、[コード] タブをクリックし、コードエディターに前述のサンプルコードを入力します。 次に、[ターミナル] > [新規ターミナル] を選択します。 pip install flask -tを実行します。 TERMINALコードエディターで 現在のディレクトリにFlaskライブラリをインストールし、[デプロイ] をクリックします。

  5. [テスト関数] をクリックします。

    レスポンスの確認 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() 関数を呼び出して、statusheadersの値をサーバーに返す必要があります。 応答ボディは反復オブジェクトでなければなりません。

は呼び出し可能です。 次のコードは、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