【问题标题】:What is the proper way to pass errors from classes to rendered html in python将错误从类传递到python中呈现的html的正确方法是什么
【发布时间】:2011-01-22 01:43:53
【问题描述】:

我正在一个类中执行我的所有表单验证,并且希望能够将错误从类中获取到呈现的 html。我正在考虑的一种方法是创建一个全局变量“c”,它将存储所有错误并从类中设置它们,因为我仍然希望各个方法在它们失败时返回 false。下面是一些示例代码:

class User():

def add(self):

    #Check that e-mail has been completed
    try:
        #Validate e-mail address
        if (isAddressValid(self.email)):
            c.error = 'Invalid e-mail address'
            return 0
    except NameError:
        c.error = 'No e-mail address specified'
        return 0

有没有更好或首选的方法来做到这一点?

谢谢。

【问题讨论】:

    标签: python pylons mako


    【解决方案1】:

    我喜欢使用字典来保存错误和警告。然后我可以在表单顶部或内联显示所有错误。我还定义了errorwarning 变量,这样我就可以轻松区分这两个变量。

    class User(object):
        def __init__(self):
            self.messages = {}
    
        def add(self):
            error = False
            warning = False
    
            #Check that name has a space
            try:
                if (self.name.find(' ') == -1):
                    warning = True
                    self.messages['email'] = {'type': 'warning',
                                              'msg': 'Your name has no space.'}
            except NameError:
                error = True
                self.messages['email'] = {'type': 'error',
                                          'msg': 'You have no name.'}
    
            #Check that e-mail has been completed
            try:
                #Validate e-mail address
                if (isAddressValid(self.email)):
                    error = True
                    self.messages['email'] = {'type': 'error',
                                              'msg': 'Invalid e-mail address'}
            except NameError:
                error = True
                self.messages['email'] = {'type': 'error',
                                          'msg': 'No e-mail address specified'}
    
            return error, warning
    

    【讨论】:

      【解决方案2】:

      是的,当然,我的建议是完全避免返回状态代码。

      一般而言,有很多文献反对使用状态码和全局变量来保存在 Python 等高级环境中处理错误的详细信息。
      Ned Batchelder 写了一个very good article on this topic;我强烈建议您阅读该页面,了解异常处理通常被认为是一种优越方法的原因列表。

      但是,正如我们所讨论的 Python,传达异常和错误的官方方式是通过异常处理。期间。
      使用任何其他方式,都会使您的代码违背对 Python 代码的普遍期望,这意味着它会更难阅读和维护。

      【讨论】:

      • 您是否有任何示例代码来说明,例如,检查名称字段中的空格字符以及使用异常而不是返回状态代码来验证电子邮件地址?谢谢。
      【解决方案3】:

      在 Web 应用程序的上下文中,您可以只填充 tmpl_context

      from pylons import tmpl_context as c
      from yourproject.lib.base import BaseController, render
      
      class MyController(BaseController):
          def index(self):
              c.error = 'Invalid e-mail address'
              return render('/mytemplate.mako')
      

      'mytemplate.mako' 文件内容在哪里:

      % if c.error:
          error: ${c.error}
      % endif
      

      在通用 Python 代码中,您可以:

      返回一个元组

      你可以从你的函数中返回一个元组(这不是最好的方式):

      class Error(Exception):
          pass
      
      def isvalid(something):
          return False, Error("'%s' is invalid" % (something,))
      

      例子:

      ok, err = isvalid(object())
      if not ok:
         print err
      

      引发异常

      如果不应该立即调用者处理来自您的函数的错误,则可以使用异常将有关错误的信息向上传递到堆栈。

      def do_stuff(something):
          if not something.isready():
             raise Error("'%s' is not ready to do stuff" % (something,))
      

      例子:

      class C(object):
          def isready(self):
              return False
      
      def run():
          # no error handling here
          do_stuff(C()) 
          # do something else
      
      try: run()
      except Error, e:
          print e
      

      传递回调

      def do_stuff(something, onerror=lambda err: None):
          if not something.isready():
             onerror(Error("'%s' is not ready to do stuff" % (something,)))
      

      例子:

      do = lambda: do_stuff(C(), onerror=repeat)
      def repeat(err):
          """Repeat until success."""
          print err
          time.sleep(5) 
          do() # possible infinite loop 
      do()
      

      【讨论】:

      • 感谢您的详尽回答。这确实适用于网络应用程序。您将如何将错误从模型中的方法传递到控制器并最终传递到模板?如果可能的话,我想把我所有的错误检查都放在类中。谢谢。
      • @ensnare:您可以使用validate 装饰器,如wiki.pylonshq.com/display/pylonsdocs/… 中所述
      猜你喜欢
      • 2023-03-06
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多