Tuesday, April 17, 2012

命令行调测Pyramid(上)


跟原来Pylons 一个paster包办一切不同,Pyramid提供了一系列命令行工具用于项目管控和调测。

一、控制类指令

1. 从系统提供框架结构创建一个Pyramid应用 pcreate

系统提供了三种应用框架结构供选择,分别是alchemy、starter、zodb。如

pcreate -s starter MyProject

pcreate创建了一个应用之后,还需要用python setup.py develop建立开发环境。如果用了alchemy,还需要运行initialize_MyAlchemy_db之类的命令来初始化数据库。

2. 启动应用服务器 pserve

pserve 可以启动一个Pyramid应用,如serve development.ini。

常见的pserve参数如下:

--reload  开始文件变更监控,监测到文件变更即重启,开发时常用
--daemon  daemon方式启动服务,生产环境常用


3. 发起一次请求 prequest

prequest可以通过命令行直接发起一次请求,得到应用返回结果,而不需要启动应用服务器。prequest带两个参数,一个是配置文件,另一个是访问的URL(非quoted),如

prequest development.ini /

输出应用首页HTML页面。

在该命令配置文件参数之前,还可以加一些参数,如

-d :显示应答的HTTP状态、HTTP Header,如 prequest -d development.ini /
--header:添加请求的HTTP Header参数,如 prequest --header=Host=example.com development.ini
-m:指定发送请求的方式,默认是GET,使用了POST方式的话,标准输入将成为POST body。如 prequest -mPOST development.ini / < somefile


二、侦测类命令

1. 查看匹配的视图 pviews

pviews 带两个参数,一个是配置文件名,如development.ini,可以在配置文件名后面加#main之类的应用配置节名(app:后面的那个,一般是main,不用写。在用了pipeline之后会有不一样的)。另一个是需要查看的view对应的URL。如

pviews developent.ini /

该命令输出:

URL = /

    context:
    view name:

    Route:
    ------
    route name: home
    route pattern: /
    route path: /
    subpath:

        View:
        -----
        myproject.views.my_view

上面的例子只是找到了一个匹配的view。如果找到多个,也会逐个列出。


2. 查看路由配置 proutes

proutes接收一个参数,即配置文件(#应用配置节),如:

proutes development.ini

输出route名字,匹配规则,对应视图三列信息:

Name            Pattern                        View                    
----                 -------                           ----                    
___debug_toolbar/static/ /_debug_toolbar/static/*subpath at 0x101f69500>
debugtoolbar.source /_debug_toolbar/source        
debugtoolbar.execute /_debug_toolbar/execute       
debugtoolbar.console /_debug_toolbar/console       
debugtoolbar.exception /_debug_toolbar/exception     
debugtoolbar.sql_select /_debug_toolbar/sqlalchemy/sql_select
debugtoolbar.sql_explain /_debug_toolbar/sqlalchemy/sql_explain
__static/       /static/*subpath               at 0x101f6df50>
home            /                             

因为本例中,配置了debugtoolbar,所以会有很多debugtoolbar的路由定义。属于本应用的配置主要就是最后两条,_static/和home。


3. 查看tween,ptweens

tween插件是Pyramid中位于WSGI与Pyramid应用请求处理程序之间运行的一些代码段。ptweens可以查询系统所有配置的tweens,如

ptweens development.ini

输出:

"pyramid.tweens" config value NOT set (implicitly ordered tweens used)

Implicit Tween Chain

Position    Name                                                            
--------    ----                                                            
-           INGRESS                                                         
0           pyramid_debugtoolbar.toolbar_tween_factory                      
1           pyramid.tweens.excview_tween_factory                            
-           MAIN                            


4. 交互式shell pshell

就像python的shell一样,Pyramid也有一个shell,它就是pshell,可以不用启动应用服务器来查看应用的内部信息。pshell带一个参数,即应用配置文件,如:

pshell development.ini

将会输出:

Environment:
  app          The WSGI application.
  registry     Active Pyramid registry.
  request      Active request object.
  root         Root of the default resource tree.
  root_factory Default root factory used to create `root`.

然后进入交互式shell命令模式。可以在这个shell模式下查看Pyramid中每个部件的状态、内容。python指令也都可以在这里使用。如

>>> dir(app)
>>> app.root_factory
>>> dir(request)
>>> request.url

甚至可以构造一次访问请求

>>> from myproject.views import my_view
>>> from pyramid.request import Request
>>> r = Request.blank('/')
>>> my_view(r)

将会输出my_view的返回结果(不是渲染后的页面)。

可以如同退出python shell一样退出pshell。


5. 扩展pshell的服务能力

pshell启动之后,仅有app、registry、request、root、root_factory这几个变量可以用,如果我们想一开启就载入更多的全局变量,也可以通过如下配置来完成(在ini配置文件中):

[pshell]
setup = myapp.lib.pshell.setup
m = myapp.models
session = myapp.models.DBSession
t = transaction

这里setup是一个特殊的配置,它指向了一段pshell启动首先运行的程序,已方便pshell启动时加载一些应用特有的数据。如:

# myapp/lib/pshell.py
from webtest import TestApp

def setup(env):
    env['request'].host = 'www.example.com'
    env['request'].scheme = 'https'
    env['testapp'] = TestApp(env['app'])

上面程序中的env就是整个pshell的环境。pshell里面可以访问的变量都是这个字典中的一项。

经过以上的配置之后,我们启动pshell就可以看到多了:

Custom Variables:
  m            myapp.models
  session      myapp.models.DBSession
  t            transaction

Environment中也多了testapp.

现在就可以运行下面的命令了:

>>> testapp.get('/')
>>> request.route_url('home')

No comments:

Post a Comment