全部產品
Search
文件中心

:HTTP請求處理常式(HTTP Handler)

更新時間:Jul 06, 2024

您可以使用HTTP請求處理常式更方便地處理HTTP請求。當調用函數時,Function Compute使用您提供的執行方法來處理HTTP請求。本文介紹Python HTTP請求處理常式的結構和特點。

使用說明

使用HTTP請求處理常式前,請確保為HTTP函數配置HTTP觸發器。具體資訊,請參見配置HTTP觸發器並使用HTTP觸發

HTTP Handler簽名

Python HTTP Handler的簽名遵循WSGI(Python Web Server Gateway Interface)規範。

一個簡單的HTTP Handler簽名定義如下。

def handler(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return [b'<h1>Hello, world!</h1>']

HTTP Handler簽名的樣本解析如下:

  • handler:符合WSGI標準的HTTP請求處理函數,可以傳入以下兩個參數。

    • environ:用於存放所有HTTP請求的資訊。

    • start_response:發送HTTP響應的函數。

  • start_response('200 OK', [('Content-Type', 'text/html')]):函數響應。包含兩個參數:第一個參數是HTTP狀態代碼;第二個參數是一組Python list對象組成的HTTP Headers,每個Header是一個Python tuple對象,包含兩個Python str。

  • return [b'<h1>Hello, world!</h1>']:返回資訊。此傳回值將作為HTTP響應的Body返回給用戶端。

樣本:實現Flask應用

範例程式碼

當實現了符合WSGI協議的HTTP Handler後,基於Flask和Django等流行的Web架構的應用能夠非常快速地移植到Function Compute上。如下代碼展示如何在Function Compute的Python Runtime中運行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)

程式碼範例解釋如下:

  • 第一部分:Flask應用的代碼。從from flask import Flask開始,至return 'Web App with Python Flask!'結束。

  • 第二部分:handler函數。只需要將handler函數實現為return app(environ, start_response),即可將Flask或Django等Web架構應用運行在Function Compute的Python Runtime中。

前提條件

建立服務

操作步驟

  1. 登入Function Compute控制台,在左側導覽列,單擊服務及函數
  2. 在頂部功能表列,選擇地區,然後在服務列表頁面,單擊目標服務。
  3. 函數管理頁面,單擊建立函數

    建立運行環境為Python 3的HTTP函數。具體操作步驟,請參見建立函數

  4. 函數詳情頁面,單擊函數代碼頁簽,在代碼編輯器中輸入上述範例程式碼,然後選擇Terminal > New Terminal,在終端框中執行pip install flask -t .,將Flask庫安裝到目前的目錄下,最後單擊部署代碼

  5. 單擊測試函數

    函數執行成功後,查看返回結果,您可以看到返回結果為Web App with Python Flask!

請求結構體(environ)

用於存放HTTP請求的資訊。其結構為Python字典結構。常見欄位如下,更多關於請求結構體的說明,請參見environ說明

參數

類型

解釋說明

REQUEST_METHOD

String

HTTP要求方法,例如GET、POST等。

HTTP_Variables

String

HTTP要求標頭。

CONTENT_TYPE

String

HTTP請求體(Body)類型。

CONTENT_LENGTH

String

HTTP請求體(Body)長度。

REMOTE_ADDR

String

用戶端IP地址。

wsgi.input

BytesIO

HTTP請求體(Body)。

fc.request_uri

String

用戶端請求的URL,由Function Compute定義。

fc.context

FCContext

上下文,由Function Compute定義。

說明

請求結構體(environ)中的參數HTTP_Variables是按照WSGI規範對要求標頭中的key做了處理的HTTP要求標頭,處理方式為key="HTTP_"+k.upper().replace("-","_")。例如,某個要求標頭是'x-Custom-key':'value',在請求結構體(environ)中會表現為environ['HTTP_X_CUSTOM_KEY']='value'

擷取HTTP Handler請求結構體的範例程式碼如下。

# 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 Handler響應結構體包含響應狀態、回應標頭和響應體。您需要先調用start_response(),將響應狀態status和回應標頭headers的內容返回給服務端,才能返迴響應體。響應體要求為可迭代對象。

start_response是一個可調用結構(Callable),結構樣本如下。關於start_response的更多資訊,請參見the-start-response-callable

# 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

    path

    請求路徑以及所有查詢參數的總大小不能超過4 KB。

    body

    同步調用請求的Body的總大小不能超過32 MB,非同步呼叫請求的Body的總大小不能超過128 KB。

  • 響應限制

    如果超過以下限制,會返回502狀態代碼和BadResponse錯誤碼。

    欄位

    限制說明

    HTTP狀態代碼

    錯誤碼

    headers

    回應標頭中的所有鍵和值對的大小不能超過8 KB。

    502

    BadResponse