0

私はセロリを使用しており、「root」ユーザーではなく、リクエストを送信したユーザーに代わってセッションを推進したいと考えています。たとえば、基本的なタスクは次のようになります(非常に工夫された例)

@task
def process_checklist(**kwargs):

    log = process_checklist.get_logger()
    document = kwargs.get('document', None)
    company = kwargs.get('company', None)
    user = kwargs.get('user', None)

    object = Book.object.get_or_create(name=kwargs.get('name'))

これを行うことにはトレードオフがありますが、実際にビューを使用してこれを行う方がはるかに有益だと思います。これは、テスト方法と非常によく似ています。実際には、これはデータのバッチアップロードに使用され、各行は事実上CreateView。

client = Client()
client.login(user='foo', password='bar')
client.post(reverse('create_book_view', data=**kwargs))

しかし、(可能であれば)django.test.client Clientクラスを実際に使用して、パスワードを知らずにユーザーにログインし、ユーザーのビューに入力するための良い方法を考えることはできません。私はこれを考えましたが、もっと良い方法があると確信していますか?

これが私が思いついたものですか?

class AxisClient(Client):
    # The admin account is created by us.  Once that is done everything should be tested through
    # the system.

    def login_user(self, username):
        """
        Sets the Factory to appear as if it has successfully logged into a site.

        Returns True if login is possible; False if the provided credentials
        are incorrect, or the user is inactive, or if the sessions framework is
        not available.
        """
        user = User.objects.get(username=username)
        user.backend = None
        if user and user.is_active \
                and 'django.contrib.sessions' in settings.INSTALLED_APPS:
            engine = import_module(settings.SESSION_ENGINE)

            # Create a fake request to store login details.
            request = HttpRequest()
            if self.session:
                request.session = self.session
            else:
                request.session = engine.SessionStore()
            login(request, user)

            # Save the session values.
            request.session.save()

            # Set the cookie to represent the session.
            session_cookie = settings.SESSION_COOKIE_NAME
            self.cookies[session_cookie] = request.session.session_key
            cookie_data = {
                'max-age': None,
                'path': '/',
                'domain': settings.SESSION_COOKIE_DOMAIN,
                'secure': settings.SESSION_COOKIE_SECURE or None,
                'expires': None,
            }
            self.cookies[session_cookie].update(cookie_data)

            return True
        else:
            return False
4

1 に答える 1

0

これはうまくいくようです!

class AxisClient(Client):
    # The admin account is created by us.  Once that is done everything should be tested through
    # the system.

    def login_user(self, username):
        """
        Sets the Factory to appear as if it has successfully logged into a site.

        Returns True if login is possible; False if the provided credentials
        are incorrect, or the user is inactive, or if the sessions framework is
        not available.
        """
        user = User.objects.get(username=username)
        user.backend = None
        if user and user.is_active \
                and 'django.contrib.sessions' in settings.INSTALLED_APPS:
            engine = import_module(settings.SESSION_ENGINE)

            # Create a fake request to store login details.
            request = HttpRequest()
            if self.session:
                request.session = self.session
            else:
                request.session = engine.SessionStore()
            login(request, user)

            # Save the session values.
            request.session.save()

            # Set the cookie to represent the session.
            session_cookie = settings.SESSION_COOKIE_NAME
            self.cookies[session_cookie] = request.session.session_key
            cookie_data = {
                'max-age': None,
                'path': '/',
                'domain': settings.SESSION_COOKIE_DOMAIN,
                'secure': settings.SESSION_COOKIE_SECURE or None,
                'expires': None,
            }
            self.cookies[session_cookie].update(cookie_data)

            return True
        else:
            return False
于 2012-07-13T15:26:54.933 に答える