装饰器实现路由控制

简介: part 1def application(env, start_response): print(env['PATH_INFO']) status = '200 OK' response_headers = [('Content-Type', ...

part 1

def application(env, start_response):
    print(env['PATH_INFO'])
    status = '200 OK'
    response_headers = [('Content-Type', 'text/html')]
    start_response(status, response_headers)
    return ['您请求的路径为:{}'.format(env['PATH_INFO']).encode('utf8')]
from webapplication import application as app
from wsgiref.simple_server import make_server


server = make_server('', 8080, app)
server.serve_forever()

请求: http://localhost:8080/home

/home路径

请求: http://localhost:8080

网站根目录

part 2

先前博主的那个装饰器实现的路由控制只能在Python2.7上运行,到了3就不好使了。然后本人又修改了一下,实现可以在Python3上运行。

# coding: utf8
import sys
from wsgiref.simple_server import make_server


class Router(object):

    def __init__(self):
        self.routes = {}

    def route(self, path):
        def decorator(func):
            self.routes[path] = func
            print(self.routes)
            return func
        return decorator

    def __call__(self, env, start_response):
        path = env['PATH_INFO']
        if path in self.routes:
            status = '200 OK'
            headers = [('Content-Type', 'text/html;charset=UTF-8')]
            start_response(status, headers)
            # 然后可以通过route绑定的函数来处理相关的星球,然后返回给客户端
            # return ['您请求的路径为:{}'.format(path).encode('utf8')]
            return self.routes[path]()
        else:
            status = '404 Not Found'
            headers = [('Content-Type', 'text/html;charset=UTF-8')]
            start_response(status, headers)
            return [b'Bad Request']


app = Router()

@app.route('/')
def index():
    print('首页内容')
    yield 'root path'.encode('utf8')

@app.route('/home')
def home():
    print('home页面内容')
    yield 'home页面内容'.encode('utf8')

server = make_server('', 8080, app)
server.serve_forever()

访问没有路由跟踪的路径

易错点

总的来说,实现一个带有路由跟踪的web服务还是挺方便的。但是到目前为止,这点知识还远远不够。headers的控制可谓是耗时耗力的一个操作。

  • 路由更新:通过装饰器可以方便的进行添加
  • handler函数(被装饰器修饰的处理函数)的返回值应该是可迭代的。与Python2不同(返回一个列表即可),Python3中最好是使用yield来实现。
  • __call__方法每次对象被调用都会触发一次,牢记这点。

下一步,尝试着写出一个自己的web框架,当然是在开发环境下了。


参考链接:

然后是针对WSGI标准实现的不同的web application.

目录
相关文章
|
6月前
|
网络架构
vue-router4 |name的作用|query传参|parmas传参|动态路由参数|命名视图|别名alias|前置路由守卫|路由过渡效果|滚动行为
vue-router4 |name的作用|query传参|parmas传参|动态路由参数|命名视图|别名alias|前置路由守卫|路由过渡效果|滚动行为
|
17天前
|
JavaScript 前端开发 测试技术
Redux 动态路由与传统路由的区别
【10月更文挑战第22天】Redux 动态路由在路由状态管理、数据加载与关联、组件渲染与更新、路由参数处理、导航与历史管理、可测试性以及代码结构与可维护性等方面都具有明显的优势,能够为开发者提供更强大、更灵活和更易于维护的路由解决方案,尤其适用于大型复杂的前端应用开发。
28 2
|
1月前
|
缓存 JavaScript 前端开发
vue-router学习二:动态路由(路由传递数据的一种方式),路由懒加载,嵌套路由,路由传递参数方式,导航守卫,keep-alive标签
这篇文章主要介绍了Vue Router的高级用法,包括动态路由、路由懒加载、嵌套路由、路由参数传递、导航守卫以及keep-alive的使用。
34 0
vue-router学习二:动态路由(路由传递数据的一种方式),路由懒加载,嵌套路由,路由传递参数方式,导航守卫,keep-alive标签
|
5月前
如何实现嵌套路由
如何实现嵌套路由
30 1
|
2月前
|
测试技术
在路由守卫中使用箭头函数的注意事项
在路由守卫中使用箭头函数的注意事项
|
3月前
|
网络协议 算法 网络架构
动态路由
【8月更文挑战第18天】动态路由
48 3
|
6月前
|
XML 前端开发 JavaScript
现代接口中的路由处理方式
【5月更文挑战第10天】本文介绍了FastAPI的路由和响应处理。它允许将查询参数如`skip`和`limit`用于URL,并自动进行类型转换和验证。路径装饰器允许配置操作,如添加元数据、响应模型和状态码。 介绍了使用通配符处理多种请求。I作为高性能接口框架的特点,还需根据需求评估其适用性。
122 10
现代接口中的路由处理方式
|
6月前
|
XML 前端开发 JavaScript
现代的接口路由处理方式
【5月更文挑战第14天】FastAPI允许绑定路由到路由组,处理查询参数,如`skip`和`limit`,支持默认值和可选参数。查询参数自动转换并校验类型。路径装饰器用于配置操作,如添加元数据、响应模型和状态码。 通配符(*)可用于允许所有源,但处理凭据时需谨慎。FastAPI提供高性能和灵活性,适合特定业务场景。
345 2
|
6月前
|
网络架构
怎么定义vue-router的动态路由?怎么获取传过来的动态参数?
怎么定义vue-router的动态路由?怎么获取传过来的动态参数?
路由策略与路由控制
路由策略与路由控制