python Django परीक्षण ढांचे में बेसिक HTTP एक्सेस प्रमाणीकरण का उपयोग करना




unit-testing http-authentication (4)

Python3 के लिए, आप अपने username:password स्ट्रिंग को आधार-एनकोड कर सकते username:password :

base64.b64encode(b'username:password')

यह बाइट देता है, इसलिए आपको इसे ASCII स्ट्रिंग में .decode('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)

मेरे कुछ 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)

नोट: आपको एक उपयोगकर्ता बनाने की भी आवश्यकता होगी।


मान लें कि मेरे पास एक लॉगिन फ़ॉर्म है, मैं परीक्षण रूपरेखा के माध्यम से लॉगिन करने के लिए निम्न तकनीक का उपयोग करता हूं:

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

मैं client को अपने अन्य परीक्षणों में इधर-उधर करता हूं क्योंकि यह पहले से ही प्रमाणित है। इस पोस्ट पर आपका क्या सवाल है?


इसका दूसरा तरीका यह है कि आप Django क्लाइंट () को बायपास करें और इसके बजाय रिक्वेस्ट का उपयोग करें।

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)




django-testing