Сигналы Django в GAE с помощью django-nonrel

Я использую django-nonrel для своего проекта в GAE. Мое требование состоит в том, чтобы в моем приложении одновременно только один пользователь мог входить в систему с заданным именем пользователя. Я попытался реализовать следующие предложенные подходы: Разрешить только один одновременный вход в систему для каждого пользователя в приложении django и Как я могу обнаружить несколько входов в веб-приложение Django из разных мест? Но проблема в том, что оба подхода работают на сервере разработки, но не работают на движке приложений Google. . Поэтому я переключился на django-signal в качестве альтернативного подхода. Я создал один сигнал 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)

Обратите внимание, что я получаю следующую ошибку при запуске моего приложения на движке приложений Google. Ошибка: ошибка сервера. Сервер обнаружил ошибку и не смог выполнить ваш запрос.

Также я не могу войти в административную часть приложения. Пожалуйста, помогите мне найти правильный подход к выполнению этого требования или дайте мне знать, где я делаю не так. Спасибо за терпение, что прочитали это огромное описание проблемы :-)


person SRC    schedule 20.02.2011    source источник
comment
Ошибка: ошибка сервера не является сообщением об ошибке; это веб-страница по умолчанию, возвращаемая при ошибке 500. Проверьте журналы своего приложения и вставьте трассировку или, по крайней мере, фактическое сообщение об ошибке.   -  person Wooble    schedule 20.02.2011
comment
@Wooble: Спасибо, Вубл, за ваш ответ .. на самом деле я не знаю, где проверить журналы или фактическое сообщение об ошибке в движке приложения Google .. что мне для этого нужно сделать?   -  person SRC    schedule 20.02.2011
comment
@Wooble: Надеюсь, мне нужно использовать Google Analytics .. Я проверяю и скоро сообщу вам информацию. Спасибо   -  person SRC    schedule 20.02.2011
comment
@SRC: вы можете просмотреть журналы на appengine.google.com   -  person Wooble    schedule 21.02.2011
comment
@Wooble: Да, я проверил логи и исправил код. Но основной вопрос: поддерживает ли django-nonrel сигналы django в GAE, поскольку для события входа в систему он не создает таблицу посетителей (согласно моему коду в models.py. Также такая же таблица создается на сервере разработки)? Кстати, спасибо, что указали мне на журналы appengine. Я не знал об этом :-)   -  person SRC    schedule 21.02.2011
comment
Интересно, а разве никто об этом не знает? Друзья хотя бы дайте мне знать, пишу ли я свои сигнальные коды в нужном месте.   -  person SRC    schedule 21.02.2011


Ответы (1)


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)
person MattoTodd    schedule 22.02.2011
comment
Еще раз спасибо MattoTodd за ваш ответ .. На самом деле я не получаю никаких ошибок в GAE, но когда я получаю доступ к значениям таблицы посетителей, я не могу ничего напечатать. Он дает мне сообщение «Статус: 200 OK. Различное: Тип содержимого cookie: text / html; charset = utf-8 'вместо результата. Обратите внимание, что я вижу, что таблица создана из средства просмотра баз данных на appengine.google.com. - person SRC; 24.02.2011
comment
Я узнал, что это сообщение я получаю из-за печати результата перед отправкой Http-ответа. Итак, рендеринг шаблона и использование результата в нем дает ожидаемый результат. Кстати, я внес определенные изменения в свой код, чтобы включить signal.send в мои представления в соответствии с вашим предложением. Большое спасибо и добрые пожелания !! - person SRC; 24.02.2011