python程序框架的描述_简单介绍Python下自己编写web框架的一些要点

在正式开始Web开发前,我们需要编写一个Web框架。

为什么不选择一个现成的Web框架而是自己从头开发呢?我们来考察一下现有的流行的Web框架:

Django:一站式开发框架,但不利于定制化;

web.py:使用类而不是更简单的函数来处理URL,并且URL映射是单独配置的;

Flask:使用@decorator的URL路由不错,但框架对应用程序的代码入侵太强;

bottle:缺少根据URL模式进行拦截的功能,不利于做权限检查。

所以,我们综合几种框架的优点,设计一个简单、灵活、入侵性极小的Web框架。

设计Web框架

一个简单的URL框架应该允许以@decorator方式直接把URL映射到函数上:

# 首页:

@get('/')

def index():

return '

Index page

'

# 带参数的URL:

@get('/user/:id')

def show_user(id):

user = User.get(id)

return 'hello, %s' % user.name

有没有@decorator不改变函数行为,也就是说,Web框架的API入侵性很小,你可以直接测试函数show_user(id)而不需要启动Web服务器。

函数可以返回str、unicode以及iterator,这些数据可以直接作为字符串返回给浏览器。

其次,Web框架要支持URL拦截器,这样,我们就可以根据URL做权限检查:

@interceptor('/manage/')

def check_manage_url(next):

if current_user.isAdmin():

return next()

else:

raise seeother('/signin')

拦截器接受一个next函数,这样,一个拦截器可以决定调用next()继续处理请求还是直接返回。

为了支持MVC,Web框架需要支持模板,但是我们不限定使用哪一种模板,可以选择jinja2,也可以选择mako、Cheetah等等。

要统一模板的接口,函数可以返回dict并配合@view来渲染模板:

@view('index.html')

@get('/')

def index():

return dict(blogs=get_recent_blogs(), user=get_current_user())

如果需要从form表单或者URL的querystring获取用户输入的数据,就需要访问request对象,如果要设置特定的Content-Type、设置Cookie等,就需要访问response对象。request和response对象应该从一个唯一的ThreadLocal中获取:

@get('/test')

def test():

input_data = ctx.request.input()

ctx.response.content_type = 'text/plain'

ctx.response.set_cookie('name', 'value', expires=3600)

return 'result'

最后,如果需要重定向、或者返回一个HTTP错误码,最好的方法是直接抛出异常,例如,重定向到登陆页:

raise seeother('/signin')

返回404错误:

raise notfound()

基于以上接口,我们就可以实现Web框架了。

实现Web框架

最基本的几个对象如下:

# transwarp/web.py

# 全局ThreadLocal对象:

ctx = threading.local()

# HTTP错误类:

class HttpError(Exception):

pass

# request对象:

class Request(object):

# 根据key返回value:

def get(self, key, default=None):

pass

# 返回key-value的dict:

def input(self):

pass

# 返回URL的path:

@property

def path_info(self):

pass

# 返回HTTP Headers:

@property

def headers(self):

pass

# 根据key返回Cookie value:

def cookie(self, name, default=None):

pass

# response对象:

class Response(object):

# 设置header:

def set_header(self, key, value):

pass

# 设置Cookie:

def set_cookie(self, name, value, max_age=None, expires=None, path='/'):

pass

# 设置status:

@property

def status(self):

pass

@status.setter

def status(self, value):

pass

# 定义GET:

def get(path):

pass

# 定义POST:

def post(path):

pass

# 定义模板:

def view(path):

pass

# 定义拦截器:

def interceptor(pattern):

pass

# 定义模板引擎:

class TemplateEngine(object):

def __call__(self, path, model):

pass

# 缺省使用jinja2:

class Jinja2TemplateEngine(TemplateEngine):

def __init__(self, templ_dir, **kw):

from jinja2 import Environment, FileSystemLoader

self._env = Environment(loader=FileSystemLoader(templ_dir), **kw)

def __call__(self, path, model):

return self._env.get_template(path).render(**model).encode('utf-8')

