python - 是否有 Pyramid 包用于在服务器端存储表单相关信息(避免镜像隐藏字段)?

标签 python forms pyramid

背景:我目前正在 Pyramid 中创建一个项目。它使用烧杯 session 和 SQLAlchemy 作为数据库后端。

某些表单在隐藏字段中包含信息,其唯一目的是将其提供给处理帖子的 View ,用户永远不会看到它们,也不需要看到它们。一个例子:

数据库实体可以由用户编辑。由于实体的所有数据字段(包括名称)都可以编辑,因此实体的 ID 被放在隐藏字段中,因此 View 可以查询对象并更新它。这种方法有一些缺陷:

  1. 我的用户不关心我的实体的 ID。他们甚至不应该意识到这一点。
  2. 可以修改客户端重新提交的数据。有人可能会尝试通过在此处伪造不同的 ID 来访问其他实体。
  3. 在其他情况下,可能会有比 ID 更多的镜像数据(也许返回 url?也许在某个地方更多)。为此使用隐藏字段会将数据传输到客户端并返回,这是不必要的(带宽),并且需要对其进行验证。

在不需要的情况下通过不安全的 channel (客户端)传输数据是错误的。解决方案并不复杂:将该信息存储在服务器上(在 session 或数据库中),并使用 key (form-id?)访问它,类似于 session ,使用 session ID。将完全匿名的 token 放入隐藏字段中。这将是表单中唯一需要的隐藏字段。其他所有内容都将存储在服务器上,并从响应后请求的 View 中恢复(嗯 - 我仍然在那里保留我的 CSRF token ,因为它在我所有的后请求中)。这也将使表单超时变得容易,因为您可以使表单 ID 在几个小时左右后过期。

如果我没记错的话,drupals 默认是这样提供的。我真的不希望 Pyramid 本身支持这一点,但我想一定有一个包可以使用 Pyramid 提供的 session 对象来执行此操作,但仍然找不到任何包。我确信我自己可以写出一些有用的东西,但如果已经有一些很棒的东西了,为什么还要这么做呢?

有人知道这样的软件包吗?

最佳答案

如果我理解您的意思,您希望在不使用表单上的隐藏字段的情况下更新模型。 以下是具体操作方法 使用pyramid_simpleform和 URL 调度

@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))

在 View 中,只需使用表单对象绘制没有任何隐藏字段的表单字段。

#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标签中的数据

关于python - 是否有 Pyramid 包用于在服务器端存储表单相关信息(避免镜像隐藏字段)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27295361/

相关文章:

Python Pyramid SQLAlchemy,MySQL 服务器已经消失

python - 获取给定 Python 文件中的类列表

python - 带有列子集的数据框 drop_duplicates

php - 条件,如果搜索栏为空则返回错误html

python - 如何更改 Pyramid 中内部服务器错误的默认 View ?

python - 检查当前用户是否有传销服务权限?

python - 术语 "method"在 Python 中适用于什么?

python - 带有 --help arg 的 git 子命令不起作用

php - Symfony/Doctrine 不保存实体(表示 'Column ' 内容'不能为空。)

html - 提交按钮在 html 表单上的定位