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 forcreate_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')