导入必要的模块
代码语言:javascript复制from wsgiref.simple_server import make_server
from utils import load_html, load_template
这两行代码首先导入了make_server
函数和自定义的load_html
、load_template
函数,以便后续使用。
创建路由字典
代码语言:javascript复制g_url_route = {}
定义了一个全局变量g_url_route
作为路由字典,用于保存请求路径和处理函数之间的对应关系。
装饰器函数route
代码语言:javascript复制def route(url):
def handle_action(action):
g_url_route[url] = action
def do_action(start_response):
return action(start_response)
return do_action
return handle_action
route
是一个装饰器函数,在定义路由时使用。它接受一个url
参数,并返回一个内部函数handle_action
。在内部函数中,它将请求路径url
与处理函数action
进行关联,并定义了一个新的函数do_action
,该函数接受start_response
参数并执行action
函数。最后返回do_action
函数。
路由定义及处理函数
代码语言:javascript复制@route('/index.html')
@route('/')
def show_home(start_response):
return load_html('/index.html', start_response)
这是一个示例,使用route
装饰器定义了两个路由:/index.html
和/
,并将它们分别与show_home
函数关联起来。当请求路径匹配到这两个路由之一时,将执行show_home
函数。
@route('/test.html')
def show_test(start_response):
start_response('200 OK', [('Content-Type', 'text/html;charset=utf-8')])
return ['我是一段普通的文字'.encode('utf-8')]
这是另一个示例,使用route
装饰器定义了一个路由/test.html
,并将其与show_test
函数关联起来。当请求路径匹配到该路由时,将执行show_test
函数。该函数设置了响应头信息,并返回一段普通的文字作为响应内容。
@route('/info.html')
def show_info(start_response):
return load_template('/info.html', start_response, name='张三', age=18)
同样使用route
装饰器定义了一个路由/info.html
,并将其与show_info
函数关联起来。当请求路径匹配到该路由时,将执行show_info
函数。该函数使用load_template
函数加载/info.html
模板,并传入name
和age
参数进行渲染。
请求处理函数application
代码语言:javascript复制def application(environ, start_response):
file_name = environ.get('PATH_INFO')
try:
return g_url_route[file_name](start_response)
except Exception:
start_response('404 NOT FOUND', [('Content-Type', 'text/html;charset=utf-8')])
return ['对不起,界面未找到'.encode('utf-8')]
application
函数是WSGI应用程序的入口点。它接受environ
和start_response
两个参数,用于处理HTTP请求。首先,获取请求路径file_name
。然后,尝试从路由字典中找到匹配的处理函数,并执行该函数。如果找不到对应的处理函数,则返回404状态码及相应的错误信息。
服务器启动并监听
代码语言:javascript复制if __name__ == '__main__':
httpd = make_server('', 8000, application)
print("Serving HTTP on port 8000...")
httpd.serve_forever()
这部分代码用于启动服务器并监听指定端口(8000)。当程序被直接运行时(而不是作为模块导入),将创建一个WSGI服务器并调用application
函数来处理请求。同时打印提示信息表示服务器正在运行,并通过httpd.serve_forever()
实现持续监听。
完整代码
代码语言:javascript复制from wsgiref.simple_server import make_server
from utils import load_html, load_template
g_url_route = {}
def route(url):
def handle_action(action):
g_url_route[url] = action
def do_action(start_response):
return action(start_response)
return do_action
return handle_action
@route('/index.html')
@route('/')
def show_home(start_response):
return load_html('/index.html', start_response)
@route('/test.html')
def show_test(start_response):
start_response('200 OK', [('Content-Type', "text/html;charset=utf-8")])
return ['我是一段普通的文字'.encode('utf-8')]
@route('/info.html')
def show_info(start_response):
return load_template('/info.html', start_response, name='张三', age=18)
def application(environ, start_response):
file_name = environ.get('PATH_INFO')
try:
return g_url_route[file_name](start_response)
except Exception:
start_response('404 NOT FOUND', [('Content-Type', 'text/html;charset=utf-8')])
return ['对不起,界面未找到'.encode('utf-8')]
if __name__ == '__main__':
httpd = make_server('', 8000, application)
print("Serving HTTP on port 8000...")
httpd.serve_forever()