一、路由

1.1 什么是路由

 简单说,就是路怎么走。就是按照不同的路径分发数据。

 URL就是不同资源的路径,不同路径应该对应不同的应用程序来处理。

 所以,代码中要增加对路径的分支处理。

 一个简单的路由需求:

路径 内容
/ 返回欢迎信息
/python 返回Hello Python
其它路径 返回404

1.2 什么时候处理路由

 路由的处理需要在WSGI Server接收到HTTP请求后,WSGI Server解包封装服务器环境变量,随后就应该对request.path做处理,根据path调用相应的应用程序。

1.3 如何处理路由

 路由处理最简单的就是条件判断,但需要判断严谨。

二、路由处理

2.1 条件判断

from wsgiref.simple_server import make_server
from webob import Request, Response, dec @dec.wsgify
def app(request) -> Response:
print(request.method)
print(request.path)
print(request.query_string)
print(request.GET)
print(request.POST)
print(request.params) res = Response() if request.path == '/':
res.status_code = 200
res.content_type = 'text/html'
res.charset = 'utf-8'
res.body = '<h1>北京欢迎您</h1>'.encode()
elif request.path == '/python':
res.content_type = 'text/plain'
res.charset = 'gb2312'
res.body = '<h1>Hello Python</h1>'.encode()
else:
res.status_code = 404
res.body = '<h1>Not found</h1>'.encode()
return res if __name__ == '__main__':
ip = '127.0.0.1'
port = 9999
server = make_server(ip, port, app)
try:
server.serve_forever()
except KeyboardInterrupt:
pass
finally:
server.shutdown()
server.server_close()

  

2.2 函数化条件匹配

from wsgiref.simple_server import make_server
from webob import Request, Response, dec def index(request: Request):
return Response('<h1>Welcome to BeiJing</h1>') def showpython(request: Request):
return Response('<h1>Hello Python</h1>') def notfound(request: Request):
res = Response()
res.body = '<h1>Not found</h1>'.encode()
res.status_code = 404
return res ROUTETABLE = {
'/': index,
'/python': showpython
} @dec.wsgify
def app(request) -> Response:
# if request.path == '/':
# return index(request)
# elif request.path == '/python':
# return showpython(request)
# else:
# return notfound(request)
return ROUTETABLE.get(request.path, notfound)(request) if __name__ == '__main__':
ip = '127.0.0.1'
port = 9999
server = make_server(ip, port, app)
try:
server.serve_forever()
except KeyboardInterrupt:
pass
finally:
server.shutdown()
server.server_close()

  

2.3 增加路由动态注册

from wsgiref.simple_server import make_server
from webob import Request, Response, dec def index(request: Request):
return Response('<h1>Welcome to BeiJing</h1>') def showpython(request: Request):
return Response('<h1>Hello Python</h1>') def notfound(request: Request):
res = Response()
res.body = '<h1>Not found</h1>'.encode()
res.status_code = 404
return res ROUTETABLE = {} def register(path, handler):
ROUTETABLE[path] = handler register('/', index)
register('/python', showpython) @dec.wsgify
def app(request) -> Response:
return ROUTETABLE.get(request.path, notfound)(request) if __name__ == '__main__':
ip = '127.0.0.1'
port = 9999
server = make_server(ip, port, app)
try:
server.serve_forever()
except KeyboardInterrupt:
pass
finally:
server.shutdown()
server.server_close()

  

2.4 路由封装成类

from wsgiref.simple_server import make_server
from webob import Request, Response, dec, exc class Application:
def notfound(self, request: Request):
res = Response()
res.status_code = 404
res.body = '<h1>Not found</h1>'.encode()
return res ROUTETABLE = {} @classmethod
def register(cls, path):
def _register(handler):
cls.ROUTETABLE[path] = handler
return handler return _register @dec.wsgify
def __call__(self, request) -> Response:
return self.ROUTETABLE.get(request.path, self.notfound)(request) @Application.register('/')
def index(request: Request):
return Response('<h1>Welcome to BeiJing</h1>') @Application.register('/python')
def showpython(request: Request):
return Response('<h1>Hello Python</h1>') if __name__ == '__main__':
ip = '127.0.0.1'
port = 9999
server = make_server(ip, port, Application())
try:
server.serve_forever()
except KeyboardInterrupt:
pass
finally:
server.shutdown()
server.server_close()

  

2.5 简化路由类

from wsgiref.simple_server import make_server
from webob import Request, Response, dec, exc class Application: ROUTETABLE = {} @classmethod
def register(cls, path):
def _register(handler):
cls.ROUTETABLE[path] = handler
return handler return _register @dec.wsgify
def __call__(self, request) -> Response:
try:
return self.ROUTETABLE[request.path](request)
except:
raise exc.HTTPNotFound('你访问的页面被外星人劫持了') @Application.register('/')
def index(request: Request):
return Response('<h1>Welcome to BeiJing</h1>') @Application.register('/python')
def showpython(request: Request):
return Response('<h1>Hello Python</h1>') if __name__ == '__main__':
ip = '127.0.0.1'
port = 9999
server = make_server(ip, port, Application())
try:
server.serve_forever()
except KeyboardInterrupt:
pass
finally:
server.shutdown()
server.server_close()

  

