背景:我目前正在金字塔中创建一个项目。它使用烧杯会话和SQLAlchemy作为DB-backend。
某些表单包含隐藏字段中的信息,其唯一目的是将其提供给处理帖子的视图,用户永远不会看到它们,也不需要。一个例子:
用户可以编辑数据库实体。由于可以编辑实体的所有数据字段(包括名称),因此实体的ID将放在隐藏字段中,因此视图可以查询对象并对其进行更新。这种方法有一些缺陷:
不必要地通过不安全的通道(客户端)传输数据是错误的。解决方案并不复杂:将该信息存储在服务器上(在会话或数据库中),并使用密钥(form-id?)访问它,类似于具有session-id的会话。将完全匿名的令牌放入隐藏的字段中。这将是表单中唯一需要的隐藏字段。其他所有内容都将存储在服务器上,并从响应后请求的视图中恢复(好吧 - 我仍然会在那里有我的CSRF令牌,因为它在我的所有帖子请求中)。这也可以让表单暂停,因为你可以让form-id在几个小时后过期。
如果我没记错的话,drupals默认会这样提供。我真的不希望金字塔本身支持这个,但是想象必须有一个包这样做,使用金字塔提供的会话对象,仍然找不到任何。我敢肯定我自己可以写一些可用的东西,但为什么会这样做呢?
有人知道这样的套餐吗?
答案 0 :(得分:1)
如果我了解您,您希望在不使用表单上的隐藏字段的情况下更新模型。 这是怎么做的 使用pyramid_simpleform和Urldispatch
@view_config(route_name="my_route",renderer="myrenderer.mako")
def update(request):
id = request.matchdict['id']
#assuming you have an SQLalchemy model called MyModel which you imported
#your model has a method that gets by id
toupdate = MyModel.get_by_id(id)
form = Form(request, schema=MyModelSchema,obj=toupdate)
if not toupdate:
#you can flash a message here and redirect wherever you want
return HTTPFound(location=request.route_url('home'))
if 'submit' in request.POST and form.validate():
form.bind(toupdate)
DBSession.add(toupdate)
DBSession.flush()
#redirect
return HTTPFound(location=request.route_url('home'))
return dict(form=FormRenderer(form))
在视图中,只需使用表单对象绘制没有任何隐藏字段的表单字段。
#configure your route as below
config.add_route('my_route','/myroute/{id}/edit')
使用webhelpers tool。跟随下面(使用Mako模板)
<%
from webhelpers.html.tools import js_obfuscate
%>
js_obfuscate("<input type='hidden' name='check' value='valid' />")
混淆javascript标签中的数据