Werkzeug库以及wrapper模块

作者:杭州车成汽车事务代理服务部 来源:www.guohuicar.com 发布时间:2017-09-03 12:52:35
Werkzeug库以及wrapper模块

Werkzeug库以及wrapper模块

简介

Werkzeug是一个Python写成的WSGI工具集。它遵循WSGI规范,对服务器和Web应用之间的“中间层”进行了开发,衍生出一系列非常有用的Web服务底层模块。关于Werkzeug功能的最简单的一个例子如下:

from werkzeug.wrappers import Request, Response

def application(environ, start_response):

request = Request(environ)

response = Response("Hello %s!" % request.args.get('name', 'World!'))

return response(environ, start_response)

if __name__ == '__main__':

from werkzeug.serving import run_simple

run_simple('localhost', 4000, application)

运行上面的例子,当在浏览器输入:4000/就会向本地的服务器发出一个请求。在请求的过程中,werkzeug主要做了下面几件事情:

根据服务器和WSGI服务器产生的environ环境信息,封装一个Request实例,这个实例包含请求的所有信息;

Web应用根据封装的Request实例信息,产生一个Response实例(上述例子只是输出一段字符串)。这个Response实例是一个可调用的WSGI应用;

上一步骤产生的可调用应用对象response调用response(environ, start_response)生成响应信息并发回客户端。调用函数是由WSGI规范规定的。

以上过程很好地将服务器和web应用分离开来:服务器不用考虑请求信息怎么被解析给web应用,以及后续怎么和web应用通信;web应用也不用考虑怎么将响应信息返回给服务器。服务器要做的只是提供web应用所需的请求信息,web应用提供的也只是响应信息,中间的处理过程werkzeug可以帮助完成。

wrappers模块

Werkzeug库中的wrappers模块主要对request和response进行封装。request包含了客户端发往服务器的所有请求信息,response包含了web应用返回给客户端的所有信息。wrappers模块对请求和响应的封装简化了客户端、服务器和web应用通信的流程。本文主要介绍wrappers模块中重要的类。

BaseRequest

BaseRequest是一个非常基础的请求类,它可以和其他的“混合”类结合在一起构建复杂的请求类。只要传递一个环境变量environ(由WSGI服务器根据请求产生),便可以构造一个BaseRequest实例。其构造函数如下:

def__init__(self,environ,populate_request=True,shallow=False):

self.environ=environ

ifpopulate_requestandnotshallow:

self.environ['werkzeug.request']=self

self.shallow=shallow

初始化后,形成的实例request便具有了一些属性可以访问,这些属性只能以“只读”的方式访问。例如:

url_charset

want_form_data_parsed

stream

args

data

form

values

files

cookies

headers

path

full_path

script_root

url

base_url

url_root

host_url

host

access_route

remote_addr

BaseRequest中还有两个类方法比较常用:

from_values(cls, *args, kwargs)**

@classmethod

deffrom_values(cls,*args,**kwargs):

"""Create a new request object based on the values provided.If

environ is given missing values are filled from there.This method is

useful for small scripts when you need to simulate a request from an URL.

Do not use this method for unittesting, there is a full featured client

object (:class:`Client`) that allows to create multipart requests,

support for cookies etc.

This accepts the same options as the

:class:`~werkzeug.test.EnvironBuilder`.

.. versionchanged:: 0.5

This method now accepts the same arguments as

:class:`~werkzeug.test.EnvironBuilder`.Because of this the

`environ` parameter is now called `environ_overrides`.

:return: request object

"""

fromwerkzeug.testimportEnvironBuilder

charset=kwargs.pop('charset',cls.charset)

kwargs['charset']=charset

builder=EnvironBuilder(*args,**kwargs)

try:

returnbuilder.get_request(cls)

finally:

builder.close()

这个类方法可以根据提供的参数构建一个请求。

application(cls, f)

@classmethod

defapplication(cls,f):

"""Decorate a function as responder that accepts the request as first

argument.This works like the :func:`responder` decorator but the

function is passed the request object as first argument and the

request object will be closed automatically::

@Request.application

def my_wsgi_app(request):

return Response('Hello World!')

:param f: the WSGI callable to decorate

:return: a new WSGI callable

"""

#: return a callable that wraps the -2nd argument with the request

#: and calls the function with all the arguments up to that one and

#: the request.The return value is then called with the latest

#: two arguments.This makes it possible to use this decorator for

#: both methods and standalone WSGI functions.

defapplication(*args):

request=cls(args[-2])

withrequest:

returnf(*args[:-2]+(request,))(*args[-2:])

returnupdate_wrapper(application,f)

这个类方法是一个装饰器,可以用来装饰WSGI可调用对象或函数。

以上属性和方法的具体用法可以参考Request——werkzeug文档。

BaseResponse

BaseResponse类是一个响应类,用它可以封装一个response对象。response对象最大的特点是它是一个WSGI应用。

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:襄阳网站建设 http://xiangyang.45qun.com

  • 上一篇:Java设计模式——工厂模式
  • 下一篇:最后一页
  • 
    COPYRIGHT © 2015 杭州车成汽车事务代理服务部 ALL RIGHTS RESERVED.
    本站所有原创信息,未经许可请勿任意转载或复制使用 网站地图 技术支持:肥猫科技
    精彩专题:网站建设
    购买本站友情链接、项目合作请联系客服QQ:2500-38-100