当我们在浏览器上请求我们的后台服务时,请求的url和请求的参数params会发送给后台,并被保存在后台程序的系统环境变量中,其中前端请求的url保存着在’PATH_INFO‘中,请求的参数保存在‘QUERY_STRING’中?,我们后台服务可以从env中去取出请求数据然后逻辑处理。
env:系统的环境变量
env.get('PATH_INFO'): 获取环境变量中的请求url路由.
env.get("QUERY_STRING"):获取环境变量中get请求的字符串参数params.
from wsgiref.simple_server import make_server
def app(env, start_response):
# env代表本地环境变量,dict类型
# {'PATH': '/Users/jt/python_env/flask_demo/venv/bin,'MANPATH': '/opt/homebrew/share/man::',
# 'WORKON_HOME': '/Users/jeanettian/python_env'}
# print(env)
print(env.get('PATH_INFO'))
if env.get('PATH_INFO') == '/login':
start_response('200 ok', [('content-type', 'text/plain')])
return [b'this is login view'] # b:byte
elif env.get('PATH_INFO') == '/register':
start_response('200 ok', [('content-type', 'text/plain')])
return [b'his is register view'] # b:byte
elif env.get('PATH_INFO') == '/index':
start_response('200 ok', [('content-type', 'text/plain')])
return [b'his is index view'] # b:byte
elif env.get('PATH_INFO') == '':
start_response('200 ok', [('content-type', 'text/plain')])
return [b'{name: chuntian!,age:4}'] # b:byte
else:
start_response('404 not found', [('content-type', 'text/plain')])
return [b'404 page not found'] # b:byte
server = make_server('', 5001, app=app)
# 启动服务
server.serve_forever()
1.浏览器访问login时:
?2.浏览器访问register时:
3.浏览器访问index时:
4.浏览器访问' /'时:
5.浏览器访问不存在的路由时:
路由集中式管理:字典实现switch(){}?
上面的代码有个问题,出现多个if xxx == xxx的条件分支的时候,每个分支都是一条逻辑判断,显得过于冗余,我们可以利用python中的字典来实现其他变成语言里的switch(){}语句,达到使代码更加优雅的目的,也使以后修改路由更加方便,直接修改字典内容,不需要修改主逻辑,
from wsgiref.simple_server import make_server
def login():
return 'login'
def register():
return 'register'
def index():
return 'index'
def home():
return '{"name": "chuntian", "age": 4}'
pattern_url = {
"/": home,
"/login": login,
"/register": register,
"/index": index
}
def app(env, start_response):
url = env.get('PATH_INFO') # 字典的get方法若没找到对应的键,则会返回None,比dict['key']更好
if url is None or url not in pattern_url.keys():
start_response('404 not found', [('content-type', 'text/plain')])
return [b'404 page not found']
res = pattern_url.get(url)
if res is None:
start_response('404 not found', [('content-type', 'text/plain')])
return [b'404 page not found']
start_response('200 ok', [('content_type', 'text/palin')])
return [res().encode()]
server = make_server('', 5001, app=app)
# 启动服务
server.serve_forever()
获取请求的url和参数
from wsgiref.simple_server import make_server
def login(request): # 程序获取到的params可传递给request
return request
def register(request):
return request
def index(request):
return request
def home(request):
return request
pattern_url = {
"/": home,
"/login": login,
"/register": register,
"/index": index
}
def app(env, start_response):
url = env.get('PATH_INFO') # 字典的get方法若没找到对应的键,则会返回None,比dict['key']更好
params = env.get('QUERY_STRING')
if url is None or url not in pattern_url.keys():
start_response('404 not found', [('content-type', 'text/plain')])
return [b'404 page not found']
res = pattern_url.get(url)
if res is None:
start_response('404 not found', [('content-type', 'text/plain')])
return [b'404 page not found']
start_response('200 ok', [('content_type', 'text/palin')])
return [res(params).encode()] # 获取到的params会作为参数传递给触发的函数方法中的行参request被打印出来
server = make_server('', 5001, app=app)
# 启动服务
server.serve_forever()
?以上返回的都是text/plain格式的,那如果我们想返回的是一个html或者json数据,怎么办?
答案:可以通过content-type来指定返回的类型,如:
[('content-type', 'text/html')]
[('content-type', 'application/json')]
?WSGI协议其实就是CGI协议的升级:在webserver和application中间起到桥梁作用。
?
|