Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从django shell创建用户_Python_Django_Django Shell - Fatal编程技术网

Python 如何从django shell创建用户

Python 如何从django shell创建用户,python,django,django-shell,Python,Django,Django Shell,当我从django admin创建用户时,用户密码是加密的。 但当我从django shell创建用户时,用户pasword保存为纯文本。 例如: { "date_joined": "2013-08-28T04:22:56.322185", "email": "", "first_name": "", "id": 5, "is_active": true, "is_staff": false, "is_superuser": false,

当我从
django admin
创建用户时,用户密码是加密的。 但当我从django shell创建用户时,用户pasword保存为纯文本。 例如:

{
    "date_joined": "2013-08-28T04:22:56.322185",
    "email": "",
    "first_name": "",
    "id": 5,
    "is_active": true,
    "is_staff": false,
    "is_superuser": false,
    "last_login": "2013-08-28T04:22:56.322134",
    "last_name": "",
    "password": "pbkdf2_sha256$10000$iGKbck9CED0b$6hWrKYiMPNGKhcfPVGal2YP4LkuP3Qwem+2ydswWACk=",
    "resource_uri": "/api/v1/user/5/",
    "username": "user4"
},
{
    "date_joined": "2013-08-29T01:15:36.414887",
    "email": "test@ophio",
    "first_name": "",
    "id": 6,
    "is_active": true,
    "is_staff": true,
    "is_superuser": true,
    "last_login": "2013-08-29T01:15:36.414807",
    "last_name": "",
    "password": "123test",
    "resource_uri": "/api/v1/user/6/",
    "username": "test3"
} 
我正在尝试为一个简单的博客应用程序制作REST风格的api: 当我尝试通过post请求[通过传递JSON]插入用户时,密码将保存为纯文本。
如何覆盖此行为。

您可以使用
user.set\u password
在django shell中设置密码。我甚至不确定通过
user.password
直接设置密码是否有效,因为Django需要一个密码散列

user = User(username="django")
user.set_password("secret")
user.save()
密码
字段不存储密码;它将它们存储为
$$
,因此当它检查密码时,它会计算哈希值并进行比较。我怀疑用户是否真的有一个密码,其计算出的密码哈希是
$$
格式的

如果您获得了
json
以及创建用户所需的所有信息,您就可以这样做了

User.objects.create_user(**data)
假设传递的json称为数据

注意:如果
数据中有多余或缺少的项,则会引发错误

如果您真的想覆盖此行为,您可以这样做

def override_setattr(self,name,value):
    if name == 'password':
        self.set_password(value)
    else:
        super().__setattr__(self,name,value) #or however super should be used for your version

User.__setattr__ = override_setattr

我还没有测试这个解决方案,但它应该可以工作。使用风险自负。

有两种方法可以从django shell为django用户对象设置密码

user = User(username="django", password = "secret")
user.save()
这将存储加密的密码

user = User(username="django")
user.set_password("secret")
user.save()
这将存储加密的密码

user = User(username="django")
user.set_password("secret")
user.save()
但是,


这将存储纯文本密码。没有应用哈希/加密,因为您正在直接修改属性。

您不应该像其他人建议的那样,通过正常的
用户(…)
语法创建用户。您应该始终使用
User.objects.create_User()
,它负责正确设置密码

user@host> manage.py shell
>>> from django.contrib.auth.models import User
>>> user=User.objects.create_user('foo', password='bar')
>>> user.is_superuser=True
>>> user.is_staff=True
>>> user.save()

回答那些使用django 1.9或更高版本的用户,因为django.contrib.auth.models import User的
已经被弃用(可能更早),但肯定是1.9

相反,你应该: 在bash中:

在python shell中创建具有密码的用户:

from django.apps import apps
User = apps.get_model('user', 'User')
me = User.objects.create(first_name='john', email='johnsemail@email.com') # other_info='other_info', etc.
me.set_password('WhateverIwant')  # this will be saved hashed and encrypted
me.save()
如果来自API,您可能应该应用以下表单:

import json
User = get_model('User')
class UserEditForm(BaseModelForm):
        """This allows for validity checking..."""

        class Meta:
            model = User
            fields = [
                'first_name', 'password', 'last_name',
                'dob', # etc...
            ]
# collect the data from the API:
post_data = request.POST.dict()
data = {
'first_name': post_data['firstName'],
'last_name': post_data['firstName'],
'password': post_data['password'], etc.
}
dudette = User()  # (this is for create if its edit you can get the User by pk with User.objects.get(pk=kwargs.pk))
form = UserEditForm(data, request.FILES, instance=dudette)
if form.is_valid():
    dudette = form.save()
else:
    dudette = {'success': False, 'message': unicode(form.errors)}
return json.dumps(dudette.json())  # assumes you have a json serializer on the model called def json(self):

为django创建超级用户的最快方法是键入shell:

python manage.py createsuperuser

要使脚本自动化,可以使用管道功能执行命令列表,而无需每次都键入命令

// content of "create_user.py" file
from django.contrib.auth import get_user_model

# see ref. below
UserModel = get_user_model()

if not UserModel.objects.filter(username='foo').exists():
    user=UserModel.objects.create_user('foo', password='bar')
    user.is_superuser=True
    user.is_staff=True
    user.save()
参考:

记住先激活VirtualEnv,然后运行下面的命令(对于Linux):

如果使用window,则用type命令替换cat命令

type create_user.py | python manage.py shell
或同时适用于Linux和Windows

# if the script is not in the same path as manage.py, then you must 
#    specify the absolute path of the "create_user.py" 
python manage.py shell < create_user.py
#如果脚本与manage.py不在同一路径中,则必须
#指定“create_user.py”的绝对路径
python manage.py shell

陷阱:不要在任何块中包含空行,将其视为在repl中粘贴代码。如果块中有空行,它将不起作用。

要创建用户,请执行:

$ python manage.py shell
>>>> from django.contrib.auth.models import User
>>>> user = User.objects.create_user('USERNAME', 'MAIL_NO_REQUIRED', 'PASSWORD')

也许我需要覆盖默认的用户保存,我不认为你应该这样做,因为它是默认的用户对象(也就是说,如果你这样做了,它会覆盖所有使用用户的人,除非你是子类化的)。使用
set\u password
有什么问题吗?sry,但我对原始问题做了一些更改,使其与我正在做的事情更相关。我不知道您的“完整问题”与我的答案有何冲突。如果需要在代码中创建用户,应该使用
user.objects.create\u user()
。这个神奇的用户对象来自哪里?H8,当给出的代码样本没有关键的“导入”位时
django.contrib.auth.models
Docs for
create_user()
:这可以从django.contrib.auth.models导入用户简化为
;User.objects.create_superuser('foo',password='bar')
。如果您已经定义了自己的用户,您需要从django.contrib.auth导入get_User_model
然后
User=get_User_model()
如何将json放入数据库?我使用的是django tastypi。这是否回答了您的问题
user=user(username=“django”,password=“secret”)
将无法按预期工作。请在分享之前验证建议。嘿,我只是错过了在第一条语句之后调用save()。这里还有什么错误吗?您的第一个和第三个示例导致了一个无用的用户对象。为django用户对象设置密码的唯一正确方法是:1-在现有用户对象上调用
set_password
,2-使用
User.objects创建用户对象。使用这两种方法创建用户帮助函数,您以身份验证用户输入的相同形式传入密码,确保下次尝试登录时哈希匹配将起作用。如果您使用另外两个示例设置密码,用户将永远无法登录,因为哈希检查将永远无法通过。没错。添加此示例的目的是让提问者知道何时可以使用纯文本密码。请阅读该问题,看看它是否有意义。请注意,官方文档()从
django.contrib.auth.models
导入用户模型。根据您的
other_info
kwargs判断,您可能想提及您的示例使用了自定义用户模型。这是为了进行说明,如在中,您可以将特定用户模型的任何信息放在此处。。。但是,如果有人真的有“其他信息”,那一定是一个自定义用户模型。有没有办法以非交互方式执行此操作?这实际上比键入代码慢得多@ChandanPurohit您不应该在代码中使用它,您可以使用此命令从终端创建用户。
$ python manage.py shell
>>>> from django.contrib.auth.models import User
>>>> user = User.objects.create_user('USERNAME', 'MAIL_NO_REQUIRED', 'PASSWORD')