2010-08-04 65 views
1

我正在使用Pylons 1.0构建一个服务器端应用程序的Web前端。
现在我正在写第一个表单,而且我正面临一个有关验证的问题。使用FormEncode和@validate装饰器我可以很容易地从客户端角度验证用户输入,但是当我提交数据时到服务器,它可能会执行额外的检查,并最终抛出我需要显示给用户的异常。主塔,FormEncode和外部验证

我的问题:有没有简洁方式来整合/模拟此异常处理到FormEncode /验证流?例如,重新显示带有填充字段和错误消息的表单,如果异常来自@validate本身,就会发生这种情况?

这就是我目前所面对的:

def edit(self, id): 
    return render('/edit_user.mako') 

@validate(schema=form.UserForm(), form="edit") 
def add_user(self): 
    if request.POST: 
     u = helpers.load_attributes(User(), self.form_result) 
     try: 
      model.save_to_server(u) 
     except MyBaseException, exc: 
      helpers.flash(unicode(exc)) 
      return self.edit() 

通过这种方式,在服务器端的例外,我可以看到“闪”的消息,但课程的形式将空场的情况下:/

回答

0

另一种方式(通过this answer启发)是写类似于@Validate将赶上所需例外,并使用htmlfill一个装饰施展消息:

def handle_exceptions(form): 

    def wrapper(func, self, *args, **kwargs): 
     try: 
      return func(self, *args, **kwargs) 
     except MyBaseException, e: 
      request = self._py_object.request 
      errors = { "exception" : unicode(e) } 

      params = request.POST 
      decoded = params.mixed() 
      request.environ['REQUEST_METHOD'] = 'GET' 
      self._py_object.tmpl_context.form_errors = errors 
      request.environ['pylons.routes_dict']['action'] = form 
      response = self._dispatch_call() 

      # If the form_content is an exception response, return it 
      if hasattr(response, '_exception'): 
       return response 

      htmlfill_kwargs2 = {} 
      htmlfill_kwargs2.setdefault('encoding', request.charset) 
      return htmlfill.render(response, defaults=params, errors=errors, 
            **htmlfill_kwargs2) 
    return decorator(wrapper) 

装饰器将被用于这样的:

@handle_exceptions("edit") 
@validate(schema=form.UserForm(), form="edit") 
def add_user(self): 
    if request.POST: 
     u = helpers.load_attributes(User(), self.form_result) 
     model.save_to_server(u) 
1

我想实现:

from formencode import htmlfill 

def create(self): 
    if request.params: 
     try: 
      Post.validate(request.paramse) 
      post = helpers.load_attributes(Post(), request.params) 
      model.save_to_server(post) 

      flash('OK', 'success') 
      redirect(...) 
     except InvalidException as e: 
      for key, message in e.unpack_errors().iteritems(): 
       flash(message, 'error') 

    return htmlfill.render(render('/blogs/create.html'), request.params) 

在我的Post.validate

@staticmethod 
def validate(data): 
    schema = PostSchema() 
    schema.to_python(data) 

这样,如果是第一次(request.params空)的HTML表单填写什么也没有,当用户发送HTML DATAS填写表格request.params