我在我的网络应用中使用金字塔,这需要对每个请求进行csrf检查。在ajax调用期间,csrf-token被设置到每个请求的标头中。 1个帖子与 1个工作人员一切正常,但是一旦我启用了多个工作人员,工作人员2就不知道来自工作人员1的令牌。他们怎么能分享 csrf代币?
问候
production.ini for gunicorn:
[server:main] # GUNICORN
use = egg:gunicorn#main
bind = unix:/tmp/gunicorn.sock
workers = 2
threads = 1
preload = true
reload = true
accesslog = gunicorn_access.log
loglevel = info
在金字塔中我只设置:
config.set_default_csrf_options(require_csrf=True)
我的HTML-skeletion有:
<input type="hidden" id="hidden_csrf_token" name="csrf_token" value="${request.session.get_csrf_token()}">
每个ajax请求:
var csrf_token = $('#' + hiddenCSRFTokenId).val();
...
headers: {'X-CSRF-Token': csrf_token}
修改:我正在使用默认会话工厂,例如
session_factory = session_factory_from_settings(settings)
...
config.set_session_factory(session_factory)
我想使用烧杯:
# Beaker cache
beaker.cache.regions = short_term, long_term
beaker.cache.type = memory
beaker.cache.short_term.expire = 3600
beaker.cache.long_term.expire = 86400
# Beaker sessions
beaker.session.type = redis
beaker.session.data_dir = %(here)s/data/sessions/data
beaker.session.lock_dir = %(here)s/data/sessions/lock
beaker.session.autor = true
#beaker.session.type = memory
beaker.session.key = dbas_prototyp
beaker.session.secret = ...
beaker.session.cookie_max_age = 3600
beaker.session.timeout = 3600
beaker.session.cookie_expires = true
beaker.session.url:127.0.0.1:4284
在设置烧杯时我是否遗漏了什么?
答案 0 :(得分:0)
beaker.cache.type=memory
是会话数据的进程内存储(我猜)。您正在运行两个不同的进程,当然他们无法看到彼此的内存空间。
使用不同的Beaker后端或类似pyramid_redis_session的内容来跨进程(和服务器)共享会话数据。
答案 1 :(得分:0)
我认为我找到了第一个有效的解决方案。我正在使用带有简单外部数据库的烧杯,如:
session.url = postgresql+psycopg2://user:password&@localhost:port/database?client_encoding=utf8
# Beaker cache
beaker.cache.regions = short_term, long_term
beaker.cache.type = ext:database
beaker.cache.short_term.expire = 3600
beaker.cache.long_term.expire = 86400
beaker.cache.extend_existing = True
beaker.cache.table_name = beaker_cache
beaker.session.type = ext:database
beaker.session.key = yyy
beaker.session.secret = xxx
beaker.session.cookie_max_age = 3600
beaker.session.timeout = 3600
beaker.session.cookie_expires = true
beaker.session.table_name = beaker_session
在修复其他一些问题之后,我会用redis发布解决方案。