Django项目默认添加了用户认证系统的,可以通过python manage.py makemigrations
python manage.py migrate
将认证系统的数据表添加到数据库中去。
from django.contrib.auth.models import User user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword') # 这里可以设置其它的字段 user.save()
$ python manage.py createsuperuser --email=896499825@qq.com --username=wanghao Password: Password (again): Superuser created successfully.
需要注意的是,为了不与login冲突,views最好不要写成login
from django.contrib.auth import authenticate, login user = authenticate(username='hao', password='test') if user is not None: if user.is_activate: print('用户验证并登录成功') login(request, user) # 这才是登录,才会写入session else: print('密码正确,但是用户无法登录') return HttpResponse('居然有这个用户') else: return HttpResponse('用户不存在')
若登录成功,则会返回一个user对象,否则返回None,但是Django默认的认证系统只能认证username和password,却不能认证其它的字段,比如email字段,看似非常糟糕,但是Django却提供了十分方便的功能来扩展默认的验证组件。查看文档:Customizing authentication in Django
如果要验证用户名或email可以这样做:首先,在myapp目录下新建一个文件,姑且取名叫backends.py,其内容如下:
from django.conf import settings from django.contrib.auth.models import User class EmailOrUsernameModelBackend(object): def authenticate(self, username=None, password=None): if '@' in username: kwargs = {'email': username} else: kwargs = {'username': username} try: user = User.objects.get(**kwargs) if user.check_password(password): return user except User.DoesNotExist: return None def get_user(self, user_id): try: return User.objects.get(pk=user_id) except User.DoesNotExist: return None
然后在settings.py中添加如下代码:
# 该字段指定了默认的验证后台,从上到下顺序验证,如果上面验证不成功就验证下面的 AUTHENTICATION_BACKENDS = ( 'myapp.backends.EmailOrUsernameModelBackend', # 自定义的认证后台 'django.contrib.auth.backends.ModelBackend', # 这是默认的认证后台 )
这样,就可以依然使用刚才的代码对用户登录进行验证了。
from django.contrib.auth import logout def logout_view(request): logout(request)
某些路由只能登录用户才能访问,那么只需要添加这个装饰器:
from django.contrib.auth.decorators import login_required @login_required def my_view(request): ......