Python-在WSGI规则下wsgiref库simple_server的使用(静态服务器)

环境声明:

编译软件:PyCharm
浏览器:Goole Chrome
操作系统:win10

一、基本使用

from wsgiref import simple_server


def app1(environment, start_response):
    # 3.执行函数app1,向服务器返回数据,服务器发送给对应客户端
    print(environment)
    # 状态行 响应头
    start_response('200 OK', [('Content-type', 'text/html')])

    content = 'Hello'
    return [content.encode('utf-8')]  # 返回内容(return可迭代对象,二进制内容)


# 1.创建服务器
server = simple_server.make_server('', 7788, app1)  # 服务器ip地址(''即默认本机地址)、端口号、执行函数(服务器默认向函数内传入两个参数)
print('在7788端口下开启了服务器!')
# 2.开启服务器
server.serve_forever()

代码运行结果:
代码运行结果
浏览器访问服务器结果:
浏览器访问服务器
控制台输出:
客户端访问服务器后,后台输出
可以看到输出的请求头数据看不懂意思
引入webob库对web请求进行处理

二、引入webob处理数据

from wsgiref import simple_server
from webob import Request, Response


# 3.执行函数
def app1(environment, start_response):
    # print(environment)
    # 引入webob中的Request处理请求头信息
    req = Request(environment)
    print(req)

    # 根据wsgi协议,返回数据为迭代器
    response = Response(body='how are you?')  # Response处理服务器发送给客户端的响应体数据
    # 返回Response处理好的响应体,附带客户端信息environment, start_response(Response自动添加返回数据的响应头)
    return response(environment, start_response)


# 1.创建服务器
server = simple_server.make_server('', 7788, app1)  # 服务器ip地址、端口号、执行函数(服务器默认向函数内传入两个参数)
print('在7788端口下开启了服务器!')
# 2.开启服务器
server.serve_forever()

代码运行结果:
代码执行结果
浏览器访问服务器结果:
浏览器访问数据库结果
控制台输出:
Request处理后输出的响应头信息更直观了

三、客户端向服务器请求不同数据——Selector库(路由分发)

from wsgiref import simple_server
from webob import Request, Response
from selector import Selector

# 4.执行函数
# 客户端请求/hello返回数据
def app1(environment, start_response):
    # print(environment)
    # 引入webob中的Request处理请求头信息
    req = Request(environment)
    print(req)

    # 根据wsgi协议,返回数据为迭代器
    response = Response(body='Hello')  # Response处理服务器发送给客户端的响应体数据
    # 返回Response处理好的响应体,附带客户端信息environment, start_response(Response自动添加返回数据的响应头)
    return response(environment, start_response)

# 客户端请求/how返回数据
def app2(environment, start_response):
    req = Request(environment)
    # print(req)
    response = Response(body='how are you?')  # Response处理服务器发送给客户端的响应体数据
    return response(environment, start_response)

# 浏览器自动请求的/favicon.ico,不返回数据
def app3(environment, start_response):
    req = Request(environment)
    # print(req)
    response = Response(body='')  # Response处理服务器发送给客户端的响应体数据
    return response(environment, start_response)

# 404页面返回数据
def app404(environment, start_response):
    req = Request(environment)
    # print(req)
    response = Response(body='404 Not Found!')  # Response处理服务器发送给客户端的响应体数据
    return response(environment, start_response)


# 3.路由分发-selector
app = Selector()
# 根据不同的请求,调用不同函数
app.add('/hello', GET=app1)  # 请求192.168.1.1/hello调用app1
app.add('/how', GET=app2)  # 请求.../how调用app2
app.add('/favicon.ico', GET=app3)  # 请求.../favicon.ico调用app3(这个请求是浏览器自带的请求)
app.status404 = app404  # 设置Selector().status404参数对应的函数,即返回404页面

# 1.创建服务器
server = simple_server.make_server('', 7788, app)  # 服务器ip地址、端口号、执行函数app(此时为Selector()对象)
print('在7788端口下开启了服务器!')
# 2.开启服务器
server.serve_forever()

代码运行结果:
代码执行结果
浏览器访问服务器结果:
访问/hello
客户端访问/hello
访问/how
客户端访问/how
客户端访问页面不存在:
客户端访问页面不存在
控制台输出:
客户端访问结果(白字为在app1中print输出的响应头信息)

*四、重复代码处理——装饰器

from wsgiref import simple_server
from webob import Request, Response
from selector import Selector

# 装饰器
def func_decorator(func):
    def inner_func(environment, start_response):
        # Request处理environment
        request = Request(environment)
        # 1.调用处理好的request传入func (即app1、app2、app3、...)
        # 2.接收func返回的body体
        response = func(request)
        # 3.返回服务器要发送出去的数据
        return response(environment, start_response)

    inner_func.__name__ = func.__name__
    inner_func.__doc__ = func.__doc__
	#  装饰器返回内部函数结果
    return inner_func
    
# 装饰器func_decorator包裹app1(路由分发调用app1实际是调用的包裹app1的装饰器,装饰器返回最终结果)
@func_decorator
def app1(request):
    return Response(body='Hello')
    
# 装饰器func_decorator包裹app2
@func_decorator
def app2(request):
    return Response(body='how are you?')
    
# 装饰器func_decorator包裹app3
@func_decorator
def app3(request):
    return Response(body='')
    
# 装饰器func_decorator包裹app404
@func_decorator
def app404(request):
    return Response(body='404 Not Found!')


# 3.路由分发-selector
app = Selector()
# 根据不同的请求,响应不同的页面
app.add('/hello', GET=app1)
app.add('/how', GET=app2)
app.add('/favicon.ico', GET=app3)
app.status404 = app404

# 1.创建服务器
server = simple_server.make_server('', 7788, app)  # 服务器ip地址、端口号、执行函数
print('在7788端口下开启了服务器!')
# 2.开启服务器
server.serve_forever()

代码运行结果:
最终运行结果(其他结果与三、一致)

*五、封装&GET请求&POST请求

所有代码都在一个.py文件看着不舒服?
那就主文件9行代码
封装后的主文件
# TODO 这部分内容以后有空发出来
当然,有hxd需要这部分源代码的话可以直接来找我拿2333333333

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值