3

私のアプリは、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.

ラップされたログインモンキーパッチを含めると、これら2つのテストのみが失敗します。
django authテストのreverse()呼び出しは、パッチが適用されていない関数の動作とは異なる動作をするようです。

ロギングをラップするためにこのルートを使用するのと、django 1.3の新しい認証シグナルを使用するためにこのルートを使用する理由は、そこに提供されているロギングメソッドは、間違った試行が発生した場合にのみ通知するためです。その不適切なリクエストに関する追加情報をログに記録します。その場合、認証フォームにパッチを適用することは役に立たなかったため、ログイン機能をラップする必要があります。

ログイン機能のラップで何か問題がありますか?それとも、全体的な機能に変更がないにもかかわらず、他の副作用のためにテストが失敗した場合に予想されることですか?

編集:私はpython 2.6.4、django1.2.5を実行しています

4

2 に答える 2

5

単に別のビューでラップすることはできませんか?

urls

url(
    r'^accounts/login/$',
    'accounts.views.login',
    {"template_name":settings.LOGIN_TEMPLATE }
),

accounts.views

from django.contrib.auth import views as auth_views   

def login(request, *args, **kwars):
    # do some stuff    
    response = auth_views.login(request, *args, **kwars)
    # more stuff
    return response

このように、django.contrib.auth.testsそれらが作成されたビューをテストし、必要な「より多くのもの」について独自のテストを作成できます。

于 2011-05-07T17:43:42.160 に答える
3

これは、テストランナーがその時点でテストされているアプリのURLのみをインポートするという点で、django-registrationに影響を与える同じ根本的な問題であると思われます。つまり、この問題に類似したものについてはさまざまなチケットがありますが、クイックスキャンはありcontrib.authません。それらのうちの解決策は、物事を切り離すことであり、それは私が推測しているあなたの解決策では実行可能ではないことを意味します。myapp

もう1つの方法は、FabricファイルまたはMakefileを使用してテストのサブセットをトリガーし、モンキーパッチが原因で失敗する2つを回避してから、2つの代替の類人猿に優しいテストを追加してそれらを置き換えることです。

于 2011-05-06T09:19:23.677 に答える