您可以使用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狀態代碼
錯誤碼
headers
要求標頭中的所有鍵和值的總大小不能超過8 KB。
400
InvalidArgument
path
請求路徑以及所有查詢參數的總大小不能超過4 KB。
body
同步調用請求的Body的總大小不能超過32 MB,非同步呼叫請求的Body的總大小不能超過128 KB。
響應限制
如果超過以下限制,會返回502狀態代碼和BadResponse錯誤碼。
欄位
限制說明
HTTP狀態代碼
錯誤碼
headers
回應標頭中的所有鍵和值對的大小不能超過8 KB。
502
BadResponse