您可以使用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中。
前提條件
操作步驟
- 登入Function Compute控制台,在左側導覽列,單擊服務及函數。
- 在頂部功能表列,選擇地區,然後在服務列表頁面,單擊目標服務。
在函數管理頁面,單擊建立函數。
建立運行環境為Python 3的HTTP函數。具體操作步驟,請參見建立函數。
在函數詳情頁面,單擊函數代碼頁簽,在代碼編輯器中輸入上述範例程式碼,然後選擇
pip install flask -t .
,將Flask庫安裝到目前的目錄下,最後單擊部署代碼。 ,在終端框中執行單擊測試函數。
函數執行成功後,查看返回結果,您可以看到返回結果為
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狀態代碼
錯誤碼
欄位
限制說明
HTTP狀態代碼
錯誤碼
headers
要求標頭中的所有鍵和值的總大小不能超過8 KB。
400
InvalidArgument
path
請求路徑以及所有查詢參數的總大小不能超過4 KB。
body
同步調用請求的Body的總大小不能超過32 MB,非同步呼叫請求的Body的總大小不能超過128 KB。
響應限制
如果超過以下限制,會返回502狀態代碼和BadResponse錯誤碼。
欄位
限制說明
HTTP狀態代碼
錯誤碼
欄位
限制說明
HTTP狀態代碼
錯誤碼
headers
回應標頭中的所有鍵和值對的大小不能超過8 KB。
502
BadResponse