Skip to main content
 首页 » 编程设计

python之在没有辅助类的 Python Pylons Controller 中处理和显示错误的最简单方法

2025年05月04日8think

我有一个 User() 类,当属性设置不正确时会抛出异常。我目前通过 Controller 将异常从模型传递到模板,实际上是为每个变量捕获异常两次。

这是正确的做法吗?有更好(但仍然简单)的方法吗?由于我们的类(class)中已经存在大量数据库查询,我不想使用任何第三方错误或表单处理程序。

此外,如果其中一个值无效,我如何“停止”类中的处理链?是否有类似“中断”语法之类的东西?

谢谢。

>>> 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 

在我的 Controller “注册”中,我有:

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') 

请您参考如下方法:

作为半措施,您可以从代码中删除重复:

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') 

Form Handling 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() 可以按如下方式实现(使用 decorator module ):

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)