gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:39:39 24 4
gpt4 key购买 nike

我有一个 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)

关于python - 在没有辅助类的 Python Pylons Controller 中处理和显示错误的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2527992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com