python笔记系列-day24:python做简单的web服务器

初学servlet的时候,我们写一个简单的servelt响应页面的请求响应

那么python也一样,同样可以做一个简单的web服务器响应页面请求

需要的模块:

http.server

两个重要的类:

BaseHTTPRequestHandler : 需要继承的类,响应请求方法,类似HttpServlet
HTTPServer: 获取一个server 并启动 , 类似tomcat 的角色

第一版:简单的web服务器实现

sever.py 

#-*- coding:utf-8 -*-

# 使用http模块
from http.server import BaseHTTPRequestHandler , HTTPServer

class MyRequestHandler(BaseHTTPRequestHandler):
    '''接受页面的处理请求并返回页面'''

    # 页面模板
    Page = '''\
            <html>
            <body>
            <p>Hello, web!</p>
            </body>
            </html>
        '''

    # 处理一个GET请求
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-Type","text/html")
        self.send_header("Content-Length",str(len(self.Page)))
        self.end_headers()
        self.wfile.write(self.Page.encode('utf-8'))


if __name__ == '__main__':
    print('server start on 127.0.0.1:8080...')
    serverAddress = ('127.0.0.1',8080)
    server = HTTPServer(serverAddress , MyRequestHandler)
    server.serve_forever()
    print('server is started success !')

sever.py 文件解读

  1. 里面有2个比较重要的类 , BaseHTTPRequestHandler , HTTPServer
  2. 自己编写一个requestHandler类,然后处理请求
  3. 这个类要覆盖下 do_GET 方法
  4. 给前端写的结果是 self.wfile.write(self.Page.encode('utf-8'))
  5. 要启动这个服务的时候需要这几行比较重要的代码
    serverAddress = ('127.0.0.1',8080)
    server = HTTPServer(serverAddress , MyRequestHandler)
    server.serve_forever()

处理请求:

 这个就是get方法和post方法了

self.send_response(200)  设置响应码为 200
self.send_header("Content-Type","text/html")
self.wfile.write(self.Page.encode('utf-8')) 响应内容

运行结果:

浏览器输入:

http://127.0.0.1:8080

 第二版 使用静态文件制定响应内容

这个和当初的jsp一样的,可以通过页面来制定 view

但是都需要读取这些制定的文件

python中要读取文件需要 os 模块的支持和 open函数支持

要获取一个文件句柄,自然就想到了 with 语句了

with open("/tmp/foo.txt") as file:
    data = file.read()

首先做一个 index.html 放于 page 目录下面

index.html

<html>
  <head>
    <title>Welcome Page</title>
  </head>
  <body>
    <h1>Welcome </h1>
    <p>hello qianyue !</p>
  </body>
</html>

下面再写一版 MyRequestHandler2

1.里面增加了 异常的处理页面和功能  handle_error

2. 将创建页面的功能单独抽取出来为   create_page  函数

3. 读取文件的功能单独抽取成为  handle_file 函数

4. 将响应的内容的功能单独抽取出来 为  send_content 函数

代码如下:

#-*- coding:utf-8 -*-

# 使用http模块
from http.server import BaseHTTPRequestHandler , HTTPServer
import sys , os
import ServerException


