python http_Python HTTP函数

函数入口

Python Runtime中函数的签名遵循

入口函数

Python HTTP函数提供两种入口函数:

说明 以下示例以Python 3为例进行说明。

入口函数一# 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]

入口函数二# Method 2: User provide the callable class object. FC call the object to process request and send back response.

HELLO_WORLD = b"Hello world!\n"

class AppClass:

"""Produce the same output, but using a class

"""

def __init__(self, environ, start_response):

self.environ = environ

self.start = start_response

def __iter__(self):

status = '200 OK'

response_headers = [('Content-type', 'text/plain')]

self.start(status, response_headers)

yield HELLO_WORLD

def handler(environ, start_response):

return AppClass(environ, start_response)

参数解释

environ:是一个Python字典,里面存放了所有和客户端相关的信息,详情请参见fc.context和fc.request_uri。

fc.context:和Python事件函数中的

fc.request_uri:请求的URL,格式为String。

说明 environ中的HTTP_Variables里包含请求头,例如某个请求头是'x-Custom-key':'value' , 在environ中会表现为environ['HTTP_X_CUSTOM_KEY']='value',在这里WSGI对请求头中的键做了处理,处理方式为key = "HTTP_" + k.upper().replace("-","_")。

start_response:是一个可调用者(Callable),具体介绍请参见

start_response参数是函数计算Runtime提供的,包含两个必要的位置参数和一个可选参数。为方便说明,可以将他们命名为status,response_headers和exc_info,代码示例如下所示。# 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:一个字符串,表示HTTP响应状态。

response_headers:一个列表,包含(header_name, header_value)形式的元组,表示HTTP响应头。

exc_info:可选。出错时,服务端需要返回给浏览器的信息。

当应用对象根据environ参数的内容执行完业务逻辑后,就需要把结果返回给服务端。HTTP响应需要包含响应状态,响应头和响应体,因此在应用对象将body作为返回值之返回前,需要先调用start_response(),将status和headers的内容返回给服务端,告知服务端应用对象要开始返回body了。

获取请求体

您可以直接使用WSGI获取raw body。

示例代码如下所示。# 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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值