请求处理程序(Handler)
更新时间 2025-10-16 09:28:36
最近更新时间: 2025-10-16 09:28:36
本文介绍如何使用Python请求处理程序响应接收到的事件并执行相应的业务逻辑。
请求处理程序
请求处理程序是您提供的一个方法。当您的函数被调用时,函数计算会运行该方法处理请求。
您可以通过函数计算控制台页面配置请求处理程序,对于Python语言的函数,请求处理程序需配置为 [文件名].[方法名]。例如,您的文件名为index.py,方法名为handler,则请求处理程序可配置为 index.handler。
事件请求处理程序的方法签名定义如下:
def handler(event, context):
return 'Hello Python!'
- 方法名
您可以自定义方法名称。 - event入参
您调用函数时传入的参数。 - context入参
context参数中包含一些函数的运行时信息(例如RequestId、临时AccessKey等)。
HTTP请求处理程序的方法签名定义如下:
# -*- coding: utf-8 -*-
HELLO_WORLD = b'Hello world!\n'
def handler(environ, start_response):
status = '200 OK'
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
return [HELLO_WORLD]
- 方法名
您可以自定义方法名称。 - environ入参
用于存放所有HTTP请求的信息。 - start_response入参
发送 HTTP 响应的函数,包含两个参数:HTTP状态码、一组Python list对象组成的HTTP Headers。
示例:获取JSON中的字段
# -*- coding: utf-8 -*-
import json
def handler(event, context):
person = json.loads(event)
name = person["name"]
address = person["address"]
return f"Input name is: {name}, address is: {address}"
示例二:使用HTTP触发器调用函数
import json
import logging
# 配置日志
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def handler(environ, start_response):
# 获取请求路径、URI和客户端IP
request_path = environ.get('FC_REQUEST_PATH', '')
request_uri = environ.get('FC_REQUEST_URI', '')
request_client_ip = environ.get('FC_REQUEST_CLIENT_IP', '')
# 记录日志
logger.info("hello")
print("print hello")
# 获取请求体数据
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)
# 解析JSON请求体
try:
if request_body:
json_data = json.loads(request_body.decode('utf-8'))
logger.info(f"body: {json.dumps(json_data)}")
else:
json_data = {}
logger.info("body: empty")
except json.JSONDecodeError as e:
logger.error(f"JSON解析错误: {e}")
json_data = {}
# 构建响应内容
response_content = f"Path: {request_path}\nUri: {request_uri}\nIP: {request_client_ip}\n"
# 设置响应状态和头部
status = '200 OK'
response_headers = [
('header1', 'value1'),
('header2', 'value2'),
('Content-Type', 'text/plain')
]
start_response(status, response_headers)
# 返回响应内容
return [response_content.encode('utf-8')]