用户在初始数据夹具

我在我的fixtures/initial_data.json默认创build了一些用户,以便进行一些testing“主题”。 我遇到的问题是密码生成。 我可以在“字段”中设置密码,但不会生成哈希密码:

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

我需要一种方法来生成用户的密码。 我是否必须手动执行此操作,并像Django一样生成像{hash_method}${salt}${hashed_password}这样的string?

在这种情况下(如果你只需要几个用户)可能更容易,通过pipe理员(包括密码)创build一些假的用户帐户,然后使用dumpdata将用户转储到一个fixtures文件:

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

这将自动为您创build灯具,并可以在以后与loaddata使用

(如果你需要大量的testing用户,你可以创build一个假帐户,并在你的灯具的其余部分使用散列)

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

好吧,我同意答案,但让我回答原来的问题。

如何获得密码“,因为Django会散列它”?

让我们来看一个文件django/contrib/auth/hashers.py

 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. """ # ... 

看到这个例子会话:

 ./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'] 

你也可以手动使用hasher的encode方法,但是上面的效用函数让你更容易理解。

在为testing编写灯具时遇到了同样的问题。 以下是我在unit testing中如何处理这个问题。

从pipe理员创build数据并将其转储到夹具中,但我不太想依赖于手动操作。 所以这就是我所做的 –

像刚刚完成的那样创buildfixture,然后在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() 

这样,我可以干净地在灯具中写入密码,并在需要时将它们反馈给他们,并简单地通过编辑灯具文件来创build更多的灯具。

添加到@GauravButola的答案,我创build了一个自定义pipe理命令来加载夹具和修复密码在一个步骤。 这在不使用testing框架来设置密码时很有用。 这个例子是使用Django 1.11和可能更早的版本。

在您的应用程序提供夹具添加您的pipe理命令(这是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() 

现在你可以加载你的initial_data,并通过调用有效的密码:

 ./manage.py initdata 

很确定你做的。 不应该那么困难。 最简单的方法是看看我认为是这样的函数user.set_password ,看看他们是如何做到的。 你可以从pythonterminal调用函数,然后把它复制到你的初始数据中!