2014-12-04 1 views
1

Фон: Я сейчас создаю проект в пирамиде. Он использует сеансы beaker и SQLAlchemy как DB-backend.Есть ли пирамидальный пакет для хранения информации, связанной с информацией, связанной с информацией (избегайте зеркалирования скрытых полей)?

Некоторые формы содержат информацию в скрытых полях с единственной целью предоставить ее представлению, обрабатывающему сообщение, пользователь никогда не видит их и не нуждается. Пример:

Объект DB может быть отредактирован пользователем. Поскольку все поля данных объекта, включая имя, могут редактироваться, идентификатор объекта помещается в скрытое поле, поэтому представление может запрашивать объект и обновлять его. Этот подход имеет некоторые недостатки:

  1. Идентификатор моих сущностей не касается моих пользователей. Они не должны даже знать об этом.
  2. Данные, повторно отправленные клиентом, могут быть переделаны. Кто-то может попытаться получить доступ к другим объектам, создав здесь другой идентификатор.
  3. В других сценариях может быть больше зеркальных данных, чем просто идентификатор (возможно, возвращение к URL-адресу, возможно, куда-то еще). Использование скрытых полей для этого будет передавать данные клиенту и обратно, бесполезно (пропускную способность) и заставляет его проверять.

Передача данных по незащищенным каналам (клиенту) без необходимости - это просто неправильно. Решение не так сложно: сохранить эту информацию на сервере (в сеансе или БД) и сделать его доступным с помощью ключа (form-id?), Аналогичного сеансу, с идентификатором сеанса. Поместите этот анонимный токен в скрытое поле. Это будет единственное скрытое поле, необходимое в форме. Все остальное будет храниться на сервере и быть восстановлено из представления, отвечающего на пост-запрос (ну, у меня все равно будет мой токен CSRF, потому что он во всех моих почтовых запросах). Это также облегчило бы предоставление форм тайм-ауту, так как вы можете сделать идентификатор формы истечением через несколько часов или около того.

Если я правильно помню, drupals действительно поставляет это по умолчанию. Я бы не ожидал, что сама пирамида будет поддерживать это, но представьте, что должен быть пакет, делающий это, используя предоставленный пирамидой объект сеанса, все еще не смог найти. Я уверен, что могу написать что-то полезное, но зачем это делать, если там может быть что-то удивительное?

Кто-нибудь знает о таких пакетах?

+0

нашел вопрос относительно Друпал функции I mentiond: http://drupal.stackexchange.com/questions/57336/what -is-the-difference-between-hidden-and-value-types-in-form-api – kratenko

ответ

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

UPDATE

использовать webhelpers tool. Следуйте, как показано ниже (с помощью шаблона Мако)

<% 
from webhelpers.html.tools import js_obfuscate 
%> 

js_obfuscate("<input type='hidden' name='check' value='valid' />") 

запутать данные в теге яваскрипта

+0

На самом деле это не то, что я хотел сделать.'pyramid_simpleform' полезен (и я его использую). Но вы в основном переместили «id» из скрытого поля в URL-адрес, что ничего не меняет в отношении моего вопроса. Я бы хотел, чтобы идентификатор был сохранен на стороне сервера, так что пользователь не может его знать или испортить (я бы, конечно же, удостоверился, что отправитель имеет доступ на запись к сущности при получении сообщения, во всяком случае, но это не выпуск здесь). Редактирование было всего лишь примером. Я хочу хранить произвольные данные, относящиеся к форме, на стороне сервера вне досягаемости пользователя. Как и связанная функция значения drupal – kratenko

+0

ok. Теперь я понимаю. Вы можете использовать инструмент [webhelpers tool] (http://sluggo.scrapping.cc/python/WebHelpers/modules/html/tools.html#webhelpers.html.tools.js_obfuscate) в поле формы – splbuddy

+0

@kratenko, я обновил свой answer – splbuddy

Смежные вопросы