上一篇:Http请求头 | 手把手教你入门Python之一百一十一
下一篇:WSGI服务器的介绍| 手把手教你入门Python之一百一十三
本文来自于千锋教育在阿里云开发者社区学习中心上线课程《Python入门2020最新大课》,主讲人姜伟。
根据不同的请求返回不同的内容
将前面的代码简化一下:
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 8090))
server_socket.listen(128)
while True:
client_socket, client_addr = server_socket.accept()
data = client_socket.recv(1024).decode('utf8')
# 响应头
response_header = 'HTTP/1.1 200 OK\n' + 'content-type:text/html\n'
response_header += '\n'
#响应体
response_body = 'hello world'
# 响应
response = response_header + response_body
# 发送给客户端
client_socket.send(response.encode('utf8'))
这段代码运行时访问得到的响应都是 hello world ,现在我们实现根据不同的请求返回不同的内容,使浏览器访问 /register 或 /login 使返回不同的内容。
关于请求的地址我们可以在请求头的第一行中获得,而在浏览器请求时有可能 data 为空,在循环体中添加如下代码:
path = ''
if data: # # 浏览器发送过来的数据有可能是空的
path = data.splitlines()[0].split(' ')[1]
print('请求的路径是{}'.format(path))
可以看到在浏览器中访问localhost:8090/login后控制台输出了访问的路径:
接下来我们可以通过这个信息来定制不同的 response_body (此时浏览器默认的读取编码为gbk,需在代码中调整一下):
if path == '/login':
response_body = '欢迎来到登录页面'
elif path == '/register':
response_body = '欢迎来到注册页面'
elif path == '/':
response_body = '欢迎来到首页'
如果我们想以utf8的编码返回,我们只需要在响应头中的 content-type:text/htmln 改写为 content-type:text/html;charset=utf8n,告知浏览器相应内容的编码方式。
当在浏览器中什么也不访问时,也应该有相应的响应内容,我们可以在分支语句中添加如下分支:
else:
# 页面未找到 404 Page Not Found
response_header = 'HTTP/1.1 404 Page Not Found\n'
response_body = '对不起,您要查看的页面不存在!!!'
可以在浏览其中访问效果如下:
面向对象的服务器封装
import socket
class MyServer(object):
def __init__(self, ip, port):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.bind((ip, port))
self.socket.listen(128)
def run_forever(self):
while True:
client_socket, client_addr = self.socket.accept()
data = client_socket.recv(1024).decode('utf8')
path = ''
if data:
path = data.splitlines()[0].split(' ')[1]
response_header = 'HTTP/1.1 200 OK\n'
if path == '/login':
response_body = '欢迎来到登录页面'
elif path == '/register':
response_body = '欢迎来到注册页面'
elif path == '/':
response_body = '欢迎来到首页'
else:
response_header = 'HTTP/1.1 404 Page Not Found\n'
response_body = '对不起,您要查看的页面不存在!!!'
response_header += 'content-type:text/html;charset=utf8\n'
response_header += '\n'
response = response_header + response_body
client_socket.send(response.encode('utf8'))
server = MyServer('0.0.0.0', 9090)
server.run_forever()
运行结果: