Как разрешить действиям поддерживать больше параметров? - PullRequest
1 голос
/ 10 сентября 2010

Я использую пилоны, и мое действие контроллера:

 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 и спрашивал на некоторых других форумах, но все еще не получил ответ.Никто не знает (или не интересуется) такой вопрос?

1 Ответ

0 голосов
/ 30 сентября 2010

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

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

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

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

Если вам захочется по-настоящему нервничать, вы можете вставить эту логику в routing.py.Данные POST там уже доступны, но не так напрямую, потому что подобная логика принадлежит вашему контроллеру.Вы должны использовать условный метод в Маршрутах , который дает вам доступ к environ[wsgi.input], который имеет данные POST, затем извлекать нужные данные оттуда и помещать их в match_dict словарь, который, в свою очередь, позволит вам передавать POSTDATA непосредственно в аргументы действия вашего контроллера. Вот раздел Pylons Book об условных функциях в routing.py, и вот аналогичный вопрос здесь о SO и еще одном , который должен помочь, если вы действительно хотитеработать с wsgi.input напрямую.

Однако вместо любой из этих вещей я бы использовал ваш оригинальный метод:

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

Определенно возможно проанализировать данные POST, прежде чем они попадут вваш контроллер и принять меры на нем до этого.Однако просмотр данных POST и определение того, что с ними делать, - это роль контроллера, а не роль Routes или промежуточного программного обеспечения.Если вы решите, например, начать играть с данными POST в файле routing.py, вы потеряете некоторые слабосвязанные преимущества Pylons и в меньшей степени весь трафик WSGI.

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

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

Однако в этих случаях значения "name" и "spam" приходятиз строки запроса (и из карты маршрутов), а не из данных POST.

...