代码之家  ›  专栏  ›  技术社区  ›  Joril

塔架、表格编码和外部验证

  •  1
  • Joril  · 技术社区  · 14 年前

    我正在使用挂架1.0构建服务器端应用程序的Web前端。
    现在我正在写第一个表单,我面临一个关于验证的问题。使用formEncode和@validate decorator,我可以从客户端的角度轻松地验证用户输入,但是当我将数据提交到服务器时,它可能会执行额外的检查,并最终返回我需要向用户显示的异常。

    我的问题是:有没有 简洁的 如何将此异常处理集成/模拟到FormEncode/Validate流中?例如,使用填充字段和错误消息重新显示表单,如果异常来自@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()
    

    这样,在服务器端异常的情况下,我可以看到“flash”消息,但是表单中当然会有空字段:/

    2 回复  |  直到 14 年前
        1
  •  1
  •   renatopp    14 年前

    我喜欢执行:

    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)
    

    这样,当用户发送数据时,if是第一次(request.params为空)html将表单填充为空,html将表单填充为request.params。

        2
  •  0
  •   Community CDub    7 年前

    另一种方式(灵感来自 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)
    
    推荐文章