网站提供登录、注册等用户认证功能是一个常见的需求。因此,Django 提供了一套功能完整的、灵活的、易于拓展的用户认证系统:django.contrib.auth。在本教程中,我将向你展示 auth 模块的基本用法,例如如何提供用户注册、登录、修改密码、找回密码等功能;如何拓展 auth 内置的 User 模型;如何自定义用户验证后台,以支持用户使用诸如邮箱手机号等用户名登录(默认只支持使用用户名登录)等等。
开启一个新的 Django 工程
推荐新建一个 Django 工程来作为演示或者作为练习,以免把已有的项目搞乱了。本教程的演示项目基于最新版 Django 1.11.1 和 Python 3.5,不过对于其它的 Django 和 Python 同样适用。首先在 Python 环境下安装 Django(推荐使用虚拟环境,如何使用虚拟环境可以参考 搭建 Django 开发环境。接下来使用 Django 提供的命令建立一个新的工程,我把它命名为 django_auth_example。
$ django-admin startproject django_auth_example
工程建好了,目录结构如下:
django_auth_example/
manage.py
django_auth_example/
__init__.py
settings.py
urls.py
wsgi.py
必要的配置
Django 在新建工程时已经为使用用户认证系统做好了全部必要的配置。不过有可能你并非使用 django-admin 命令新建的工程,或者你使用的是一个正在开发中的项目,因此最好再检查一下 settings.py 文件中是否已经做好了全部必要配置。
首先检查一下必要的应用是否已经在 INSTALLED_APPS
配置里列出:
django_auth_example/settings.py
INSTALLED_APPS = [
# 其它应用列表...
'django.contrib.auth',
'django.contrib.contenttypes',
]
为了使用用户认证系统,必须安装以下两个应用:
- django.contrib.auth
- django.contrib.contenttypes
django.contrib.contenttypes 是 auth 模块的用户权限处理部分依赖的应用。
其次需要在中间件 MIDDLEWARE
配置里列出以下两个中间件:
- SessionMiddleware 用户处理用户会话。
- AuthenticationMiddleware 绑定一个 User 对象到请求中(具体将在后面介绍)。
即像下面这样的配置:
django_auth_example/settings.py
MIDDLEWARE = [
# 其它中间列表...
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
]
如果以上配置没问题的话就可以正常地使用用户认证系统了。
新建一个应用
即便是目前只使用 Django 用户认证系统的默认特性,推荐的做法也是新建一个应用,用于存放和用户功能相关的代码,为将来可能的功能拓展做准备。因此让我们来新建一个应用,我习惯上把应用命名为 users。
$ python manage.py startapp users
新建的应用一定要记得在 settings.py 里注册,否则 Django 无法得知你新建了应用。
django_auth_example/settings.py
INSTALLED_APPS = [
# 其它应用列表...
'django.contrib.auth',
'django.contrib.contenttypes',
'users', # 注册新建的应用 users
]
OK,项目的基本准备工作到这里就结束了,接下来让我们开始使用 Django 用户系统为我们提供的功能吧!
总结
本教程的示例项目代码位于 GitHub:Django Auth Example。
如果遇到问题,请通过下面的方式寻求帮助。
- 在下方评论区留言。
- 将问题的详细描述通过邮件发送到 djangostudyteam@163.com,一般会在 24 小时内回复。
- 在 Pythonzhcn 社区的新手问答版块 发布帖子。
更多 Django 相关教程,请访问我的个人博客:追梦人物的博客。
-- EOF --
博客做的也太帅了吧!!前端写的很棒,看来还是要多多学习!!
博主能不能讲一下评论回复的实现思路啊
1529220039
感谢楼主分享。
感谢分享, 谢谢!
博主你好,非常感谢你的教程。我把这个user app装在博客project里,试图创建一个可注册的博客系统,但是发现数据库是共通的,请问如何让用户拥有私人数据库呢?我谷歌了但是可能因为关键词不对找不到教程,感谢帮助!
不太明白你的意思,数据库只有一个,如果你是说需要根据不同用户限制其访问数据库中某些数据的权限,应该考虑权限系统。
博主,按照这个用户认证重置密码邮箱收不到链接,GitHub上的源码运行邮箱好像也收不到重置链接,邮箱在表中中存在的
重置密码的邮件应该发在控制台,去控制台看看。
群主,
username email = credentials.get('email', credentials.get('username'))
if user.check_password(credentials["password"])
这两句中的,credentials是指什么呢? 后台是怎样调用的逻辑呢?
谢谢啊,困惑我好久.
credentials 就是凭证,这里我们传入 email(如果没有则是 username)和 password 验证用户的信息,即如果用户名或者邮箱对应的密码正确,就说明用户信息有效。
博主,有个问题想问问,一直 找不到解决方法,我在博客基础上拓展了其他用户也可以写文章的功能,但在传入标签的时候出了问题,每次都只能获取到select标签的最后一项,我在网上看到说写成request.POST.getlist就可以得到multiple复选框的多值,但我一改成这样就会出现Tag query doesn't exist的错误
原来在view.py是这样写的:
tag_list = Tag.objects.get(name=request.POST.get('tags'))
模板里是这样的:
<label >标签:</label>
<div class="related-widget-wrapper">
{% get_all_tags as tag_list %}
<select name="tags" multiple="multiple">
{% for tag in tag_list %}
<option > {{ tag.name }} </option>
{% endfor %}
</select>
赋值是这样的,听说赋值多对多外键必须这样:
a = Article.objects.create(author=request.user,title=title, body=body, category=cate)
a.save()
a.tags.add(tag_list)
a.save()
其他项都可以正常保存至数据库,就tag只有最后一个保存进去了,每次都这样,可能的解决方法有哪些呢,感觉要在模板里面改吗?毕竟好像错误是tag标签不存在?
好吧,那个错误是:Tag matching query does not exist.
我查了下好像是Tag.objects.get(name=request.POST.getlist('tags'))中那个get方法后面没用对,应该是没找着匹配的东西,也就是没找着我选中的值,诶,到底怎么get到复选框里的东西啊,好难受
这个东西我也不太清楚,你想获取多选框的值,思路是对的,你可以 print 看看 POST.getlist('tags') 返回的是什么,就知道后续该如何对应操作了。另外获取多个 model 实例不要用 Tag.objects.get,应该用 filter,否则你会得到错误。
成功了。感谢博主!感谢博主出这么详细的教程
博主,现在博客显示页面教学有了,注册登录也有了,什么时候来一个写博客界面教学就完美了,,,
什么是博客界面教学?css么?
.
django.contrib.auth
django.contrib.contenttypes
这两个怎么下载啊,django1.11有自带吗?
自带的,直接导入即可。