मेरी समस्या यह है कि मैं अपने विकास डेटाबेस से अलग एक अलग परीक्षण डेटाबेस रखना चाहता था। ऐप स्वयं डीजेगो-रेस्ट-फ्रेमवर्क त्वरित-प्रारंभ ट्यूटोरियल के लगभग समान है, बस मैं एलडीएपी बैकएंड का उपयोग करता हूं। मेरा विकास डेटाबेस MySQL का उपयोग करता है। मेरे पास परीक्षण के लिए अलग सेटिंग्स फ़ाइल है।अलग डेटाबेस पर Django परीक्षण "ऑपरेशनल एरर: ऐसी कोई तालिका नहीं: auth_user"
पूर्ण त्रुटि ट्रैस बैक मैं यहाँ में डाल: http://dpaste.com/1W3TX1E, लेकिन दिलचस्प हिस्सा है:
sqlite3.OperationalError: no such table: auth_user
पूर्ण परीक्षण सेटिंग्स यहां हैं: http://dpaste.com/1K7KHK4। मेरे संबंधित सेटिंग कर रहे हैं (pyldap और Django-ldap प्रमाणीकरण इंस्टॉल किए गए एप्लिकेशन से याद कर रहे हैं, वे पिप के साथ मैन्युअल रूप से स्थापित कर रहे हैं):
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'njord',
'permissions',
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ':memory:',
}
}
अभी एप्लिकेशन मूल रूप से एलडीएपी के साथ ही प्रमाणीकरण करता है। मुझे लगता है कि यही कारण है कि मुझे एक त्रुटि है - जब मैं परीक्षण करता हूं तो मेरे डेटाबेस में कुछ भी नहीं है - कोई उपयोगकर्ता नहीं, कोई समूह नहीं। यदि उपयोगकर्ता को एलडीएपी सर्वर के खिलाफ प्रमाणित किया जाता है, तो उपयोगकर्ता डेटाबेस में सभी समूहों के साथ बनाया जाता है, इसलिए यह मांग पर होता है।
क्या काम करता है: मेरे ऐप का विकास संस्करण बाह्य एलडीएपी के खिलाफ अच्छी तरह से काम करता है और विकास डेटाबेस के साथ कार्यों का परीक्षण भी करता है।
क्या काम नहीं करता है: sqllite3 इन-मेमोरी डेटाबेस (मैं दोहराता हूं, विकास डेटाबेस के साथ परीक्षण और मैक किए गए ldap कार्यों के साथ परीक्षण)।
कोड के साथ मैं परीक्षण यहाँ है:
from django.test import TestCase, Client
import django
import ldap
from mockldap import MockLdap
class AuthenticationTests(TestCase):
"""
Set Up the structure (Accounts, Groups) and try authentication
"""
# Top level hierarchy
top = ('dc=ee', {'dc': ['ee']})
test = ('dc=test,dc=ee', {'dc': ['test']})
# Top level groups
people = ('ou=people,dc=test,dc=ee', {'ou': ['people'], 'objectClass': ['organizationalUnit', 'top']})
groups = ('ou=groups,dc=test,dc=ee', {'ou': ['groups'], 'objectClass': ['organizationalUnit', 'top']})
# Groups
admins = ('cn=admins,ou=groups,dc=test,dc=ee', {'cn': ['admins'], 'memberUid': ['admin'],
'objectClass': ['sambaGroupMapping', 'posixGroup', 'top'],
'gidNumber': ['1']})
group1 = ('cn=group1,ou=groups,dc=test,dc=ee', {'cn': ['group1'],
'memberUid': ['alice', 'bob'],
'objectClass': ['sambaGroupMapping', 'posixGroup', 'top']})
group2 = ('cn=group2,ou=groups,dc=test,dc=ee', {'cn': ['group2'], 'memberUid': ['admin', 'bob', 'karl'],
'objectClass': ['sambaGroupMapping', 'posixGroup', 'top']})
# Users
admin = ('uid=admin,ou=people,dc=test,dc=ee', {'uid': ['admin'], 'userPassword': ['ldaptest'], 'sn': ['Joe'],
'cn': ['Admin Joe'], 'mail': ['[email protected]'],
'givenName': ['Admin'], 'objectClass':
['top', 'person', 'posixAccount', 'shadowAccount',
'inetOrgPerson', 'sambaSamAccount']})
alice = ('uid=alice,ou=people,dc=test,dc=ee', {'uid': ['alice'], 'userPassword': ['ldaptest'], 'sn': ['Cooper'],
'cn': ['Alice Cooper'], 'mail': ['[email protected]'],
'givenName': ['Alice'], 'objectClass':
['top', 'person', 'posixAccount', 'shadowAccount',
'inetOrgPerson', 'sambaSamAccount']})
bob = ('uid=bob,ou=people,dc=test,dc=ee', {'uid': ['bob'], 'userPassword': ['ldaptest'], 'sn': ['Marley'],
'cn': ['Bob Marley'], 'mail': ['[email protected]'],
'givenName': ['Bob'], 'objectClass':
['top', 'person', 'posixAccount', 'shadowAccount',
'inetOrgPerson', 'sambaSamAccount']})
karl = ('uid=karl,ou=people,dc=test,dc=ee', {'uid': ['karl'], 'userPassword': ['ldaptest'], 'sn': ['Suur'],
'cn': ['Karl Suur'], 'mail': ['[email protected]'],
'givenName': ['Karl'], 'objectClass':
['top', 'person', 'posixAccount', 'shadowAccount',
'inetOrgPerson', 'sambaSamAccount']})
# This is the content of our mock LDAP directory. It takes the form
# {dn: {attr: [value, ...], ...}, ...}.
directory = dict([top, test, people, groups, admins, group1, group2, admin, alice, bob, karl])
@classmethod
def setUpTestData(cls):
# We only need to create the MockLdap instance once. The content we
# pass in will be used for all LDAP connections.
cls.mockldap = MockLdap(cls.directory)
@classmethod
def tearDownClass(cls):
del cls.mockldap
def setUp(self):
# Patch ldap.initialize
django.setup()
self.mockldap.start()
self.ldapobj = self.mockldap['ldap://localhost/']
def tearDown(self):
# Stop patching ldap.initialize and reset state.
self.mockldap.stop()
del self.ldapobj
def test_some_basic_mockldap_auth(self):
searchStr = 'uid=alice,ou=people,dc=test,dc=ee'
results = _do_simple_ldap_search(searchStr)
ldapName = results[0][0]
ldapPropDict = results[0][1]
self.assertEqual(searchStr, ldapName)
self.assertEqual(len(ldapPropDict), 7)
def test_index_visible_for_all(self):
c = Client()
response = c.get("/")
self.assertContains(response, "https://stackoverflow.com/users/", 1)
self.assertContains(response, "/groups/", 1)
def test_login(self):
c = Client()
response = c.post("/api-auth/login/", {'username': 'bob', 'password': 'ldaptest'})
print(response.status_code)
response = c.get("https://stackoverflow.com/users/")
print(response._container)
def _do_simple_ldap_search(searchStr):
conn = ldap.initialize('ldap://localhost/')
conn.simple_bind_s(searchStr, 'ldaptest')
results = conn.search_s(searchStr, ldap.SCOPE_SUBTREE,)
return results
कोड भी यहाँ उपलब्ध: http://dpaste.com/3D2H4NK (वाक्यविन्यास उजागर)।
मुझे यकीन नहीं है, समस्या क्या है। केवल एक चीज जिसे मैं सोच सकता हूं वह यह है कि सृजन में डेटाबेस में कोई उपयोगकर्ता नहीं है, डेटाबेस नहीं बनाया गया है, लेकिन मुझे यकीन नहीं है। किसी भी प्रकार की मदद की बेहद सराहना की जाती है।
मैंने सभी माइग्रेशन किए हैं।
(venv)[email protected]:~/workspace/fileshare/njord$ python manage.py showmigrationsadmin
[X] 0001_initial
[X] 0002_logentry_remove_auto_add
auth
[X] 0001_initial
[X] 0002_alter_permission_name_max_length
[X] 0003_alter_user_email_max_length
[X] 0004_alter_user_username_opts
[X] 0005_alter_user_last_login_null
[X] 0006_require_contenttypes_0002
[X] 0007_alter_validators_add_error_messages
contenttypes
[X] 0001_initial
[X] 0002_remove_content_type_name
sessions
[X] 0001_initial
(venv)[email protected]:~/workspace/fileshare/njord$ python manage.py makemigrationsNo changes detected
(venv)[email protected]:~/workspace/fileshare/njord$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, sessions, auth, contenttypes
Running migrations:
No migrations to apply.