Мое приложение стремится обернуть представления входа и выхода из django.contrib.auth.views некоторыми базовыми возможностями аудита / ведения журнала.Я следую рецепту, как описано в проекте django-axes , и при запуске на сервере и некоторых других тестах он работает, как и ожидалось, прозрачно, без проблем.
Код идетнапример:
from django.contrib.auth import views as auth_views
from myapp.watchers import watch_login
class WatcherMiddleware(object):
def __init__(self):
auth_views.login = watch_login(auth_views.login)
И
def watch_login(func):
def decorated_login(request, *args, **kwargs):
#do some stuff
response = func(request, *args, **kwargs)
#more stuff
return response
return decorated_login
URL:
#Edit: Added project's urls - just using vanilla django's auth login
(r'^accounts/login/$', 'django.contrib.auth.views.login',{"template_name":settings.LOGIN_TEMPLATE }),
Однако в нашем рабочем процессе сборки мы сталкиваемся с некоторыми проблемами в django.contrib.auth.tests.views.
В частности, это тесты, которые не выполняются в django.contrib.auth:
ERROR: test_current_site_in_context_after_login (django.contrib.auth.tests.views.LoginTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Python26\lib\site-packages\django\contrib\auth\tests\views.py", line 192, in test_current_site_in_context_after_login
response = self.client.get(reverse('django.contrib.auth.views.login'))
File "C:\Python26\lib\site-packages\django\core\urlresolvers.py", line 351, in reverse
*args, **kwargs)))
File "C:\Python26\lib\site-packages\django\core\urlresolvers.py", line 297, in reverse
"arguments '%s' not found." % (lookup_view_s, args, kwargs))
NoReverseMatch: Reverse for 'myapp.watchers.decorated_login' with arguments '()' and keyword arguments '{}' not found.
======================================================================
ERROR: test_security_check (django.contrib.auth.tests.views.LoginTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Python26\lib\site-packages\django\contrib\auth\tests\views.py", line 204, in test_security_check
login_url = reverse('django.contrib.auth.views.login')
File "C:\Python26\lib\site-packages\django\core\urlresolvers.py", line 351, in reverse
*args, **kwargs)))
File "C:\Python26\lib\site-packages\django\core\urlresolvers.py", line 297, in reverse
"arguments '%s' not found." % (lookup_view_s, args, kwargs))
NoReverseMatch: Reverse for 'myapp.watchers.decorated_login' with arguments '()' and keyword arguments '{}' not found.
Только эти два теста не выполняются с включением обернутой обезьяны для входаpatch.
Кажется, что вызов reverse () в тесте проверки подлинности django ведет себя иначе, чем непатченная функция.Новые сигналы аутентификации в django 1.3 заключаются в том, что предоставленный там метод регистрации сообщает вам только о том, что произошла неправильная попытка - он не дает вам доступ к объекту запроса для регистрации дополнительной информации об этомпо запросу.Исправление формы аутентификации в этом случае не помогло бы, поэтому мы должны обернуть функцию входа в систему.
Я что-то не так делаю с переносом функции входа в систему?Или это можно ожидать, если тесты не пройдут из-за других побочных эффектов, несмотря на отсутствие изменений в общей функциональности?
edit: я использую python 2.6.4, django 1.2.5