根据不同的请求返回不同的内容 | 手把手教你入门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

配套视频

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

相关文章
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4110 0
Python 2.7.x 与 Python 3.x 的不同点
本文翻译自:《Key differences between Python 2.7.x and Python 3.x》 许多 Python 初学者想知道他们应该从 Python 的哪个版本开始学习。
948 0
Python全栈快餐教程(1) - 用Flask处理HTTP请求
# Python全栈快餐教程(1) - 用Flask处理HTTP请求 ## 初识Flask Flask是最流行的Python web框架之一。 我们来写个最小的web应用,只有一个路由先跑进来玩玩吧。 ```python from flask import Flask # 定义flask app对象 app = Flask(__name__) # 处理路由
997 0
ELK菜鸟手记 (四) - 利用filebeat和不同端口把不同服务器上的log4j日志传输到同一台ELK服务器
1. 问题描述  我们需要将不同服务器(如Web Server)上的log4j日志传输到同一台ELK服务器,介于公司服务器资源紧张(^_^)   2. 我们需要用到filebeat 什么是filebeat? filebeat被用来ship events,即把一台服务器上的文件日志通过socket的方式,传输到远程的ELK。
1964 0
带你读《好设计,有方法:我们在搜狐做产品体验设计》之三:区分不同载体的设计
那些激动人心、让人拍手叫好的设计,到底有没有方法可循?背后到底有没有设计理论支撑?答案是肯定的!本书作者是资深体验设计专家,拥有超过10年的产品体验设计和团队管理经验,他们将试图为大家总结和揭示那些优秀设计背后的理论和方法。
475 0
Android网络请求框架之Retrofit实践
网络访问框架经过了从使用最原始的AsyncTask构建简单的网络访问框架(甚至不能称为框架),后来使用开源的android-async-http库,再到使用google发布的volley库,一直不懈的寻找更好的解决方案,到现在也没找到,不过据行业所说,Retrofit算是行业比较牛逼的开源请求框架了吧,也算找 到了一些更好的方案,在这里做些记录,也做共享。 下面是我们常用的mvp模式的运
1112 0
1172
文章
2
问答
来源圈子
更多
Python学习资料大全,包含Python编程学习、实战案例分享、开发者必知词条等内容。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载