WSGI/Django:将用户名传回Apache以记录访问日志
我有一个Django应用,它是在Apache服务器上通过mod_wsgi部署的,使用的是Django的标准WSGIHandler。用户通过Django的表单登录进行身份验证,所以在Apache看来,用户是匿名的。这让Apache的访问日志变得不太有用。
有没有办法在处理完请求后,通过WSGI包装器把用户名传回Apache,这样它就能出现在Apache的访问日志中呢?
(版本:Django 1.1.1,mod_wsgi 2.5,Apache 2.2.9)
5 个回答
这可能不是你想要的答案,但你可以在你的网址中使用用户名。这样,用户的信息就会出现在你的apache日志的路径部分。
你需要调整一下你的认证方式,让需要认证的请求在apache日志中更明显。否则,当你查看日志时,可能会把没有认证的请求误认为是已经认证的用户发出的。比如,如果请求没有通过认证,可以返回一个临时的重定向,让用户去登录页面。
你可以使用 mod_auth_tkt。简单来说,auth_tkt
是一种带有用户ID的签名 cookie,Apache(一个常用的网页服务器)能够识别它。当用户登录或登出时,你的网页应用需要 设置这个 cookie。Apache 可以从这个 cookie 中提取出 REMOTE_USER
,然后把它传递给你的网页应用,或者传递给同一台服务器上运行的非 Django 网页应用,还可以把它记录到日志里,随你怎么用。
你只能在嵌入模式下做到这一点,并且需要使用一个叫做apswigpy的单独包,它为原始的Apache请求对象提供了Python的接口。mod_wsgi包提供了一种可选的机制,允许原始的Apache请求对象作为Python的CObject引用在WSGI环境中传递。你可以把它和apswigpy一起使用,像这样:
from apache.httpd import request_rec
r = request_rec(environ['apache.request_rec'])
r.user = user
至少我认为这会设置好相关的信息,供访问日志使用。
你真的应该把这个讨论转到mod_wsgi的邮件列表上。