您的位置:首页 > 其它

TurboGears 2.1工程目录详解

2010-11-03 21:00 246 查看
在使用paster quickstart命令创建了TurboGears 2.1工程目录后,让我们来看quickstart为我们创建了哪些文件和目录。





从上面的图里面可以看到,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 to
http://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 BaseController
from tg import expose, flash
from pylons.i18n import ugettext as _
#from tg import redirect, validate
#from helloworld.model import DBSession

class 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: