TurboGears 2.1工程目录详解

来源:互联网 发布:软件自动更新工具 编辑:程序博客网 时间:2024/05/29 18:47

在使用paster quickstart命令创建了TurboGears 2.1工程目录后,让我们来看quickstart为我们创建了哪些文件和目录。

tg2_files

从上面的图里面可以看到,quickstart命令只创建了很少的文件。如果你挑两三个文件看一下内容,你会看到里面主要还是应用程序的框架,你可以在框架中填充代码构造你自己的web应用。

1、控制器

当浏览器(或者其他的HTTP客户端)向你的应用发出请求的时候控制器会被调用。

在helloworld/controllers目录中你会看到很多的控制器文件。

root.py 是我们第一个要介绍的文件,这个文件默认会接受所有的HTTP请求,然后根据请求的内容调用相应的函数。你可以通过设置特定的路由修改默认设置,不过通常情况下不需要这么做。

控制器的函数

控制器是你应用程序的神经中枢。他除了了所有的HTTP请求。控制器相应请求之后会调用其他的TurboGears组件,包括模板引擎、存储层等,来完成请求的响应。

When the TurboGears server receives an HTTP request, the requested URL is mapped as a call to your controller code located in controllers.py. Page names map to functions within the controller class.

For example:

URLMaps tohttp://localhost:8080/indexRoot.index()http://localhost:8080/mypageRoot.mypage()

Quick Example

Here’s a simple example of the TG2.

Suppose using tg-admin quickstart you generate a TurboGears project named “HelloWorld”. Your default controller code would be created in the fileHelloWorld/helloworld/controllers/root.py.

Modify the default controllers.py to read as follows:

 

"""Main Controller"""from helloworld.lib.base import BaseControllerfrom tg import expose, flashfrom pylons.i18n import ugettext as _#from tg import redirect, validate#from helloworld.model import DBSessionclass RootController(BaseController):     @expose()     def index(self):         return "<h1>Hello World</h1>"     @expose()     def default(self, *args, **kw):         return "This page is not ready"

 

When you load the root URL http://localhost:8080/index in your web browser, you’ll see a page with the message “Hello World” on it.

root.py

Let’s take a look at the RootController:

class RootController(BaseController):    """    The root controller for the my-intranet application.    All the other controllers and WSGI applications should be mounted on this    controller. For example::        panel = ControlPanelController()        another_app = AnotherWSGIApplication()    Keep in mind that WSGI applications shouldn't be mounted directly: They    must be wrapped around with :class:`tg.controllers.WSGIAppController`.    """    secc = SecureController()    admin = Catwalk(model, DBSession)    error = ErrorController()    @expose('my_intranet.templates.index')    def index(self):        """Handle the front-page."""        return dict(page='index')    @expose('my_intranet.templates.about')    def about(self):        """Handle the 'about' page."""        return dict(page='about')    @expose('my_intranet.templates.authentication')    def auth(self):        """Display some information about auth* on this application."""        return dict(page='auth')    @expose('my_intranet.templates.index')    @require(predicates.has_permission('manage', msg=l_('Only for managers')))    def manage_permission_only(self, **kw):        """Illustrate how a page for managers only works."""        return dict(page='managers stuff')    @expose('my_intranet.templates.index')    @require(predicates.is_user('editor', msg=l_('Only for the editor')))    def editor_user_only(self, **kw):        """Illustrate how a page exclusive for the editor works."""        return dict(page='editor stuff')    @expose('my_intranet.templates.login')    def login(self, came_from=url('/')):        """Start the user login."""        login_counter = request.environ['repoze.who.logins']        if login_counter > 0:            flash(_('Wrong credentials'), 'warning')        return dict(page='login', login_counter=str(login_counter),                    came_from=came_from)    @expose()    def post_login(self, came_from=url('/')):        """        Redirect the user to the initially requested page on successful        authentication or redirect her back to the login page if login failed.        """        if not request.identity:            login_counter = request.environ['repoze.who.logins'] + 1            redirect(url('/login', came_from=came_from, __logins=login_counter))        userid = request.identity['repoze.who.userid']        flash(_('Welcome back, %s!') % userid)        redirect(came_from)    @expose()    def post_logout(self, came_from=url('/')):        """        Redirect the user to the initially requested page on logout and say        goodbye as well.        """        flash(_('We hope to see you soon!'))        redirect(came_from)

There are a couple obvious differences from the simplistic example above:

Most of the expose() calls point to a specific template file.
We mount the SecureController, AdminController, etc in secc, admin, by instantiating them in RootController

原创粉丝点击