我似乎和这个问题有同样的问题:Django logout problem
我的有点奇怪,它可以在 google chrome 中运行……但在 Firefox 中不行……
这是我的注销功能:(在views.py中)
def my_logout(request):
logger.debug("Logout called by user")
try:
# Here I do some custom stuff, like logging this action in a database and so on
# For this question it shouldn't matter... because in a try catch
# so whatever goes wrong here, logging out should work anyway
except Exception, e:
logger.info("Logging logout action error: %s" % e)
logout(request)
return HttpResponseRedirect("/")
在 settings.py 我有:
LOGIN_URL = '/desktop/login/'
LOGOUT_URL = '/desktop/logout/'
LOGIN_REDIRECT_URL = '/'
在应用程序iamapps 的urls.py 中(包括在项目url 中为/desktop/):
url(r'^login/$', 'iamapps.views.my_login', name='iamapps.login'),
url(r'^logout/$', 'iamapps.views.my_logout', name='iamapps.logout'),
更多信息:
- django 1.4.3(刚刚从 1.3 更新到 1.4 ....)
- 蟒蛇2.7
- 适用于 Chrome 但不适用于 Firefox 17.0.1、Linux
它在 google chrome 中工作但在 firefox 中不工作的事实最让我困惑。似乎它与firefox不断记住用户登录有关......
编辑: 我的管道坏了……但我似乎不是在注销时得到它……而是在注销后进入主视图……
Traceback (most recent call last):
File "/usr/lib/python2.7/wsgiref/handlers.py", line 86, in run
self.finish_response()
File "/usr/lib/python2.7/wsgiref/handlers.py", line 127, in finish_response
self.write(data)
File "/usr/lib/python2.7/wsgiref/handlers.py", line 210, in write
self.send_headers()
File "/usr/lib/python2.7/wsgiref/handlers.py", line 268, in send_headers
self.send_preamble()
File "/usr/lib/python2.7/wsgiref/handlers.py", line 192, in send_preamble
'Date: %s\r\n' % format_date_time(time.time())
File "/usr/lib/python2.7/socket.py", line 324, in write
self.flush()
File "/usr/lib/python2.7/socket.py", line 303, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 58684)
Traceback (most recent call last):
File "/usr/lib/python2.7/SocketServer.py", line 582, in process_request_thread
self.finish_request(request, client_address)
File "/usr/lib/python2.7/SocketServer.py", line 323, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/media/storage/django/sites/iamfloraservice/parts/django/django/core/servers/basehttp.py", line 139, in __init__
super(WSGIRequestHandler, self).__init__(*args, **kwargs)
File "/usr/lib/python2.7/SocketServer.py", line 641, in __init__
self.finish()
File "/usr/lib/python2.7/SocketServer.py", line 694, in finish
self.wfile.flush()
File "/usr/lib/python2.7/socket.py", line 303, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe
----------------------------------------
[24/Dec/2012 14:33:25] "GET / HTTP/1.1" 200 48247
编辑 2 它在注销并被重定向后进入此视图:
def home(request, template='iamfloraservice/home.html'):
logger.debug("Home view called by user %s" % request.user)
return render_to_response(template,{},context_instance=RequestContext(request))
我认为请求重定向到这个视图会导致问题....在日志中它仍然是用户'michel'(因为视图使用来自重定向的请求,并且有用户michel)......但是.. . 用户 michel 正在同时注销....
编辑 3
由于建议是由于记录器。取消记录日志并没有帮助它是默认记录器:
import logging
logger = logging.getLogger(__name__)
编辑 4 (30-12-2012)
我的注销来自一个主窗口,当用户登录时我会显示一个注销链接,如果用户注销,我会显示一个登录链接。它还包含一个工具栏,根据用户及其组成员身份填充哪些工具。
我认为问题是,它正在重新加载这个主窗口,而缓存和它的请求中的用户还没有被清除。不知何故,Chrome 知道如何处理这个问题,而 Firefox 会导致管道损坏错误。在浏览器中手动清除缓存会导致重新加载后的正确视图....
一个解决方案可能是重定向到一个没有任何包含用户的页面......或者找出在我自己的正确时刻清除缓存......
这个问题描述的可能相同......但我不能指望用户在浏览器中做任何事情只是为了注销?请参阅django 1.4 将 GET 缓存到 /login/
编辑 5 (31-12-2012)
似乎这是一个缓存问题....但不知道如何解决这个问题。
这些是我的缓存设置:
if not DEBUG:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}
else:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
}
}
但我也试过没有 dummycache
编辑 6(2013 年 1 月 4 日)仍然没有解决方案....我将注销方式更改为 django 方式,现在我正在使用信号...请参阅下面的我自己的答案。
但它仍然给出了brokenpipe错误,导致firefox停止注销。这不是缓存问题。如果我转到另一个页面,或者更糟糕的是......管理页面。我仍然登录。注销的唯一方法是通过管理页面上的注销......如果它不是管理员用户......没有办法让我在 firefox 浏览器上注销。
使用管理界面注销时,信号工作正常...
我通过关闭信号进行了检查....仍然无法在Firefox中注销。
结论:回到主页()是导致问题的原因。
编辑 7(2013 年 1 月 4 日)我为测试制作了一个简单的注销视图,这个模板:
<html>
<head>
<title>
Logged out
</title>
</head>
<body>
You are succesfully logged out.<br>
<br>
<a href="/">Go back to the main page</a>
or<br>
<a href="/desktop/login/?next=/">log in again</a>
</body>
</html>
和注销的视图:
class LoggedOutView(TemplateView):
template_name = "iamapps/logged_out.html"
并将网址更改为:
url(r'^logout/$', 'django.contrib.auth.views.logout', {'next_page': '/desktop/loggedout/'}, name='iamapps.logout'),
#url(r'^logout/$', 'django.contrib.auth.views.logout_then_login', name='iamapps.logout'),
url(r'^loggedout/$', LoggedOutView.as_view(),name='iamapps.loggedout'),
而且,为了简单起见……我已经关闭了信号。
它仍然无法在 Firefox 中运行......但它在 chrome 中运行
在 Firefox 中,它不会转到已注销的页面