根据不同的请求返回不同的内容 | 手把手教你入门Python之一百一十二-阿里云开发者社区

开发者社区> Python学习站> 正文

根据不同的请求返回不同的内容 | 手把手教你入门Python之一百一十二

简介: 本节实现根据不同的请求返回不同的内容,使浏览器访问 /register 或 /login 使返回不同的内容。

上一篇: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后控制台输出了访问的路径:

image.png

接下来我们可以通过这个信息来定制不同的 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 = '对不起,您要查看的页面不存在!!!'

可以在浏览其中访问效果如下:

image.png

面向对象的服务器封装

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()

运行结果:
image.png
image.png
image.png

配套视频

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
Python学习站
使用钉钉扫一扫加入圈子
+ 订阅

Python学习资料大全,包含Python编程学习、实战案例分享、开发者必知词条等内容。

官方博客
官网链接