全局环境

Uliweb提供了必要的运行环境和运行对象,因此我称之为全局环境。

对象

有一些全局性的对象可以方便地从 uliweb 中导入,如:

from uliweb import (application, request, response,
    settings, Request, Response)

application

它是用来记录整个Uliweb项目的运行实例,全局唯一。application是 uliweb.core.SimpleFrame.Dispatcher 的实例,它有一些属性和方法可以让你使用,例如:

apps
将列举出当前application实例所有有效的App名称。它是一个list,比如: ['Hello', 'uliweb.contrib.staticfiles']
apps_dir
当前application的apps的目录。
template_dirs
缺省为当前application所有有效的App的template搜索目录的集合。
get_file(filename, dir=’static’)
从所有App下的相应的目录,缺省是从static目录下查找一个文件。并且会先在当前请求对应 的App下先进行查找,如果没找到,则去其它的App下的相应目录进行查找。
template(filename, vars=None, env=None)

渲染一个模板,会先从当前请求对应的App下先进行查找模板文件。vars是一个dict对象。env 不提供的话会使用缺省的环境。如果想向模板中注入其它的对象,但不是以vars方式提供,不用 直接修改env,而是通过dispatch功能,绑定: prepare_view_env 主题就可以了。

它会返回渲染后的结果,是字符串。

render(filename, vars, env=None)
它很象template,不过它是直接返回一个Response对象,而不是字符串。

Request

而这里的Request类是基于werkzeug的Request来派生的,区别在于:

增加了一些兼容性的内容。原来的werkzeug的Request是没有象GET, POST, params, FILES这 样的属性的,它们分别是:args, form, values, files,为了与其它的Request类兼容,我 添加了GET, POST, params, FILES属性。

Response

它也对werkzeug提供的Response进行了派生,区别在于:

添加了一个write方法。而原werkzeug的Response类有一个stream属性,它有write方法。经过 扩展,可以直接使用write方法,会更方便一些。

request

request 是上面 Request 类的实例的一个代理对象,并不是一个真正的 Request 对象, response 也是。但是你可以把它当成真正的 Request 和 Response 一样来使用。那么为什 么要这样,为了方便。真正的 Request 和 Response 对象会在收到一个请求时被创建 ,然后存放到 local 中,这样不同的线程将有不同实例。为了方便使用,采用代理方式, 这样用户就不用直接调用 local.reuqest 和 local.response ,而是简单使用 request 和 response 就可以根据不同的线程使用不同的对象了。

Note

request和response是有生存周期的,就是在收到请求时创建,在返回后失效。因此在使用它们 时,要确保你是在它们的生存周期中进行使用的。

在讲View的环境时提到过:写一个view方法时有一些对象可以认为是全局的,其中就包括request和 response,但是这两个对象与其它的不同就是因为它是线程相关并且有生存周期的,其它的则是全局唯 一,并且生存周期是整个运行实例的生存周期。这样,在非view函数中想要使用request和response 对象,一种方式就是在view中传入,但是可能有些麻烦,另一种方式就是通过uliweb来导入,这样就 很方便。

request在行为上和Request一样。

response

和request一样是一个代理对象。

settings

配置信息对象,这个没什么好说的。

方法

如:

from uliweb import (redirect, json, POST, GET,
    url_for, expose, get_app_dir, get_apps, function,
    functions, decorators, NotFound
    )

redirect

def redirect(location, code=302):

返回一个Response对象,用于实现URL跳转.

json

def json(data, **json_kwargs):

将一个data处理成json格式,并返回一个Response对象。json_kwargs目前可以允许用户传 入 content_type 值。这样在特殊情况下可以将生成的json数据生成:

content_type = 'text/html; charset=utf-8'

Attention

发现在使用ajaxForm时,因为可能使用了iframe的方式,对于后台返回的json数据,如 果使用 application/json 返回时,在IE浏览器下可能会提示要下载,所以有可能 需要转为 text/html 标式。

expose

详见 URL映射

POST

和expose一样,不过限定访问方法为 POST。

GET

和expose一样,不过限定访问方法为 GET。

url_for

def url_for(endpoint, **values):

根据endpoint可以反向获得URL,endpoint可以是字符串格式,如: Hello.view.index , 也可以 是真正的函数对象。

get_app_dir

def get_app_dir(app):

根据一个app名字取得它对应的目录。

get_apps

def get_apps(apps_dir, include_apps=None):

根据一个apps目录,分析出所有可用的App的名字列表。

function

func = function('function_name')

用户可以在settings.ini中配置供外部使用的函数路径,通过function可以获得这个函数 的对象。例如在settings.ini中如下配置:

[FUNCTIONS]
has_role = 'uliweb.contrib.rbac.has_role'
has_permission = 'uliweb.contrib.rbac.has_permission'

这是uliweb.contrib.rbac中的定义的两个方法,key为方法名,value为方法的路径。 通过:

has_role = function('has_role')

就可以导入真正的函数来使用。

functions

这是一个对象,它的作用类似于function,不过它是以属性引用的方式来从settings.ini 中的FUNCTIONS中导入方法,如:

from uliweb import functions

func = functions.hello

相当于:

from uliweb import function

func = function('hello')

decorators

它同functions类似的使用方法,但是需要在settings.ini中定义DECORATORS内容,如:

[DECORATORS]
check_role = 'uliweb.contrib.rbac.check_role'
check_permission = 'uliweb.contrib.rbac.check_permission'

使用方法:

from uliweb import decorators

@decorators.check_role('superuser')
@expose('/hello')
def hello():
    #...

json_dumps

用于将Python的数据结构转为json格式的方法。

json_dumps(obj, unicode=False, encoding=’utf-8’)

unicode为False时,将会把obj中的unicode值转为encoding编码的串。否则转为unicode 描述形式的串。

NotFound

404对应的异常类。如果某个链接不存在,将引发这个异常。如果在你的处理中,发现有 不存在的对象,建议使用error来返回。因为NotFound会把当前访问的URL显示出来,可能 不是你想显示的内容。

HTTPException

通用的HTTP错误异常类。

Middleware

中间件基类,所有 Middleware 类可以从它派生。

UliwebError

Uliweb提供了一个通用的异常类 - UliwebError,你可以考虑使用它。