2010-09-10 2 views
1

Я использую пилоны, и мое действие контроллера:Как позволить действиям поддерживать больше параметров?

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

Как сделать то же самое в пилонах?


UPDATE

Я искал в гугле, и спросил, в некоторых других форумах, но до сих пор не получил ответа. Никто не знает (или интересует) такой вопрос?

+0

Как вы настраиваете маршрут в Turbogears? Использует ли Turbogears тот же модуль маршрутизации, что и Pylons? – Ben

+0

Кажется, нам не нужно настраивать маршрутизацию в Turbogears, Turbogears сделала это позади – Freewind

ответ

0

Похоже, вы хотите дать аргументы методу create() вашего контроллера, которые производятся непосредственно из элементов данных POST. Вы можете это сделать, но это довольно нерешительно.

Самый короткий способ сделать это - хрупким способом - было бы просто определить действие таким образом, используя эти переменные среды как значения по умолчанию для действия.

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

Дело в том, что, хотя это может показаться громоздким, то первый метод, который вы показали, вероятно, лучший способ сделать это, потому что это дает вам больше возможностей для восстановления грациозно от этих переменных не является то, что вы ожидаете их быть.

Если вы чувствуете себя очень неудобно, вы можете использовать эту логику в routing.py. Данные POST уже доступны там, просто не так, потому что такая логика принадлежит вашему контроллеру. Вы должны использовать conditional method in Routes, который дает вам доступ к environ[wsgi.input], который имеет данные POST, затем извлекает нужные данные и вставляет его в словарь match_dict, что, в свою очередь, позволит вам напрямую загружать POSTDATA в аргументы вашего контроллера , Here's the Pylons Book section on conditional functions в routing.py, и вот 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 и решая, что с ним делать, это роль контроллера, а не роль Маршрутов или роль промежуточного программного обеспечения. Если вы решите - например, начать работу с данными POST в routing.py, вы потеряете некоторые из слабо связанных преимуществ Pylons и в меньшей степени весь WSGI shebang.

Вы будет видеть контроллеры Pylons, которые выглядят так, будто:

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

Однако в тех случаях, значение «имя» и «спам» приходят из строки запроса (и из маршрутов 'map), а не из данных POST.

Смежные вопросы