我似乎遇到了与此问题相同的问题:Django注销问题
我有点怪,它适用于谷歌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("/")
Run Code Online (Sandbox Code Playgroud)
在settings.py我有:
LOGIN_URL = '/desktop/login/'
LOGOUT_URL = '/desktop/logout/'
LOGIN_REDIRECT_URL = '/'
Run Code Online (Sandbox Code Playgroud)
在app iamapps的urls.py中(在项目网址中包含/ desktop /):
url(r'^login/$', 'iamapps.views.my_login', name='iamapps.login'),
url(r'^logout/$', 'iamapps.views.my_logout', name='iamapps.logout'),
Run Code Online (Sandbox Code Playgroud)
进一步信息:
事实上,它确实在谷歌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
Run Code Online (Sandbox Code Playgroud)
编辑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))
Run Code Online (Sandbox Code Playgroud)
我认为重定向请求到此视图导致问题....在日志中它仍然是用户'michel'(因为视图使用来自重定向的请求,并且有用户michel)...但是..用户michel同时退出....
编辑3
因为它是由记录器引起的.取消标记日志记录无效并且它是默认记录器:
import logging
logger = logging.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)
编辑4(30-12-2012)
我的注销来自一个主窗口,我在用户登录时显示注销链接,如果用户注销则显示登录链接.它还包含一个工具栏,根据用户和组的成员身份填充工具.
我认为问题是,它正在重新加载这个主窗口,而缓存和它的请求中的用户尚未清除.不知何故Chrome知道如何处理这个问题,而firefox导致管道错误.在重新加载后,在浏览器中手动清除缓存会导致正确的视图....
一个解决方案可能是重定向到一个页面,其中没有包含用户的任何东西......或者找出在合适的时刻清除缓存myselve ....
这个问题可能描述的相同......但我不能指望用户在浏览器中做任何事情只是为了注销?看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',
}
}
Run Code Online (Sandbox Code Playgroud)
但我也试过没有虚拟缓存
编辑6(4-jan-2013)仍然没有解决方案....我改变了我退出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>
Run Code Online (Sandbox Code Playgroud)
和注销的视图:
class LoggedOutView(TemplateView):
template_name = "iamapps/logged_out.html"
Run Code Online (Sandbox Code Playgroud)
并将网址更改为:
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'),
Run Code Online (Sandbox Code Playgroud)
而且,简单地说就是......我关掉了信号.
它仍然没有在firefox中工作....但它适用于chrome
在Firefox中,它不会进入已注销的页面
Cra*_*enz 12
我通常只使用提供的视图来注销用户.只需将其添加到您的根urls.py文件:
# Would be nice to use settings.LOGIN_URL for `next_page` here, too
url(r'^logout/$', 'django.contrib.auth.views.logout', {'next_page': '/login'}),
Run Code Online (Sandbox Code Playgroud)
你会好起来的.
快乐的Djangoing.
最后我完全切换到几乎回到 django 默认值......使用:
在views.py中:
from django.contrib.auth.forms import AuthenticationForm
from django.views.generic.edit import FormView
class LoginView(FormView):
"""
This is a class based version of django.contrib.auth.views.login.
"""
form_class = AuthenticationForm
redirect_field_name = REDIRECT_FIELD_NAME
template_name = 'iamapps/login.html'
@method_decorator(csrf_protect)
@method_decorator(never_cache)
def dispatch(self, *args, **kwargs):
return super(LoginView, self).dispatch(*args, **kwargs)
def form_valid(self, form):
"""
The user has provided valid credentials (this was checked in AuthenticationForm.is_valid()). So now we
can check the test cookie stuff and log him in.
"""
self.check_and_delete_test_cookie()
login(self.request, form.get_user())
return super(LoginView, self).form_valid(form)
def get_context_data(self, **kwargs):
context = super(LoginView, self).get_context_data(**kwargs)
apps_settings=iamapps_settings()
if apps_settings[LOGON_BASE_APP_NAME]:
self.extend_template="%s/base.html" % apps_settings[LOGON_BASE_APP_NAME]
else:
self.extend_template="iamapps/base.html"
context['extend_template']=self.extend_template
return context
def form_invalid(self, form):
"""
The user has provided invalid credentials (this was checked in AuthenticationForm.is_valid()). So now we
set the test cookie again and re-render the form with errors.
"""
self.set_test_cookie()
return super(LoginView, self).form_invalid(form)
def get_success_url(self):
if self.success_url:
redirect_to = self.success_url
else:
redirect_to = self.request.REQUEST.get(self.redirect_field_name, '')
netloc = urlparse.urlparse(redirect_to)[1]
if not redirect_to:
redirect_to = settings.LOGIN_REDIRECT_URL
# Security check -- don't allow redirection to a different host.
elif netloc and netloc != self.request.get_host():
redirect_to = settings.LOGIN_REDIRECT_URL
return redirect_to
def set_test_cookie(self):
self.request.session.set_test_cookie()
def check_and_delete_test_cookie(self):
if self.request.session.test_cookie_worked():
self.request.session.delete_test_cookie()
return True
return False
def get(self, request, *args, **kwargs):
"""
Same as django.views.generic.edit.ProcessFormView.get(), but adds test cookie stuff
"""
self.set_test_cookie()
return super(LoginView, self).get(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
和网址:
url(r'^login/$', LoginView.as_view(), name='login'),
Run Code Online (Sandbox Code Playgroud)
这解决了我所有的麻烦...关于登录和注销...
登录和注销信号工作正常:
from django.contrib.auth.signals import user_logged_out, user_logged_in
# Note, these login and logout signals are registered in imamstats views
def iam_logged_out_actions(sender, user, request, **kwargs):
try:
# ... do my logging out actiosn (stats etc.)
except Exception, e:
logger.error("Logging logout action error: %s" % e)
# Note, these login and logout signals are registered in imamstats views
def iam_logged_in_actions(sender, user, request, **kwargs):
try:
# ... do my log in stats etc. things
except Exception, e:
logger.error("Logging login action error: %s" % e)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11777 次 |
| 最近记录: |