初始数据夹具中的用户

Naf*_*Kay 54 django django-models django-authentication

我在默认情况下创建了一些用户,fixtures/initial_data.json以便进行一些测试"主题".我遇到的问题是密码生成.我可以在"字段"中设置密码,但这不会生成哈希密码:

[
    { "model": "auth.user",
        "pk": 1,
        "fields": {
            "username": "user1",
            "password": "password"
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

我需要一种方法来生成用户的密码.我是否必须手动执行此操作并生成{hash_method}${salt}${hashed_password}类似Django 的字符串?

Tim*_*ony 94

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

$ python manage.py dumpdata auth.User --indent 4 > users.json
Run Code Online (Sandbox Code Playgroud)

它将自动为您创建灯具,稍后可以使用loaddata

(如果需要大量测试用户,您可以创建一个假帐户并在其余设备中使用哈希)

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

  • "如果你需要很多测试用户,你可以创建一个假账户并在其余的灯具中使用哈希" - >这个提示救了我!非常感谢 :) (2认同)

Tom*_*dor 18

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

如何获取密码"因为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.
    """
    # ...
Run Code Online (Sandbox Code Playgroud)

请参阅此示例会话:

./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']
Run Code Online (Sandbox Code Playgroud)

您也可以手动使用hasher的encode方法,但上面的实用程序功能可以让您更轻松地使用.


Gau*_*ola 13

我在为测试编写灯具时遇到了同样的问题.这是我在单元测试中处理这个问题的方法.

从admin创建数据并将它们转储到fixture中但我不太喜欢依赖于手动执行它.所以这就是我的工作 -

像完成后一样创建夹具,然后在setUp方法中set_password为用户创建.

user_fixture.json

[
    { "model": "auth.user",
        "pk": 1,
        "fields": {
            "username": "user1",
            "password": "password"
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

这样我就可以在夹具中干净地写入密码,并在需要时返回它们,并通过编辑夹具文件创建更多夹具.


its*_*ire 5

添加到@GauravButola 的答案中,我创建了一个自定义管理命令来加载夹具并一步修复密码。这在不使用测试框架来设置密码时很有用。该示例适用于 django 1.11 和可能更早的版本。

在您提供夹具的应用程序中添加您的管理命令(这是 python3 次,所以我省略了 init pys):

yourapp/
    models.py
    fixtures/
        initial_data.json
    management/
        commands/
            initdata.py
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

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

./manage.py initdata
Run Code Online (Sandbox Code Playgroud)


Cub*_*czx 5

从数据库转储用户信息:

$ python manage.py dumpdata auth.User --indent 4 > users.json
Run Code Online (Sandbox Code Playgroud)

导入/加载特定 JSON 夹具的数据:

$ python manage.py loaddata users.json
Run Code Online (Sandbox Code Playgroud)