听起来您想为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 数据。