1

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

 class UserController(BaseController):

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

但我在涡轮齿轮中发现,我可以这样做:

 class UserController:

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

如何在塔中做同样的事情?


更新

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

4

1 回答 1

0

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

做到这一点的最短方法 - 一种脆弱的方法 - 就是像这样定义动作,使用这些环境变量作为动作的默认值。

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

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

如果你觉得真的很繁琐,你可以把这个逻辑推到 routing.py 中。POST 数据已经在那里可用,只是不那么直接,因为这样的逻辑属于您的控制器。您将在 Routes 中使用条件方法,它使您可以访问environ[wsgi.input]具有 POST 数据的 ,然后从那里提取所需的数据,并将其推送到match_dict字典中,这反过来又可以让您将 POSTDATA 直接提供给控制器操作论据。这是关于routing.py中条件函数的 Pylons Book 部分,这里有一个类似的问题,关于 SO另一个,如果你真的想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 数据。

于 2010-09-30T16:24:29.263 回答