在本教程中,你将学习如何轻松地将带有登录、注销、密码更改和重置功能的完整的身份验证系统添加到Django应用程序中。
我们将使用带有MySQL数据库的Django。
我们还将使用django-crispy-forms和Bootstrap 4对应用程序UI进行样式化。
基础知识
让我们从本教程的基础知识开始。为了一步一步地学习本教程,你需要一些要求,比如:
- 基本的Python知识,
- Django的工作知识(django-admin.py 和 manage.py),
- 你的系统安装了Python3的最近版本(最新版本是3.7),
- 你的系统安装了MySQL 数据库。
我们将使用pip和venv,它们在Python的最新版本中捆绑为模块,所以实际上不需要安装它们,除非你使用的是旧版本。
如果你准备好了,我们就开始吧!
创建一个虚拟环境
虚拟环境允许你将当前项目依赖项与系统或其他虚拟环境中全局安装的其他包隔离开来。你既可以使用需要安装在系统上的virtualenv,也可以使用Python 3最新版本中的venv模块。
打开你的命令终端,然后运行:
![26e963ddcab0e2b805931da9afbf6a7b.png](https://img-blog.csdnimg.cn/img_convert/26e963ddcab0e2b805931da9afbf6a7b.png)
接着,激活虚拟环境并使用:
![674957dbce25b6d0f2fa5ccd262231c7.png](https://img-blog.csdnimg.cn/img_convert/674957dbce25b6d0f2fa5ccd262231c7.png)
注意 : 请注意,在Windows上,你需要使用source env/Scripts/ activate来激活你的虚拟环境。
激活环境后,你需要使用pip安装Django
![7c580617be20757ebc46337c3afd66c7.png](https://img-blog.csdnimg.cn/img_convert/7c580617be20757ebc46337c3afd66c7.png)
如果成功安装了框架,现在就可以使用Django管理命令来创建和处理项目。
我们还需要安装mysq-client,使用以下命令:
![df3f6e3ce6dbc691fc13ec1255def825.png](https://img-blog.csdnimg.cn/img_convert/df3f6e3ce6dbc691fc13ec1255def825.png)
创建一个MySQL 数据库
我们将使用一个MySQL数据库。在你的终端使用以下命令调用mysql客户端:
![620fa150c427a694b2a38d3bf62eefc7.png](https://img-blog.csdnimg.cn/img_convert/620fa150c427a694b2a38d3bf62eefc7.png)
输入你的 MySQL 密码并点击 Enter.
接下来,运行以下SQL语句创建数据库:
![e490f8bace086ea25de930b323f13e52.png](https://img-blog.csdnimg.cn/img_convert/e490f8bace086ea25de930b323f13e52.png)
创建一个 Django 项目
现在我们来使用django-admin.py创建项目。在你的终端内执行以下命令:
![520f2e1c457d3c573903a7e812460ef6.png](https://img-blog.csdnimg.cn/img_convert/520f2e1c457d3c573903a7e812460ef6.png)
Django有一个ORM,它抽象了直接的数据库操作并支持SQLite, SQLite是在项目中默认配置的,因此本教程将使用SQLite数据库。
如果你需要使用PostgreSQL、MySQL或任何其他数据库管理系统,你必须先安装它,然后打开项目的settings.py,并在DATABASES对象中添加数据库地址和凭据。
下面是mysql的配置:
![82642b938302e29d35295ea22b4ab854.png](https://img-blog.csdnimg.cn/img_convert/82642b938302e29d35295ea22b4ab854.png)
确保用你自己的MySQL密码替换YOUR_DB_PASSWORD。
添加 django-crispy-forms
我们将使用Bootstrap 4设计认证表单的样式,所以你需要使用pip安装它:
![06fa60091b26712cbe7c44a22a8faf65.png](https://img-blog.csdnimg.cn/img_convert/06fa60091b26712cbe7c44a22a8faf65.png)
接下来,打开settings.py文件,将此应用程序添加到已安装的app中:
![6a60319aa23da9e183d1b1d23035c171.png](https://img-blog.csdnimg.cn/img_convert/6a60319aa23da9e183d1b1d23035c171.png)
接下来,添加以下设置,将Bootstrap 4设置为django-crispy-forms的默认样式化框架:
![8db07ce0597ffa7e1866ab4cb8eb0685.png](https://img-blog.csdnimg.cn/img_convert/8db07ce0597ffa7e1866ab4cb8eb0685.png)
创建 accounts 应用程序
应用程序是Django组织项目的方式,可以把它们看作模块。
让我们将项目中所需的身份验证逻辑封装到accounts应用程序中。显然,你可以使用任何你认为合适的有效名称。
进入终端,并导航到你的项目所在的文件夹内,如果你还没有这样做的话:
![30a9a42fccb74a3ca8fa3cf3d5f0ed45.png](https://img-blog.csdnimg.cn/img_convert/30a9a42fccb74a3ca8fa3cf3d5f0ed45.png)
接着,使用manage.py创建此应用程序:
![cbb986a85a977eb2229c277f61e954bf.png](https://img-blog.csdnimg.cn/img_convert/cbb986a85a977eb2229c277f61e954bf.png)
manage.py是Django的另一个管理脚本,它存在于项目的根目录文件夹中。它为最常用的Django管理命令提供了一个很好的包装。
前面的命令将创建一个具有默认文件结构的Django应用程序。要使这个应用程序变成你的项目的一部分,你需要打开settings.py文件并将其添加到INSTALLED_APPS数组中:
![f5c1eb2fbb35f05df64f7bdc29c8e025.png](https://img-blog.csdnimg.cn/img_convert/f5c1eb2fbb35f05df64f7bdc29c8e025.png)
就这样,你现在可以创建你的数据库,并使用以下命令运行你的Django开发服务器:
![f83b482a613a3a44c26be7b0f3ff073f.png](https://img-blog.csdnimg.cn/img_convert/f83b482a613a3a44c26be7b0f3ff073f.png)
你可以使用浏览器导航到localhost:8000地址,以便查看你的web应用程序的启动和运行情况。
auth 内置应用程序
auth应用程序是Django中内置的身份验证系统,它允许开发人员将身份验证添加到他们的应用程序中,而无需重新发明轮子来从头实现基本功能。
Django身份验证应用程序提供了以下功能:
- 通过LoginView类视图登录,
- 通过LogoutView类视图注销,
- 通过PasswordResetView类视图重置密码,
- 通过PasswordChangeView类视图更改密码,
你只需要提供模板来在你的应用程序中实现这些功能。
对于注册用户,你需要创建自己的视图和模板。
你需要在settings.py文件的INSTALLED_APPS中加入一个 django.contrib.auth应用程序,这是默认情况。
接下来,在你的accounts应用程序中创建urls.py文件,并添加以下代码:
![cc64a8727f921c74b6f33551a7ea79d0.png](https://img-blog.csdnimg.cn/img_convert/cc64a8727f921c74b6f33551a7ea79d0.png)
使用 LoginView登录用户
你可以使用基于LoginView类的视图在你的Django应用程序中登录用户。在你的 accounts/urls.py文件中添加以下路径:
![20be5b61a4b8c3a6c1c2b502992eb4b3.png](https://img-blog.csdnimg.cn/img_convert/20be5b61a4b8c3a6c1c2b502992eb4b3.png)
你只需使用LoginView的as_view()方法返回一个回调对象,该对象可以作为一个视图函数赋值给path()函数。
接下来,你需要为你的登录视图提供一个模板。在你的accounts应用程序的根目录中创建一个templates文件夹,并添加一个带有以下代码的base.html文件:
![4246612c10e33fb238258e838a6c3ae9.png](https://img-blog.csdnimg.cn/img_convert/4246612c10e33fb238258e838a6c3ae9.png)
我们首先在基本HTML模板中导入Bootstrap 4。然后,我们创建一个容器<div>、一个标题和一个main块,Django将会在其中呈现模板的其他部分。
接下来,使用以下代码创建一个templates/registration文件夹和login.html模板:
![b87baf3169f8e0afe3d696ab4bc69e42.png](https://img-blog.csdnimg.cn/img_convert/b87baf3169f8e0afe3d696ab4bc69e42.png)
我们扩展了前面的基本模板,加载crispy_forms_tags,然后覆盖main块来添加我们的登录表单。
接下来,我们创建一个带有POST方法的HTML表单,并使用`. Thecrispy`过滤器将Bootstrap样式应用于各个字段。
csrf_token将添加用于CSRF保护的字段到我们的登录表单中。
我们还添加了一个隐藏的表单字段,其中包含Django将使用的下一个URL,以便在用户成功登录时将其重定向到下一个页面。默认情况下,它会重定向accounts/profile URL。
设置登录重定向URL
你可以通过LOGIN_REDIRECT_URL设置来设置下一个URL或登录重定向URL。打开settings.py文件,添加:
![b95180a3218bf9dc792bef465a0b9a86.png](https://img-blog.csdnimg.cn/img_convert/b95180a3218bf9dc792bef465a0b9a86.png)
为了测试登录视图,你可以在终端中使用manage.py createsuperuser命令来创建一个用户。
注意:一旦你登录进去,你将被重定向到/accounts/profile URL。
这是一个Bootstrap 4风格的登录表单截图:
![740f7d9a1598dedb7cfdda13b98f18b1.png](https://img-blog.csdnimg.cn/img_convert/740f7d9a1598dedb7cfdda13b98f18b1.png)
使用 LogoutView注销用户
你可以使用基于LogoutView类的视图来注销应用程序中的用户。在你的accounts.py文件中,添加/logout路径,并将其与一个LogoutView的可调用视图链接:
![b79e7bb5fe2e26a43c823c038610c81b.png](https://img-blog.csdnimg.cn/img_convert/b79e7bb5fe2e26a43c823c038610c81b.png)
再一次,我们使用as_view()方法从LogoutView类返回一个可调用对象。
接下来,你需要使用以下代码创建一个registration/logged_out.html :
![b6e553d16c9e3184cd3653d56e8321c5.png](https://img-blog.csdnimg.cn/img_convert/b6e553d16c9e3184cd3653d56e8321c5.png)
这是注销完成后的视图截图:
![bcbc4645e24d735cb9a2f88dc973c864.png](https://img-blog.csdnimg.cn/img_convert/bcbc4645e24d735cb9a2f88dc973c864.png)
使用 PasswordResetView, PasswordResetDoneView, PasswordResetConfirmView 和 PasswordResetCompleteView重置密码
你可以允许你的用户使用多种视图来重置密码:
- PasswordResetView,
- PasswordResetDoneView,
- PasswordResetConfirmView
- PasswordResetCompleteView
在你的 accounts/urls.py 文件中, 添加以下路径:
![f4adda09b816d81ace4be7e08af69cd8.png](https://img-blog.csdnimg.cn/img_convert/f4adda09b816d81ace4be7e08af69cd8.png)
接下来,你需要使用以下代码来添加一个registration/password_reset_form.html 模板:
![816f014a2fa96868a99921f519a32e8b.png](https://img-blog.csdnimg.cn/img_convert/816f014a2fa96868a99921f519a32e8b.png)
以同样的方式,你需要添加password_reset_confirm.html, password_reset_done.html, password_reset_email.html 和
password_reset_complete.html模板。
这是一个Bootstrap 4风格的密码重置表单截图:
![61eb30c2a76fa9a49cbfa280186e593b.png](https://img-blog.csdnimg.cn/img_convert/61eb30c2a76fa9a49cbfa280186e593b.png)
使用 PasswordChangeView 和 PasswordChangeDoneView更改密码
你可以允许用户通过基于 PasswordChangeView 和 PasswordChangeDoneView 类的视图来更改密码。
在你的accounts/views.py 文件中,添加以下路径:
![51fce84510dda185c138e9d75b91f9b2.png](https://img-blog.csdnimg.cn/img_convert/51fce84510dda185c138e9d75b91f9b2.png)
接着,创建一个 registration/password_change_form.html模板并添加以下代码:
![de9515c267e8eaa80751519b0002acaa.png](https://img-blog.csdnimg.cn/img_convert/de9515c267e8eaa80751519b0002acaa.png)
你还需要添加password_change_done.html模板。
这是一个密码更改表单的截图:
![de9515c267e8eaa80751519b0002acaa.png](https://img-blog.csdnimg.cn/img_convert/de9515c267e8eaa80751519b0002acaa.png)
注册用户
对于注册用户,Django内置的auth应用程序不提供现成的视图函数或基于类的视图,因此你需要提供自己的自定义实现。
导入项目中urls.py中的URLs
你已经在accounts应用程序中添加了用于在web应用程序中实现身份验证的各种url,但是只有将它们添加到项目级别的urls.py文件中才能使用它们。
首先,这是accounts/urls.py文件的完整源码:
![7c62e850571d305ad557bffbe51b54ab.png](https://img-blog.csdnimg.cn/img_convert/7c62e850571d305ad557bffbe51b54ab.png)
接下来,打开项目根目录中的urls.py文件,使用include()函数导入帐户url:
![8220881ba64a2d57455e31d1ed8fcd8e.png](https://img-blog.csdnimg.cn/img_convert/8220881ba64a2d57455e31d1ed8fcd8e.png)
现在,开始启动你的开发服务器。你可以使用/accounts路径下的身份验证URLs:
- http://127.0.0.1:8000/accounts/login/ 用于登录用户
- http://127.0.0.1:8000/accounts/logout/ 用于注销用户
- http://127.0.0.1:8000/accounts/password-change/ 用于更改密码
- http://127.0.0.1:8000/accounts/password-reset/ 用于重置密码
结论
在本教程中,我们了解了如何使用auth应用程序轻松地在Django应用程序中添加登录、注销和密码重置和更改功能,而不需要重新发明轮子。
我们还使用Bootstrap 4和django-crispy-forms来设计用于登录、密码更改和重置的各种表单。