2011-11-05 16 views
40

में उपयोगकर्ता मैं अपने fixtures/initial_data.json में डिफ़ॉल्ट रूप से कुछ उपयोगकर्ता बना रहा हूं ताकि कुछ परीक्षण "विषय" हो सकें। मुझे लगता है कि समस्या पासवर्ड पीढ़ी है। मैं 'क्षेत्रों' में पासवर्ड सेट कर सकता है, लेकिन यह एक टुकड़े किए गए पासवर्ड जेनरेट नहीं होगा:प्रारंभिक डेटा स्थिरता

[ 
    { "model": "auth.user", 
     "pk": 1, 
     "fields": { 
      "username": "user1", 
      "password": "password" 
     } 
    } 
] 

मैं एक तरह से उपयोगकर्ता का पासवर्ड जेनरेट करना होगा। क्या मुझे इसे मैन्युअल रूप से करना है और {hash_method}${salt}${hashed_password} जैसे स्ट्रिंग जेनरेट करना है?

उत्तर

78

क्या इस मामले में आसान हो सकता है (और यदि आप केवल कुछ ही उपयोगकर्ताओं की जरूरत है) का उपयोग कर फ़ाइल कुछ नकली उपयोगकर्ता (पासवर्ड समेत) और फिर एक जुड़नार के लिए उपयोगकर्ताओं को डंप व्यवस्थापक के माध्यम से खातों बनाने के लिए किया जाता है DumpData:

$ python manage.py dumpdata auth.User --indent 4 > users.json 

अपने आप आपके लिए जुड़नार पैदा करेगा और

(आप सिर्फ एक नकली खाता बनाने और अपने जुड़नार के बाकी हिस्सों में हैश उपयोग करें यदि आप के बहुत सारे की जरूरत सकता है loaddata के साथ बाद में इस्तेमाल किया जा सकता है जो परीक्षण उपयोगकर्ताओं)

https://docs.djangoproject.com/en/dev/ref/django-admin/#dumpdata-appname-appname-appname-model

+0

हम्म - मुझे एक रिक्त डंप में परिणाम यहां के लिए यह करने के लिए कोशिश कर रहा। –

+1

ठीक है - स्थानीय स्क्लाइट डीबी से काम करता है, लेकिन मुख्य mysql डीबी नहीं। क्या यह एक सुरक्षा सुविधा है? –

+2

"यदि आप बहुत सारे परीक्षण उपयोगकर्ताओं की आवश्यकता है तो आप केवल एक नकली खाता बना सकते हैं और अपने शेष फिक्स्चर में हैश का उपयोग कर सकते हैं" -> इस टिप ने मुझे बचा लिया है! बहुत बहुत धन्यवाद :) – daveoncode

0

आपको यकीन है कि आप करते हैं। यह मुश्किल नहीं होना चाहिए। सबसे आसान तरीका फंक्शन user.set_password को देखना होगा, मुझे लगता है कि यह है, और देखो कि वे इसे कैसे करते हैं। आप शायद फ़िथन टर्मिनल से फ़ंक्शन को कॉल कर सकते हैं और फिर इसे अपने प्रारंभिक डेटा में कॉपी कर सकते हैं!

13

ठीक है, मैं जवाब के साथ सहमति व्यक्त करते हैं, लेकिन मुझे मूल सवालों के जवाब देने हैं।

पासवर्ड कैसे प्राप्त करें "जैसा कि Django इसे धोया होगा"?

def make_password(password, salt=None, hasher='default'): 
    """ 
    Turn a plain-text password into a hash for database storage 

    Same as encode() but generates a new random salt. If 
    password is None or blank then UNUSABLE_PASSWORD will be 
    returned which disallows logins. 
    """ 
    # ... 

इस उदाहरण सत्र देखें::

के एक फ़ाइल django/contrib/auth/hashers.py नजर डालते हैं

./manage.py shell 

>>> from django.contrib.auth.hashers import make_password, HASHERS 
>>> make_password('test') 
'pbkdf2_sha256$10000$vkRy7QauoLLj$ry+3xm3YX+YrSXbri8s3EcXDIrx5ceM+xQjtpLdw2oE=' 

# fix salt: 
>>> make_password('test', 'abc') 
'pbkdf2_sha256$10000$abc$MqJS5OAgSmf9SD9mfoY8fgLo8sSKmEcef0AjjMp1Q7w=' 

# use different (maybe faster, maybe unsafe!) hasher 

