0

我在 GAE 上的项目中使用 django-nonrel。我的要求是,在我的应用程序中,一次只有一个用户应该使用给定的用户名登录。我尝试实施以下建议的方法: 在 django 应用程序中每个用户只允许一个并发登录以及如何检测从不同位置登录到 Django Web 应用程序的多个登录? 但问题是这两种方法都适用于开发服务器,但不适用于谷歌应用引擎。所以我改用 django-signals 作为我的替代方法。我创建了一个 post_login 信号,它将每个登录用户的用户名存储在数据库中的访问者表中。在每次注销时,其他信号 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)

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

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

4

1 回答 1

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)
于 2011-02-22T18:18:48.693 回答