前文:【python socket编程】—— 2.解析http请求头
web
的框架和解析请求的Request
类我们都写好了,现在唯一要做的就是处理相应。编写一个route_dict
字典,key
是url
路径,value
是对应这个url
的相应函数,并使用response_for_request
作为唯一的接口接受请求,并从route_dict
获取对应的函数,如下:
route_dict = {
'/': route_index,
}
def response_for_request(request):
path = request.parse_path()[0]
return route_dict.get(path, error_handle)(request)
当请求'/'
时,response_for_request
根据request
解析到'/'
这个path
,然后从route_dict
得到route_index
这个函数,最后返回route_index(request)
的结果。route_index
需要按照http
响应的格式返回字节数据,例如:
HTTP/1.1 200 OK
Content-Type: text/html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>INDEX</title>
</head>
<body>
<h1>Index Page</h1>
</body>
</html>
与请求的格式类似,第一行HTTP/1.1 200 OK
分别表示协议、状态码和状态,Content-Type: text/html
是header
中的key: value
形式的内容,这里只有一行,常见的还有Set-Cookie
、Content-Length
等;然后是空行;最后就是html
页面的内容。假设以上内容都以str
的形式放在response
变量中,那么route_index
可以写成:
def route_index(request):
print('Request: ', request.content)
response = '...' # 上文的内容,省略
print('Response: ', response)
return response.encode(encoding='utf-8')
此时运行runserver
,在浏览器输入url
,就可以看到内容Index Page
。
回复响应的原理就是这样,后续每增加一个路径,就在字典中增加一条item
及增加一个对应的响应函数。当用户请求的路径不在route_dict
中时,就返回error_handle
这个函数,我们只要让它返回类似404 NOT FOUND
之类的内容就可以了。