我在GAE上的项目中使用了django-nonrel。我的要求是,在我的应用程序中,一次只能有一个用户使用给定的用户名登录。我尝试实现了以下建议的方法:Allow only one concurrent login per user in django app和How can I detect multiple logins into a Django web application from different locations?,但问题是这两种方法在开发服务器上都有效,但在谷歌应用程序引擎上不起作用。所以我转而使用django-signals作为我的替代方法。我创建了一个post_login信号,将每个登录用户的用户名存储在数据库的Visitor表中。每次注销时,其他信号post_logout都会将用户从此table.The中移除。代码部分如下:
#signals.py
post_login = django.dispatch.Signal(providing_args=['request', 'user'])
post_logout = django.dispatch.Signal(providing_args=['request', 'user'])
#models.py
def login_handler(sender,user, **kwargs):
try:
result=Visitor.objects.get(user=user)
print "You already have login with your name"
except:
visitor=Visitor()
visitor.user=user
visitor.save()
post_login.connect(login_handler)
def logout_handler(sender,user, **kwargs):
try:
result=Visitor.objects.get(user=user)
result.delete()
except:
return False
post_logout.connect(logout_handler)
#django.contrib.auth.__init.py__
def login(request):
:
user_logged_in.send(sender=user.__class__, request=request, user=user)
post_login.send(sender=None,request=request, user=user)
def logout(request):
:
user_logged_out.send(sender=user.__class__, request=request, user=user)
post_logout.send(sender=None,request=request, user=user)请注意,当我在google app engine上运行我的应用程序时,我得到了以下错误。错误:服务器错误服务器遇到错误,无法完成您的请求。
此外,我无法登录到应用程序的管理部分。请帮助我找到正确的方法来实现这个要求,或者让我知道我哪里做错了。感谢您耐心阅读这个庞大的问题描述:-)
发布于 2011-02-23 02:18:49
1.
您不应该像现在这样编辑django框架。请勿触摸django.contrib.auth中的文件
如果您希望在某人登录后发送信号,请在您登录该人的视图中发送信号
2.
不确定您的实际错误是什么,因为您没有显示它(如果这是一个开发环境,设置DEBUG = True以获得更好的堆栈跟踪),但通过查看您的代码,您没有在信号处理程序中正确获取参数。它应该看起来更像这样:
def login_handler(sender, **kwargs):
try:
user = kwargs['user']
request = kwargs['request']
result=Visitor.objects.get(user=user)
print "You already have login with your name"
except:
visitor=Visitor()
visitor.user=user
visitor.save()
post_login.connect(login_handler)https://stackoverflow.com/questions/5055608
复制相似问题