class MyRequestHandler2(BaseHTTPRequestHandler):
    '''接受页面的处理请求并返回页面'''

    # 异常页面模板
    Error_Page = """\
        <html>
        <body>
        <h1>Error accessing {path}</h1>
        <p>{msg}</p>
        </body>
        </html>
        """

    #------------------- 创建页面的函数----------------------------
    def create_page(self):
        '''
        从静态文件里面读取页面模板
        self.path 保存了请求的相对路径,因为 MyRequestHandler2 继承自 BaseHTTPRequestHandler,
        它已将请求的相对路径保存在 self.path 中了
        :return: 读取页面模板的内容
        '''
        print('当前的self.path=' + self.path)
        full_path = os.getcwd() + self.path
        # 如果该路径不存在...
        if not os.path.exists(full_path):
            print(self.path + " is not exitst !!!")
            raise Exception(" '{0}' not found".format(self.path))

        # 如果该路径是一个文件
        elif os.path.isfile(full_path):
            # 从文件读取内容
            content = self.handle_file(full_path)
            return content

        else:
            # 抛出异常:该路径为不知名对象
            raise Exception("Unknown object '{0}'".format(self.path))


    #------------------- 编写异常处理函数----------------------------
    def handle_error(self, msg):
        '''
        error handle
        :param msg:
        :return:
        '''
        content = self.Error_Page.format(path=self.path, msg=msg)
        print("error content:"+content)
        #  handle_error 函数中的 content 内容被编码为二进制了,所以调用的send_content 里面不用再进行这个 content.encode了
        self.send_content(content.encode('utf-8'),404)

    #------------------- 编写文件处理函数----------------------------
    def handle_file(self,full_path):
        '''
        文件处理函数
        :param full_path:
        :return: 读取文件的内容
        '''
        try:
            with open(full_path,'rb') as reader:
                content = reader.read()
            return content
        except IOError as msg:
            msg = " '{0}' cannot be read : {1} ".format(self.path,msg)
            self.handle_error(msg)
            return None


    #------------------- 将要响应的内容单独抽取出来----------------------------
    def send_content(self,page,status=200):
        '''
        响应页面的内容
        :param page:
        :param status:
        :return:
        '''
        self.send_response(status)
        self.send_header("Content-Type", "text/html")
        if page == None:
            print(' page is None...')
            self.send_header("Content-Length", '0')
            self.end_headers()
        else:
            self.send_header("Content-Length", str(len(page)))
            self.end_headers()
            # send_content 函数中的 page 去掉了编码,因为调用的时候已经编码过了
            self.wfile.write(page)

    #------------------- 重新写的get函数----------------------------
    def do_GET(self):
        '''
        :return:
        '''
        try:
            page = self.create_page()
            self.send_content(page)
        except Exception as msg:
            self.handle_error(msg)


if __name__ == '__main__':
    print('server start on 127.0.0.1:8080...')
    serverAddress = ('127.0.0.1',8080)
    server = HTTPServer(serverAddress , MyRequestHandler2)
    server.serve_forever()
    print('server is started success !')

启动程序,浏览器中输入

http://127.0.0.1:8080/page/index.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,异常处理是非常重要的一部分。当程序运行时如果出现错误,如果没有异常处理,程序就会崩溃。为了避免这种情况,Python提供了异常处理机制。 在Python中,异常处理语句使用 `try` 和 `except` 关键字来实现。`try` 语句块中包含可能会发生异常的代码,如果这段代码出现了异常,则会跳转到 `except` 语句块中执行异常处理代码。 下面是一个简单的例子: ```python try: num = int(input("请输入一个整数:")) print(10/num) except ZeroDivisionError: print("除数不能为0") except ValueError: print("输入的不是整数") ``` 在上面的代码中,我们尝试将用户输入的字符串转换为整数,并将其用作除数计算 10/num。如果用户输入的是 0,则会触发 ZeroDivisionError 异常。如果用户输入的不是整数,则会触发 ValueError 异常。如果发生异常,则会跳转到对应的 except 语句块中执行处理代码。 除了可以指定具体的异常类型,也可以使用 `except Exception` 来捕获所有异常。例如: ```python try: num = int(input("请输入一个整数:")) print(10/num) except Exception as e: print("发生异常:", e) ``` 在上面的代码中,如果发生任何异常,都会跳转到 `except` 语句块中执行处理代码,并将异常信息打印出来。 除了 `try` 和 `except`,还有 `finally` 关键字,它指定的代码块无论是否发生异常都会执行。例如: ```python try: num = int(input("请输入一个整数:")) print(10/num) except Exception as e: print("发生异常:", e) finally: print("程序执行完毕") ``` 在上面的代码中,无论是否发生异常,都会执行 `finally` 中的代码,即输出“程序执行完毕”。 总之,在Python中,异常处理是非常重要的一部分,它可以有效避免程序崩溃,提高程序的健壮性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值