In [12]: HASHERS 
Out[12]: 
{'bcrypt': <django.contrib.auth.hashers.BCryptPasswordHasher object at 0x29c6d50>, 
'crypt': <django.contrib.auth.hashers.CryptPasswordHasher object at 0x29c6f50>, 
'md5': <django.contrib.auth.hashers.MD5PasswordHasher object at 0x29c6e10>, 
'pbkdf2_sha1': <django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher object at 0x29c6bd0>, 
'pbkdf2_sha256': <django.contrib.auth.hashers.PBKDF2PasswordHasher object at 0x29c6cd0>, 
'sha1': <django.contrib.auth.hashers.SHA1PasswordHasher object at 0x29c6dd0>, 
'unsalted_md5': <django.contrib.auth.hashers.UnsaltedMD5PasswordHasher object at 0x29c6ed0>, 
'unsalted_sha1': <django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher object at 0x29c6e50>} 

In [14]: [make_password('test', hasher=name) for name in HASHERS] 
Out[14]: 
['sha1$LdKsAbJRjlVP$2eb2346387cc510f576f2f11eebdfe18b20d1be1', 
'pbkdf2_sha256$10000$Ck8gtWQJnJ9x$M/OqP548d5KcPqFuVRgXb84unjYbYDH6oyimbDndE3k=', 
'pbkdf2_sha1$10000$BJqRu5OwylVF$hUvMLIzBujt9kPbML/dei1vLiMQ=', 
'crypt$$d9grSeqDhMFek', 
'098f6bcd4621d373cade4e832627b4f6', 
'sha1$$a94a8fe5ccb19ba61c4c0873d391e987982fbbd3', 
'bcrypt$$2a$12$WlJP5zm2lmdJ4g/pSE1xF.d/8w.XRT5mo/vGlkKdglBtzcxKw7XJS', 
'md5$txHYmSYJKhD4$69286d4a1abd348fbddc9df7687e2ed4'] 

आप मैन्युअल क़मी बनाने की मशीन के encode विधि का उपयोग कर सकते हैं, लेकिन इसके बाद के संस्करण उपयोगिता समारोह आप एक में शामिल किया गया है आसान तरीका

7

परीक्षणों के लिए फिक्स्चर लिखते समय मैं एक ही समस्या में आया। यहां बताया गया है कि मैं इसे यूनिट परीक्षणों में कैसे प्रबंधित कर रहा हूं।

व्यवस्थापक से डेटा बनाना और उन्हें स्थिरता कार्यों में डंप करना लेकिन मुझे मैन्युअल रूप से इसे करने पर निर्भर होने की तरह नहीं है। तो यहां मैं क्या करता हूं -

जैसे ही आपने किया है और फिर setUp विधि, set_password एस में उपयोगकर्ताओं के लिए स्थिरता बनाएं।

user_fixture.json

[ 
    { "model": "auth.user", 
     "pk": 1, 
     "fields": { 
      "username": "user1", 
      "password": "password" 
     } 
    } 
] 

test_user।py

def setUp(self): 
    self.User = get_user_model() 

    # Fix the passwords of fixtures 
    for user in self.User.objects.all(): 
     user.set_password(user.password) 
     user.save() 

इस तरह से मैं सफाई से स्थिरता में पासवर्ड लिख सकते हैं और जब मैं और अधिक जुड़नार बनाने के लिए बस संपादन स्थिरता फ़ाइल द्वारा की जरूरत है उन्हें देख सकते हैं।

2

@GauravButola के उत्तर में जोड़कर, मैंने स्थिरता लोड करने और पासवर्ड को एक चरण में ठीक करने के लिए एक कस्टम प्रबंधन कमांड बनाया। यह तब उपयोगी होता है जब पासवर्ड के सेटअप को करने के लिए परीक्षण ढांचे का उपयोग नहीं किया जाता है। उदाहरण django 1.11 और शायद पुराने संस्करणों के साथ काम कर रहा है।

अपने ऐप्लिकेशन में स्थिरता अपने प्रबंधन कमांड जोड़ने उपलब्ध कराने के (इस python3 बार है, इसलिए मैं init pys छोड़े गए):

yourapp/ 
    models.py 
    fixtures/ 
     initial_data.json 
    management/ 
     commands/ 
      initdata.py 
initdata.py साथ

इस तरह लग रही:

from django.core.management import BaseCommand, call_command 
from django.contrib.auth.models import User 
# from yourapp.models import User # if you have a custom user 


class Command(BaseCommand): 
    help = "DEV COMMAND: Fill databasse with a set of data for testing purposes" 

    def handle(self, *args, **options): 
     call_command('loaddata','initial_data') 
     # Fix the passwords of fixtures 
     for user in User.objects.all(): 
      user.set_password(user.password) 
      user.save() 

अब आप अपने प्रारंभिक_डेटा को लोड कर सकते हैं और कॉल करके वैध पासवर्ड प्राप्त कर सकते हैं:

./manage.py initdata 
0

उपयोगकर्ता जानकारी को डंप करें मीटर डेटाबेस:

$ python manage.py dumpdata auth.User --indent 4 > users.json 

आयात/लोड डेटा especific JSON स्थिरता:

$ python manage.py loaddata users.json 
संबंधित मुद्दे