有时我想以编程方式设置密码。我执行以下操作:
https://docs.djangoproject.com/en/2.2/topics/auth/default/#changing-passwords
You can also change a password programmatically, using set_password():
from django.contrib.auth.models import User
u = User.objects.get(username='john')
u.set_password('new pass')
u.save()
Run Code Online (Sandbox Code Playgroud)
我想看看当我们运行时,save() 中的事情是如何实现的u.save()
基本上我想理解 AbstractBaseUser 中使用的 save() 方法
# ./.venv/lib/python3.7/site-packages/django/contrib/auth/base_user.py
class AbstractBaseUser(models.Model):
password = models.CharField(_('password'), max_length=128)
........
# Stores the raw password if set_password() is called so that it can
# be passed to password_changed() after the model is saved.
_password = None
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
if self._password is not None:
password_validation.password_changed(self._password, self)
self._password = None …Run Code Online (Sandbox Code Playgroud) 我有一个基于类的视图,即子类LoginView.
from django.contrib.auth.views import LoginView
class CustomLoginView(LoginView):
def get_success_url(self):
url = self.get_redirect_url()
return url or reverse_lazy('knowledgebase:user_home', kwargs={
'username':self.request.user.username,
})
Run Code Online (Sandbox Code Playgroud)
如果用户的电子邮件尚未激活,我想覆盖错误消息,因为他们必须单击发送到其电子邮件地址的链接。当前的默认消息如下所示:
而不是说:
请输入正确的电子邮件地址和密码。两个地方都要注意大小写。
我想说一句话,大意是:
请确认您的电子邮件,以便您可以登录。
我试过:
from django.contrib.auth.forms import AuthenticationForm
from django.utils.translation import gettext as _
class PickyAuthenticationForm(AuthenticationForm):
def confirm_login_allowed(self, user):
if not user.is_active:
raise forms.ValidationError(
_("Please confirm your email so you can log in."),
code='inactive',
)
Run Code Online (Sandbox Code Playgroud)
class CustomLoginView(LoginView): # 1. <--- note: this is a class-based view
form_class = PickyAuthenticationForm # 2. <--- note: define form …Run Code Online (Sandbox Code Playgroud) 我有一个名为aaa的应用程序,在aaa的models.py中,我喜欢:
from django.db import models
from django.contrib.auth.models import User
class BBB(models.Model):
user = models.OneToOneField(User)
newsletter=models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)
我添加到我的setting.py
AUTH_PROFILE_MODULE = 'aaa.BBB'
Run Code Online (Sandbox Code Playgroud)
然后我去django shell并输入
>>> from django.contrib.auth.models import User
>>> a=User.objects.get(id=1)
>>> a.get_profile()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python2.6/dist-packages/Django-1.2.5-py2.6.egg/django/contrib/auth/models.py", line 373, in get_profile
self._profile_cache = model._default_manager.using(self._state.db).get(user__id__exact=self.id)
File "/usr/local/lib/python2.6/dist-packages/Django-1.2.5-py2.6.egg/django/db/models/query.py", line 347, in get
% self.model._meta.object_name)
DoesNotExist: BBB matching query does not exist.
Run Code Online (Sandbox Code Playgroud)
有些人有想法有什么不对吗?编辑:我做manage.py syncdb
我的应用程序试图用一些基本的审计/日志记录功能包装django.contrib.auth.views登录和注销视图.我遵循django-axes项目中描述的处方,并且在运行服务器和其他一些测试时,它按预期工作,透明地没有问题.
代码如下:
from django.contrib.auth import views as auth_views
from myapp.watchers import watch_login
class WatcherMiddleware(object):
def __init__(self):
auth_views.login = watch_login(auth_views.login)
Run Code Online (Sandbox Code Playgroud)
和
def watch_login(func):
def decorated_login(request, *args, **kwargs):
#do some stuff
response = func(request, *args, **kwargs)
#more stuff
return response
return decorated_login
Run Code Online (Sandbox Code Playgroud)
网址:
#Edit: Added project's urls - just using vanilla django's auth login
(r'^accounts/login/$', 'django.contrib.auth.views.login',{"template_name":settings.LOGIN_TEMPLATE }),
Run Code Online (Sandbox Code Playgroud)
但是,在我们的构建工作流程中,我们遇到了django.contrib.auth.tests.views中的一些问题.
具体来说,这些是django.contrib.auth中失败的测试:
ERROR: test_current_site_in_context_after_login (django.contrib.auth.tests.views.LoginTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Python26\lib\site-packages\django\contrib\auth\tests\views.py", line 192, in test_current_site_in_context_after_login
response = self.client.get(reverse('django.contrib.auth.views.login'))
File "C:\Python26\lib\site-packages\django\core\urlresolvers.py", line …Run Code Online (Sandbox Code Playgroud) 我正在使用Django构建一个Web论坛,包括内置的身份验证模块.
我正在使用内置UserCreationForm来注册用户.但是,由于我决定使用电子邮件地址作为识别用户的唯一方法,因此我在为用户注册之前为其生成用户名.
为了说明已经注册的用户,在生成用户名之前,我检查用户不存在所提供的电子邮件地址.
request.POST在Django ORM的查询中直接使用提供的电子邮件地址而不对其进行任何消毒是否安全?我在文档中看不到有关request.POST被清理数据的任何内容,但ORM可以防止SQL注入.我还缺少其他潜在的攻击吗?
我目前正在建立一个帮助台票务系统作为学校项目.我正在使用内置的django auth系统,我想从auth系统引用用户ID.例如,票证将分配给某个帮助台员工.我模特的一部分:
class Ticket(models.Model):
category = models.ManyToManyField(Category)
title = models.CharField(max_length=30)
submitted = models.DateTimeField(editable=False)
submitter = #reference to user
assignedTo = #reference to helpdesk employee
Run Code Online (Sandbox Code Playgroud)
用户在组中user,帮助台员工属于helpdeskemployeedjango auth系统组.
所以我尝试了这个:
class Ticket(models.Model):
category = models.ManyToManyField(Category)
title = models.CharField(max_length=30)
submitted = models.DateTimeField(editable=False)
submitter = models.OneToOneField(User)
assignedTo = user = models.OneToOneField(User)
Run Code Online (Sandbox Code Playgroud)
但这会在运行时出现以下错误python manage.py syncdb:
CommandError: One or more models did not validate:
deskman.ticket: Accessor for field 'submitter' clashes with related field 'User.ticket'. Add a related_name …Run Code Online (Sandbox Code Playgroud) 我有一个运行Django,uWSGI和Nginx的项目.目前我使用默认的Django管理站点,服务于example.com/admin.我想改变它,以便管理站点仅在admin.example.com.
做这个的最好方式是什么?
我曾经考虑过要开始一个全新的Django项目,admin.example.com但是使用与运行的项目相同的数据库设置example.com,但我希望有更优雅的东西,因为这会涉及在项目之间复制很多设置和应用程序.基本上两者之间的唯一区别是,安装了管理站点和URL模式,而不会安装.
(我的理由是最终想要使用google auth proxy之类的东西来保护管理站点,但是非管理员登录会通过正常的身份验证后端.看起来我可以通过指定Django使用HTTP Basic Auth来实现这一点admin.example.com,但坚持使用默认后端example.com.)
当用户更改密码时,我想发送一个信号,以便我可以在某些型号上做一些事情.
我该如何创建此信号?
我查看post_save了用户的信号:
post_save.connect(user_updated, sender=User)
Run Code Online (Sandbox Code Playgroud)
但是,我似乎没有任何东西可以检查密码是否已更改:
def user_updated(sender, **kwargs):
print(kwargs) # {'created': False, 'raw': False, 'instance': <User: 100002>, 'update_fields': None, 'signal': <django.db.models.signals.ModelSignal object at 0x7ff8862f03c8>, 'using': 'default'}
Run Code Online (Sandbox Code Playgroud)
我也看到有一个password_change_doneauth视图,但我不确定我是如何使用它的.https://docs.djangoproject.com/en/1.10/topics/auth/default/#built-in-auth-views
有任何想法吗?
我正在尝试在Django中创建一个"删除帐户"功能.我用DeleteView它来做这个目的.
问题是在调用此视图后,Django引发:
Request Method: GET
Request URL: http://127.0.0.1:8000/profiles/delete-account/
Django Version: 1.11.7
Exception Type: TemplateDoesNotExist
Exception Value:
auth/user_confirm_delete.html
Run Code Online (Sandbox Code Playgroud)
我的看法:
class DeleteAccount(LoginRequiredMixin,DeleteView):
model = User
def get_object(self, queryset=None):
user = self.request.user
userprofile = user.userprofile
userprofile.prepare_to_delete_account()
return user
Run Code Online (Sandbox Code Playgroud)
为什么它会尝试渲染这个template以及为什么没有这样的模板,如果它被调用?
你知道怎么解决这个问题吗?