如何在Django中创建会话本地的cookie感知HTTP客户端?
我正在使用一个网络服务后台来为Django提供身份验证,而get_user方法需要保留网络服务提供的一个cookie,以便与会话关联。现在,我通过调用urllib2.urlopen(myTargetService)
来进行远程请求,但这样做并没有把当前会话的cookie传递过去。
我创建了一个会话访问中间件,用来在设置中存储会话:
class SessionAccessMiddleware:
def process_request(self, request):
settings.current_session = request.session
这样,我可以在get_request和post_request中访问请求的会话,但我不知道如何让urllib2以会话特定的方式记住我的cookies。
我该怎么做呢?
1 个回答
这里有一些例子,展示了如何使用 urllib2
和 cookielib
来完成你想做的事情,具体可以参考这个链接:http://docs.python.org/library/cookielib.html#examples。根据文档,你需要创建一个 cookielib.CookieJar
,然后用正确的数据(来自会话)设置cookie,接着构建一个使用你这个 CookieJar
的 opener
,最后用它来获取 yourTargetService
的内容。
如果你在中间件代码中的 settings
是指 from django.conf import settings
,那就不太好。你可以查看这个链接:http://github.com/svetlyak40wt/django-globals/,它提供了一个安全存储请求范围内数据的地方,这样你就可以在 request
对象无法访问的地方使用这些数据。此外,写一个自定义的认证后端并与 django.contrib.auth
一起使用,可能是个不错的主意,而不是从头开始自己做一个认证系统,相关内容可以在这里找到:http://docs.djangoproject.com/en/dev/topics/auth/#writing-an-authentication-backend。