web-dev-qa-db-ja.com

Djangoテストフレームワークで基本的なHTTPアクセス認証を使用する

私の一部のDjango=ビューで、基本的なHTTPアクセス認証を実行するデコレータを作成しました。しかし、Djangoでテストケースを書いているときに、これが私のやり方です。誰かがこれが役に立てば幸いです。

48
Humphrey

ここに私がそれをした方法があります:

from Django.test import Client
import base64
auth_headers = {
    'HTTP_AUTHORIZATION': 'Basic ' + base64.b64encode('username:password'),
}
c = Client()
response = c.get('/my-protected-url/', **auth_headers)

注:ユーザーも作成する必要があります。

67
Humphrey

Django TestCaseでは、クライアントのデフォルトを更新して、HTTP基本認証資格情報を含めることができます。

import base64
from Django.test import TestCase

class TestMyStuff(TestCase):

    def setUp(self):
        credentials = base64.b64encode('username:password')
        self.client.defaults['HTTP_AUTHORIZATION'] = 'Basic ' + credentials
29
Ryan Nowakowski

Python3の場合、_username:password_文字列をbase64エンコードできます。

_base64.b64encode(b'username:password')
_

これはバイトを返すため、.decode('ascii')を使用してASCII文字列に転送する必要があります。

完全な例:

_import base64

from Django.test import TestCase


def test_authorized(self):
    headers = {
        'HTTP_AUTHORIZATION': 'Basic ' + base64.b64encode(b'username:password').decode("ascii")
    }
    response = self.client.get('/', **headers)
    self.assertEqual(response.status_code, 200)
_
2
markushinsche

ログインフォームがあると想定して、次の手法を使用してテストフレームワークを通じてログインします。

    client = Client()
    client.post('/login/', {'username': 'john.smith', 'password': 'secret'})

もう認証済みなので、他のテストではclientを持ち歩きます。この投稿に対するあなたの質問は何ですか?

2
Thierry Lam

(python3)私はこれをテストで使用しています:

credentials_string = '%s:%s' % ('invalid', 'invalid')
credentials = base64.b64encode(credentials_string.encode())
self.client.defaults['HTTP_AUTHORIZATION'] = 'Basic ' + credentials.decode()

とビューの次の:

import base64
[...]
type, auth = request.META['HTTP_AUTHORIZATION'].split(' ', 1)
auth = base64.b64decode(auth.strip()).decode()
1
obotezat

これを行う別の方法は、Django Client()をバイパスして、代わりにリクエストを使用することです。

class MyTest(TestCase):
    def setUp(self):
        AUTH = requests.auth.HTTPBasicAuth("username", "password")

    def some_test(self):
        resp = requests.get(BASE_URL + 'endpoint/', auth=AUTH)
        self.assertEqual(resp.status_code, 200)
0
David D.