把上面的定义填充完毕,我们就只剩下一件事情:定义全局WSGIApplication的类,实现WSGI接口,然后,通过配置启动,就完成了整个Web框架的工作。

设计WSGIApplication要充分考虑开发模式(Development Mode)和产品模式(Production Mode)的区分。在产品模式下,WSGIApplication需要直接提供WSGI接口给服务器,让服务器调用该接口,而在开发模式下,我们更希望能通过app.run()直接启动服务器进行开发调试:

wsgi = WSGIApplication()

if __name__ == '__main__':

wsgi.run()

else:

application = wsgi.get_wsgi_application()

因此,WSGIApplication定义如下:

class WSGIApplication(object):

def __init__(self, document_root=None, **kw):

pass

# 添加一个URL定义:

def add_url(self, func):

pass

# 添加一个Interceptor定义:

def add_interceptor(self, func):

pass

# 设置TemplateEngine:

@property

def template_engine(self):

pass

@template_engine.setter

def template_engine(self, engine):

pass

# 返回WSGI处理函数:

def get_wsgi_application(self):

def wsgi(env, start_response):

pass

return wsgi

# 开发模式下直接启动服务器:

def run(self, port=9000, host='127.0.0.1'):

from wsgiref.simple_server import make_server

server = make_server(host, port, self.get_wsgi_application())

server.serve_forever()

Try

把WSGIApplication类填充完毕,我们就得到了一个完整的Web框架。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个关于 Python Web 框架性能对比以及如何使用 Gunicorn 和 Gevent 提高 Python Web 框架性能的问题。下面是我的回答: Python Web 框架性能对比 Python 有很多优秀的 Web 框架,如 Django、Flask、Tornado、Bottle 等等。这些框架都有自己的特点和优缺点,但是在性能方面却有所不同。下面是一些常见 Python Web 框架的性能对比数据: 框架 | Requests/s -----|---------- Flask| 673.24 Django| 372.77 Bottle| 3,040.36 Tornado| 3,714.29 从上表可以看出,Tornado 和 Bottle 性能比较突出,而 Django 和 Flask 的性能稍逊一些。但是这些数据并不是绝对的,实际性能还需要根据具体的应用场景和实现方式进行测试和评估。 使用 Gunicorn 和 Gevent 提高 Python Web 框架的性能 Gunicorn 和 Gevent 都是 Python Web 服务器,它们可以与常见的 Python Web 框架配合使用,提高 Web 应用的性能。 具体来说,Gunicorn 是一个使用 Python 编写的 WSGI HTTP 服务器,可以用于部署 Django、Flask 等 Web 应用。Gunicorn 使用多进程的方式来提高并发处理能力,可以根据系统的 CPU 核数来设置进程数,同时还支持异步处理和负载均衡等特性。 Gevent 是一个基于协程的 Python 网络库,可以用于编写高性能的网络应用程序。Gevent 可以与 Python Web 框架配合使用,使用协程来处理请求,可以显著提高 Web 应用的并发处理能力和响应速度。 下面是一个使用 Gunicorn 和 Gevent 提高 Flask Web 应用性能的示例代码: ``` python from gevent import monkey monkey.patch_all() from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return 'Hello, World!' if __name__ == '__main__': from gunicorn.app.base import BaseApplication from gunicorn.six import iteritems class StandaloneApplication(BaseApplication): def __init__(self, app, options=None): self.options = options or {} self.application = app super(StandaloneApplication, self).__init__() def load_config(self): config = dict([(key, value) for key, value in iteritems(self.options) if key in self.cfg.settings and value is not None]) for key, value in iteritems(config): self.cfg.set(key.lower(), value) def load(self): return self.application options = { 'bind': '0.0.0.0:8000', 'workers': 4, } StandaloneApplication(app, options).run() ``` 上面的代码使用了 Gunicorn 和 Gevent 来启动一个 Flask Web 应用,同时设置了 4 个 worker 进程来处理请求。这样可以显著提高 Web 应用的性能和并发处理能力。 希望这个回答对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值