我在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信号作为我的替代方法。我创建了一个post_login信号,它将每个登录用户的用户名存储在数据库中的表Visitor中。在每次注销时,其他信号post_logout将从该表中删除用户。部分代码如下:
#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)
请注意,我在谷歌应用引擎上运行我的应用程序时收到以下错误。 错误:服务器错误 服务器遇到错误,无法完成您的请求。
此外,我无法登录应用程序的管理员部分。请帮我找到正确的方法来实现这个要求或让我知道我做错了什么。 感谢您耐心阅读这个巨大的问题描述:-)
答案 0 :(得分:2)
您不应该像编辑那样编辑django框架。请勿触摸django.contrib.auth
中的文件如果您希望在某人登录后发送信号,请在您的视图中发送信号,以便记录此人
不确定你的实际错误是什么,因为你没有显示它(如果这是一个开发环境设置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)