Самый простой способ обработки и отображения ошибок в контроллере Python Pylons без вспомогательного класса - PullRequest
2 голосов
/ 27 марта 2010

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

Это правильный способ сделать это? Есть ли лучший (но все же простой) способ? Я предпочитаю не использовать никаких сторонних обработчиков ошибок или форм из-за обширных запросов к базе данных, которые мы уже имеем в наших классах.

Кроме того, как я могу "остановить" цепочку обработки в классе, если одно из значений недопустимо? Есть ли что-то вроде синтаксиса "перерыв" или что-то?

Спасибо.

>>> u = User()
>>> u.name = 'Jason Mendez'
>>> u.password = '1234'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "topic/model/user.py", line 79, in password
    return self._password
ValueError: Your password must be greater than 6 characters

В моем контроллере "регистр" у меня есть:

class RegisterController(BaseController):

    def index(self):
        if request.POST:
            c.errors = {}
            u = User()

            try:
                u.name = c.name = request.POST['name']
            except ValueError, error:
                c.errors['name'] = error

            try:
                u.email = c.email = request.POST['email']
            except ValueError, error:
                c.errors['email'] = error

            try:
                u.password = c.password = request.POST['password']
            except ValueError, error:
                c.errors['password'] = error

            try:
                u.commit()
            except ValueError, error:
                pass

        return render('/register.mako')

1 Ответ

0 голосов
/ 27 марта 2010

Вы можете удалить повторение из кода как полумеру:

class RegisterController(BaseController):

    def index(self):
        if request.POST:
            c.errors = {}
            u = User()
            for key in "name email password".split():
                try:
                    value = request.POST[key]
                    for o in (u, c):
                        setattr(o, key, value)
                except ValueError, error:
                    c.errors[key] = error

            u.commit() # allow to propagate (show 500 on error if no middleware)

        return render('/register.mako')

Обработка форм * Страница 1005 * из документов Pylons описывает несколько простых подходов к проверке формы, которые вы можете адаптировать для своего проекта.

class RegisterController(BaseController):

    @save(User, commit=True)
    # `save` uses filled c.form_result to create User() 
    @validate(schema=register_schema, form='register')
    # `validate` fills c.form_errors, c.form_result dictionaries
    def create(self):
        return render('/register.mako')

Где validate() аналогичен Pylons validate() декоратор и save() может быть реализован следующим образом (с использованием модуль декоратора ):

def save(klass, commit=False):
    def call(action, *args, **kwargs):
        obj = klass()
        for attr in c.form_result:
            if attr in obj.setable_attrs():
               setattr(obj, attr, c.form_result[attr])
        if commit:
           obj.commit()
        return action(*args, **kwargs)
    return decorator.decorator(call)
...