Django使用django-nonrel在GAE上发出信号

时间:2011-02-20 06:21:24

标签: python google-app-engine django-nonrel

我在GAE项目中使用django-nonrel。我的要求是,在我的应用程序中,一次只有一个用户应该使用给定的用户名登录。我试图实现以下建议的方法: Allow only one concurrent login per user in django appHow 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)

请注意,我在谷歌应用引擎上运行我的应用程序时收到以下错误。 错误:服务器错误 服务器遇到错误,无法完成您的请求。

此外,我无法登录应用程序的管理员部分。请帮我找到正确的方法来实现这个要求或让我知道我做错了什么。 感谢您耐心阅读这个巨大的问题描述:-)

1 个答案:

答案 0 :(得分:2)

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)