Python学习 - 编写一个简单的web框架(二)

在上一篇日志中已经讨论和实现了根据url执行相应应用,在我阅读了bottle.py官方文档后,按照bottle的设计重写一遍,主要借鉴大牛们的设计思想。

一个bottle.py的简单实例

来看看bottle是如何使用的,代码来自http://www.bottlepy.org/docs/0.12/index.html:

from bottle import route, run, template

@route(‘/hello/<name>‘)
def index(name):
    return template(‘<b>Hello {{name}}</b>!‘, name=name)

run(host=‘localhost‘, port=8080)

很显然,bottle是使用装饰器来路由的。根据bottle的设计,我来写一个简单的框架。

Python装饰器

装饰器,顾名思义就是包装一个函数。在不改变函数的同时,动态的给函数增加功能。这里不在探讨更多的细节。

大致的框架

根据WSGI的定义,一个WSGI应用必须要是可调用的。所以下面是一个WSGI应用的大致框架:

class WSGIapp(object):

    def __init__(self):
        pass

    def route(self,path=None):
        pass

    def __call__(self,environ,start_response):
        return self.wsgi(environ,start_response)

    def wsgi(self,environ,start_response):
        pass

其中,route方法就是来保存url->target的。这里为了方便,将url->target保存在字典中:

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

这里return func注释掉也可以,求大神解释一下啊!!

然后就是实现WSGIapp的每个方法:

class WSGIapp(object):

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

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

    def __call__(self,environ,start_response):
        print ‘call‘
        return self.wsgi(environ,start_response)

    def wsgi(self,environ,start_response):
        path = environ[‘PATH_INFO‘]
        print path
        if path in self.routes:
            status = ‘200 OK‘
            response_headers = [(‘Content-Type‘,‘text/plain‘)]
            start_response(status,response_headers)
            print self.routes[path]()
            return self.routes[path]()
        else:
            status = ‘404 Not Found‘
            response_headers = [(‘Content-Type‘,‘text/plain‘)]
            start_response(status,response_headers)
            return ‘404 Not Found!‘
app = WSGIapp()
@app.route(‘/‘)
def index():
    return [‘This is index‘]
@app.route(‘/hello‘)
def hello():
    return [‘hello‘]

from wsgiref.simple_server import make_server
httpd = make_server(‘‘,8000,app)
print ‘start....‘
httpd.serve_forever()

这样,一个简易的web框架的雏形就实现了,如果对装饰器中的路径加入正则表达式,那么就可以很轻松的应对URL了。下一篇日志就是加入模板引擎jinja2了。

时间: 2024-07-30 03:14:32

Python学习 - 编写一个简单的web框架(二)的相关文章

Python学习 - 编写一个简单的web框架(一)

自己动手写一个web框架,因为我是菜鸟,对于python的一些内建函数不是清楚,所以在写这篇文章之前需要一些python和WSGI的预备知识,这是一系列文章.这一篇只实现了如何处理url. 参考这篇文章:http://www.cnblogs.com/russellluo/p/3338616.html 预备知识 web框架主要是实现web服务器和web应用之间的交互.底层的网络协议主要有web服务器完成.譬如监听端口,填充报文等等. Python内建函数__iter__和__call__和WSGI

一个简单的web框架实现

一个简单的web框架实现 #!/usr/bin/env python # -- coding: utf-8 -- __author__ = 'EchoRep' from wsgiref.simple_server import make_server def index(): # data = open('html/index.html').read() return data def echo(): # data = open('html/echo.html').read() return d

编写一个简单的Web应用

上一篇我们搭建了一个简单的Web应用:http://www.cnblogs.com/lay2017/p/8468515.html 本文将基于上一篇搭建的应用,编写一些内容 编写Servlet类 编写JSP页面 首先我们添加目录结构如下: 这里在java类目录下添加了cn.lay目录,并创建了HelloServlet的Java文件 在webapp/WEB-INF目录下创建了jsp目录,并创建了hello.jsp文件 HelloServlet.java package cn.lay; import

python web编程(一): web流程,手写一个简单的web框架

# -*- coding: utf-8 -*-__author__ = 'xzq' '''1. HTTP: 特点: 1>. 请求/响应模式 2>. 无状态协议, Client每一次访问都会被Server当作是第一次访问 (Cookie, Session) Request: POST /index.html HTTP/1.1 # 请求方法 url 协议版本 Header: Host: www.bilibili.com # 请求域名 --> DNS Connection: keep-aliv

使用Python来编写一个简单的感知机

https://blog.dbrgn.ch/2013/3/26/perceptrons-in-python/ 目前,我在HSR上参加了一个神经网络和机器学习的课程,其中学习到一个最简单的神经网络模型,就是感知机(perceptronperceptronperceptron). 背景资料 最简单的神经网络的模型就是感知机分类器,它有不同的输入(x1, x2,......xn),然后有不同的权重值(w1, w2,......Wn),如下式计算: 每个对应的权重值与输入值进行相乘,再相加在一起,然后通

使用js编写一个简单的运动框架

下班后,,没事捣鼓捣鼓个人的小爱好. 首先,说明我的这个运动框架(css所有属性)也是常见的框架一种,健壮性并不是太好,对于新手学习倒是挺好,,若是大神,老司机请拐弯. 上来,我们先定义一个区块,然后在关联一个可以实时看到属性值发生变化值的标签. html: <body> <div id = "div1"> </div> <input type = "text" id = "txt1"> </

自定义一个简单的web框架

from wsgiref.simple_server import make_server def book(request):     #视图函数 return [b'<h1> book !!! </h1>']def web(request): return [b'<h1> web !!! </h1>'] def routers(): urlpatterns = ( ('/book',book),      #url 映射    ('/web',web),

【Java学习笔记】如何写一个简单的Web Service

本Guide利用Eclipse以及Ant建立一个简单的Web Service,以演示Web Service的基本开发过程: 1.系统条件: Eclipse Java EE IDE for Web Developers Java SE 6 Windows XP 2.基本环境搭建: 1)Java SE6 JDK的安装:下载Java SE6 JDK,双击,安装默认选项进行安装即可. 2)Eclipse的安装与配置: 安装时直接解压.     配置处有两点,Window>Preferences>Jav

简单的web框架(python)

1.web框架介绍 Web框架(Web framework)是一种开发框架,用来支持动态网站.网络应用和网络服务的开发.这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法.web框架已经实现了很多功能,开发人员使用框架提供的方法并且完成自己的业务逻辑,就能快速开发web应用了.浏览器和服务器的是基于HTTP协议进行通信的.也可以说web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使用的方法,大大提高了开发的效率. 2.实现简单的web框架 基于so