环境声明:
编译软件: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()
代码运行结果:
浏览器访问服务器结果:
控制台输出:
三、客户端向服务器请求不同数据——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
访问/how
客户端访问页面不存在:
控制台输出:
*四、重复代码处理——装饰器
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