【问题标题】:How to let actions support more parameters?如何让动作支持更多参数?
【发布时间】:2010-09-10 18:04:40
【问题描述】:

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

 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):
           ...

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


更新

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

【问题讨论】:

  • 如何在 Turbogears 中设置路线? Turbogears 是否使用与 Pylons 相同的路由模块?
  • 在Turbogears中好像不需要配置路由,Turbogears在后面做了这个

标签: controller pylons turbogears


【解决方案1】:

听起来您想为控制器的 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直接到您的控制器操作的参数。 Here's the Pylons Book section on conditional functions 在 routing.py 中,这里有 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 数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 2019-04-25
    • 2015-06-14
    • 2012-04-07
    • 1970-01-01
    相关资源
    最近更新 更多