三、总结

 路由功能在设计时应该从最简单的方式开始,然后一步步的完善,比如:避免路由逻辑写死在代码中,代码优化。

[Python web开发] 路由实现 (三)的更多相关文章

  1. Redis的Python实践,以及四中常用应用场景详解——学习董伟明老师的《Python Web开发实践》

    首先,简单介绍:Redis是一个基于内存的键值对存储系统,常用作数据库.缓存和消息代理. 支持:字符串,字典,列表,集合,有序集合,位图(bitmaps),地理位置,HyperLogLog等多种数据结 ...

  2. windows下python web开发环境的搭建

    windows下python web开发环境: python2.7,django1.5.1,eclipse4.3.2,pydev3.4.1 一. python环境安装 https://www.pyth ...

  3. python web 开发学习路线

    转载,备着 自己目前学习python web 开发, 经过两个月的摸索,目前对web开发有了浅显的认识,把自己的学习过程贴出来.1.python入门推荐老齐<从零开始学python>,&l ...

  4. 转载:Python Web开发最难懂的WSGI协议,到底包含哪些内容?

    原文:PSC推出的第二篇文章-<Python Web开发最难懂的WSGI协议,到底包含哪些内容?>-2017.9.27 我想大部分Python开发者最先接触到的方向是WEB方向(因为总是有 ...

  5. Python Web开发:Django+BootStrap实现简单的博客项目

    创建blog的项目结构 关于如何创建一个Django项目,请查看[Python Web开发:使用Django框架创建HolleWorld项目] 创建blog的数据模型 创建一个文章类 所有开发都是数据 ...

  6. 2020 python web开发就业要求锦集

    郑州 Python程序员 河南三融云合信息技术有限公司 6-8k·12薪 7个工作日内反馈 郑州 1个月前 本科及以上2年以上语言不限年龄不限 微信扫码分享 收藏 Python程序员 河南三融云合信息 ...

  7. 《Python Web开发实战》|百度网盘免费下载|Python Web开发

    <Python Web开发实战>|百度网盘免费下载|Python Web开发 提取码:rnz4 内容简介 这本书涵盖了Web开发的方方面面,可以分为如下部分: 1. 使用最新的Flask ...

  8. Java Web开发和Python Web开发之间的区别

    今天的文章讨论了Java Web开发和Python Web开发之间的区别.我不鼓励我们在这里从Java Web迁移到Python Web开发.我只是想谈谈我的感受.它不一定适合所有情况,仅供我们参考. ...

  9. Python Web开发中的WSGI协议简介

    在Python Web开发中,我们一般使用Flask.Django等web框架来开发应用程序,生产环境中将应用部署到Apache.Nginx等web服务器时,还需要uWSGI或者Gunicorn.一个 ...

随机推荐

  1. [PHP] PHP数组的实现哈希表(HashTable)结构

    PHP中使用最为频繁的数据类型非字符串和数组莫属,使用哈希表实现的PHP数组.1.数据结构:保存哈希表容器,保存数据的容器2.哈希函数实现:需要尽可能的将不同的key映射到不同的槽(bucket)中, ...

  2. mysql数据导入mongoDB

    目前许多平台都会同时使用MySQL , mongoDB 两款数据库软件,他们之间的数据同步交换也是经常面临的问题,如何定时的进行数据交换同步是一个要面对的问题. 通过Treesoft数据库管理系统可以 ...

  3. csharp: 图片字符间距

    引用WINDOWS API: [DllImport("gdi32.dll", CharSet = CharSet.Auto)] public static extern int S ...

  4. WebService程序数据集之WSDL取数

    在通用的webservice集合中,在集合中使用wsdl取数的方式获取数据,并将数据转换为程序数据集,那么怎样通过wsdl取数并转换为程序数据集呢? 首先将wsdl获取到的数据数据转换为二维数组,然后 ...

  5. 如何提高 Java 中锁的性能

    锁不是问题的根源,锁之间的竞争才是 通常在多线程的代码中遇到性能方面的问题时,一般都会抱怨是锁的问题.毕竟锁会降低程序的运行速度和其较低的扩展性是众所周知的.因此,如果带着这种“常识”开始优化代码,其 ...

  6. 初识WCF3

    http://www.cnblogs.com/xiangchangdong/p/3924030.html 第三篇 在IIS中寄宿服务 通过前两篇的学习,我们了解了如何搭建一个最简单的WCF通信模型,包 ...

  7. switch结构可以更好的解决等值判断问题

    switch 选择结构的语法:switch (表达式){case 常量 1://代码块1:break;case 常量 2://代码块2:break;......default://代码块n:break ...

  8. 深入浅出SharePoint——常用的系统账号

    NT AUTHORITY\Authenticated Users添加此用户后所有windows认证的ad用户都被授权.注意添加的时候如果搜索不到,可以直接输入Authenticated Users,然 ...

  9. ZT 线程的分离状态 2012-08-16 17:00:59

    线程的分离状态 2012-08-16 17:00:59 分类: LINUX 其实在写上一篇日志的时候,由于我把创建线程的返回值的判断条件写错了,程序每次运行的时候都是显示创建线程失败,我就百度了一下, ...

  10. spark中利用Sql2o连接数据的例子BlogService

    最近在看学习Spark Framework. 这是一个web框架,宗旨正如其官网LInk所示:Spark - A micro framework for creating web applicatio ...