私はこの質問と同じ問題を抱えているようです:Djangoログアウトの問題
私のは少し奇妙です、それはグーグルクロームで動作します....しかし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に更新されました...)
- Python 2.7
- Chromeで動作しますが、Firefox 17.0.1、Linuxでは動作しません
それがグーグルクロームで機能するが、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はパイプの破損エラーを引き起こします。ブラウザで手動でキャッシュをクリアすると、リロード後に正しいビューになります。
解決策は、ユーザーを含むページに何も含まれていないページにリダイレクトするか、自分で適切なタイミングでキャッシュをクリアすることです。
この問題はおそらく同じことを説明しています...しかし、ユーザーがログアウトするためだけにブラウザで何かをすることは期待できませんか?GETを/login/にキャッシュするdjango1.4を参照してください
編集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',
}
}
しかし、私はダミーキャッシュなしでも試しました
編集6(4-jan-2013)まだ解決策がありません....ログアウトの方法をdjangoの方法に変更し、現在信号を使用しています...以下の自分の回答を参照してください。
それでも、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を次のように変更しました。
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で動作していません....しかしそれはクロムで動作します
Firefoxでは、ログアウトしたページには移動しません