如何让动作支持更多参数?

时间:2010-09-10 18:04:41

标签: controller pylons turbogears

我正在使用挂架,我的控制器动作是:

 class UserController(BaseController):

      def create(self):
           name = request.POST['name']
           email = request.POST['email']
           password = request.POST['password']
           ...

但我在turbogears中发现,我可以这样做:

 class UserController:

      def create(self, name, email, password):
           ...

如何在挂架上做同样的事情?


更新

我在谷歌搜索过,并在其他一些论坛上询问过,但仍未得到答案。没有人知道(或有兴趣)这样的问题吗?

1 个答案:

答案 0 :(得分:0)

听起来您想要为控制器的create()方法提供参数,这些方法直接来自POST数据的元素。你可以这样做,但它相当繁琐。

最简单的方法 - 一种脆弱的方式 - 就是这样定义动作,使用这些环境变量作为动作的默认值。

class UserController(Base):
  def create(self, name=request.POST['name'], email=request.POST['email'], ...):
        ...

问题是即使它看起来很麻烦,你展示的第一种方法可能是一种更好的方法,因为它为你提供了更多空间,可以从那些不符合预期的变量中优雅地恢复。

如果您想变得非常繁琐,可以将此逻辑推送到routing.py。 POST数据已在那里可用,而不是直接,因为这样的逻辑属于你的控制器。您可以使用conditional method in Routes,它可以访问具有POST数据的environ[wsgi.input],然后从那里提取您想要的数据,然后将其推送到match_dict字典中会让你直接将POSTDATA提供给你的控制器动作的参数。在routing.py中Here's the Pylons Book section on conditional functions,这里是similar question here on SOanother,如果您真的想直接使用wsgi.input,这应该会有所帮助。

然而,我会使用您原来的方法而不是其中任何一种方法:

class UserController(BaseController):
    def create(self):
       name = request.POST['name']
       email = request.POST['email']
       password = request.POST['password']
       ...

绝对有可能在POST数据到达您的控制器之前对其进行解析,并在此之前对其执行操作。但是,查看POST数据并决定如何处理它是控制器的角色,而不是路由的角色或中间件角色。如果您决定 - 例如 - 开始摆弄routing.py中的POST数据,那么您将失去Pylons的一些松散耦合优势,并在较小程度上失去整个WSGI shebang。

看到看起来像这样的Pylons控制器:

class UserController(BaseController):
    def create(self, name, spam):
       ...

但是,在这些情况下,“name”和“spam”的值来自查询字符串(以及来自Routes的映射),而不是来自POST数据。