私の一部のDjango=ビューで、基本的なHTTPアクセス認証を実行するデコレータを作成しました。しかし、Djangoでテストケースを書いているときに、これが私のやり方です。誰かがこれが役に立てば幸いです。
ここに私がそれをした方法があります:
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)
注:ユーザーも作成する必要があります。
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
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)
_
ログインフォームがあると想定して、次の手法を使用してテストフレームワークを通じてログインします。
client = Client()
client.post('/login/', {'username': 'john.smith', 'password': 'secret'})
もう認証済みなので、他のテストではclient
を持ち歩きます。この投稿に対するあなたの質問は何ですか?
(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()
これを行う別の方法は、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)