我正在使用挂架,我的控制器动作是:
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):
...
如何在挂架上做同样的事情?
更新
我在谷歌搜索过,并在其他一些论坛上询问过,但仍未得到答案。没有人知道(或有兴趣)这样的问题吗?
答案 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 SO和another,如果您真的想直接使用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数据。