开发者学堂课程【Python入门 2020年版: 使用字典管理请求路径】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10486
使用字典管理请求路径
内容介绍
一、HTTP 服务器函数封装
二、使用字典管理路径
一、HTTP 服务器函数封装
代码:
import json
from wsgiref.simple_server import make_server
def load_file(file_name,**kwargs):
try:
with open(
‘page/’+file_name,’r’,encoding=’utf8’) as file:
content=file.read()
if kwargs:
content=content.format(**kwargs)
return content
except FileNotFoundError print(‘文件未找到’)
def demo_app(environ,start_response):
path=environ[
‘PATH_INFO’]
status_code=’200 OK’
if path == '/':
response =
’欢迎来到我的首页'
elif path =='/test':
response = json.dumps({
‘name’:’zhangsan’,’age’:18})
elif path ==
‘/demo' :
response=load_file(
‘xxxx.txt’)
elif path ==
‘/hello' :
response=load_file(
‘hello.html’)
elif path ==
‘/info' :
response=load_file(
‘info.html’,username=’zhangsan’,age=19,gender=’male’)
else:
status_code=
’404 Not Found’
response = '页面走丢了’
start_response(
‘status_code’,[(‘Content-Type,’text/html;charset=utf8’)])
return [‘response’.encode(‘utf8’)]
if_ name_=='_ main_ ':
httpd : make_server(
‘’, 8080, demo_app):
sa = httpd.socket. getsockname()
print("Serving HTTP on", sa[0], "port", sa[1], "...")
httpd.serve_forever()
现在这个代码还是不够好的,而且这整个代码会非常的复杂,如果请求路径有很多,这里代码请求路径就五个,而且非常简洁,如果代码很多,都写在 response=...就会非常麻烦。
HTTP 服务器函数封装:
import json
from wsgiref.simple_server import make_server
def load_file(file_name,**kwargs):
try:
with open(
‘page/’+file_name,’r’,encoding=’utf8’) as file:
content=file.read()
if kwargs:
content=content.format(**kwargs)
return content
except FileNotFoundError
print(‘文件未找到’)
def index():
return‘欢迎来到我的首页’
def show_test():
return json.dumps({‘name’:’zhangsan’,’age’:18})
def show_demo():
return load_file(‘xxxx.txt’)
def show_hello():
return load_file(‘hello.html’)
def show_info():
return load_file(‘info.html’,username=’zhangsan’,age=19,gender=’male’)
def demo_app(environ,start_response):
path=environ[
‘PATH_INFO’]
status_code=’200 OK’
if path == '/':
response =index()
elif path =='/test':
response =show_test()
elif path ==
‘/demo' :
response=show_demo()
elif path ==
‘/hello' :
response=show_hello()
elif path ==
‘/info' :
response=show_info()
else:
status_code=
’404 Not Found’
response = '页面走丢了’
start_response(
‘status_code’,[(‘Content-Type,’text/html;charset=utf8’)])
return [‘response’.encode(‘utf8’)]
if_ name_=='_ main_ ':
httpd : make_server(
‘’, 8080, demo_app):
sa = httpd.socket. getsockname()
print("Serving HTTP on", sa[0], "port", sa[1], "...")
httpd.serve_forever()
之前的代码是一个一个调的,现在把它变成函数了。如果有100行代码,只要管理函数就行了。
现在这个代码还是不够好,如果再有一个新的路径 elif path == ‘/foo' :
response=show_foo(),如果有很多路径,比如有100个,这样写就很麻烦,我们不这样写,可以用字典管理路径。
三、使用字典管理路径
1.怎么写
先定义一个全局变量,是字典,注意字典里写‘/’:index 不加括号。请求的是’/’,拿到的是 index 这个函数,再写 method,这是一个函数,调用这个函数,再把结果给到 response。
如果直接写 method=url[path] response=method(),就会出现 bug,如果人家访问的页面不存在就会崩,所以要有判断。
代码:
import json
from wsgiref.simple_server import make_server
def load_file(file_name,**kwargs):
try:
with open(
‘page/’+file_name,’r’,encoding=’utf8’) as file:
content=file.read()
if kwargs:
content=content.format(**kwargs)
return content
except FileNotFoundError
print(‘文件未找到’)
def index():
return‘欢迎来到我的首页’
def show_test():
return json.dumps({‘name’:’zhangsan’,’age’:18})
def show_info():
return load_file(
‘info.html’,username=’zhangsan’,age=19,gender=’male’)
url={‘/’:index,
’/test’:show_test,
’/demo’:show_demo,
’hello’:show_hello
’info’:show_info
}
def demo_app(environ,start_response):
path=environ[
‘PATH_INFO’]
status_code=’200 OK’
method=url.get(path)
if method:
response=method()
else:
status_code=
’404 Not Found’
response = '页面走丢了’
start_response(
‘status_code’,[(‘Content-Type,’text/html;charset=utf8’)])
return [‘response’.encode(‘utf8’)]
if_ name_=='_ main_ ':
httpd : make_server(
‘’, 8080, demo_app):
sa = httpd.socket. getsockname()
print("Serving HTTP on", sa[0], "port", sa[1], "...")
httpd.serve_forever()
这时代码就看着清爽多了,如果有新的请求,demo_app 那段函数就不用动了。
2.如果又有新的请求/foo 怎么写
代码:
print(‘文件未找到’)
’/test’:show_test,
’/demo’:show_demo,
’hello’:show_hello
’info’:show_info
‘/foo’:show_foo
}
def demo_app(environ,start_response):
path=environ[
‘PATH_INFO’]
status_code=’200 OK’
method=url.get(path)
if method:
response=method()
else:
status_code=
’404 Not Found’
response = '页面走丢了’
start_response(
‘status_code’,[(‘Content-Type,’text/html;charset=utf8’)])
return [‘response’.encode(‘utf8’)]
if_ name_=='_ main_ ':
httpd : make_server(
‘’, 8080, demo_app):
sa = httpd.socket. getsockname()
print("Serving HTTP on", sa[0], "port", sa[1], "...")
httpd.serve_forever()
运行访问都是正确的。有新的请求就再写一个新函数,再在字典里加入一个新的路径匹配就可以了,写的这个就是一个小框架。