2012-02-09 76 views
3

我需要存储来自某些非Django应用程序的特殊cookie。我可以在视图中执行此操作在Django的视图之外访问会话/请求信息

request.session[special_cookies'] = special_cookies 

但是在非视图py文件中,我需要访问此特殊cookie。

docs,我能做到这一点

>>> from django.contrib.sessions.backends.db import SessionStore 
>>> import datetime 
>>> s = SessionStore(session_key='2b1189a188b44ad18c35e113ac6ceead') 
>>> s['last_login'] = datetime.datetime(2005, 8, 20, 13, 35, 10) 
>>> s['last_login'] 
datetime.datetime(2005, 8, 20, 13, 35, 0) 
>>> s.save() 

如果我不提供会话密钥,Django会生成一个给我。 我很担心获得许多新的会话密钥的效果。 (当你有多个用户时,我不认为这是好事,对吧?)

我想要一个用户把这个特殊的cookie绑定到一个用户的会话。 但是,我不想保存在用户配置文件中,因为出于安全原因。这个cookie在我们登录时生成(我们的应用程序将发送这个特殊的cookie)。我们希望在整个浏览会话中来回发送此Cookie。

我应该如何解决这个问题?

非常感谢!


#views.py 
request.session['special_cookies'] = library.get_special(user, pwd) 

#library.py 
def get_special_cookies(user, pwd): 
    res = get_special_cookies("http://foobar.com/api/get_special_cookies", user, pwd) 

#foobar.py (also non-views) 
def do_this(user, special_cookies) 

我敢肯定,这是好的....

#views_2.py 
def dummy_views(request): 
    foobar.do_this(request.user, request.session['special_cookies']) 

但也有情况,我不想通过的意见,让我的特殊饼干/电话get_sepcial_cookies。我希望它贯穿始终。还是我正在过度...?

+1

'cookies!= django会话变量' – 2012-02-09 23:28:26

回答

6

为了解释为什么你是一条危险的道路,我们必须记住,为什么在那里摆在首位发明了服务器端的会话:

HTTP是一个stateless protocol。无状态协议不要求服务器在多个请求期间保留关于每个用户的信息或状态。例如,当需要Web服务器来自定义用户的网页内容时,Web应用程序可能必须跟踪用户的页面进度。一个常见的解决方案是使用HTTP cookie。其他方法包括服务器端会话,隐藏变量(当前页面包含表单时)以及使用URI编码参数进行URL重写。

Django是一个非常成熟的框架;如果在Django中某个目标看起来很难完成,那么可能你正在采取错误的方法解决问题。即使您可以直接在会话后端存储服务器端会话信息,对我而言,这似乎也是一个糟糕的设计,因为会话数据与请求之外无关。恕我直言,如果你需要在应用程序之间共享认证/授权数据,你应该真的考虑类似OAuth的东西,否则你最终会得到某些不安全,脆弱,丑陋和难以支持的东西。

(抱歉,如果我听起来居高临下,英语不是我的本地习语)。

[更新]

嗨保罗。非常感谢你。我相信我的团队不想引入OAuth或任何额外的认证机制层。但是,您是否反对将此特殊Cookie插入到HttpResponse.COOKIES中?

如果你真的想要走这条路的一些言论:

  • 你会被“同域”限制的约束(其它应用程序应该驻留在同一TLD)
  • 你应该使用某种形式的签名,以避免与饼干

那是比的request.session一个更好的解决方案篡改?

有一些机制可以在更高层次上处理这类问题。例如:

  • 如果您想根据某个cookie的值在每个模板上下文中生成一个变量,则可以编写自定义context processor
  • 如果要根据Cookie的存在重新路由视图,则应写入自定义middleware

我无法提供更具体的解决方案,而你的目标的更多细节,但使用这些钩子可以避免重蹈代码来测试每个视图外部饼干 - 但是请注意,一切有关的cookie被绑定到请求/响应上下文并且在其之外没有任何意义。

+0

嗨Paulo。非常感谢你。我相信我的团队不想引入OAuth或任何额外的认证机制层。但是,您是否反对将此特殊Cookie插入到HttpResponse.COOKIES中?这是比request.session更好的解决方案吗?谢谢。不,你不喜欢居高临下。你听起来很有帮助:D – CppLearner 2012-02-11 23:43:55

+0

谢谢Paulo。完全明白了:) – CppLearner 2012-03-03 08:38:44