11 KiB
Django 用户认证——允许使用 Django 注册和登录
原文:https://www.askpython.com/django/django-user-authentication
在本文中,我们将学习 Django 用户认证以及相关的所有基础知识。但在此之前,让我们了解一下网站。
静态与动态网站
让我们快速看一下静态和动态网站的区别。
| 静态网站 | 动态网站 |
|---|---|
| 静态网站向用户显示固定信息 | 动态网站可以根据浏览者显示不同的信息 |
| 没有客户端-服务器交互 | 用户和服务器之间的大量数据交换 |
| 如果您不需要频繁更新数据,则更快、更便宜且易于维护 | 当我们需要用户与网站互动时,这是很重要的。使用正确的 CMS,动态网站可以快速且容易地维护 |
| 通过呈现 HTML、JS 和 CSS 文件直接显示服务器上的内容。 | 基于数据库上为用户存储的可用内容显示前端 |
用户认证
现在几乎所有的网站都有用户认证程序,你可以手动或者通过谷歌/脸书账号创建一个账号。典型的用户验证页面如下所示:
Facebook User Authentication Page
用户身份验证是一个重要的过程,因为它保护所有用户内容的安全,只有特定用户才能访问这些内容。在 Django 中,这是使用 django.contrib.auth 库完成的。
此外,根据可能的角色和权限,有不同类型的用户。
用户类型
尽管用户可以分为许多类别和类型,但是有两种主要的用户角色。对网站有编辑权限的用户和没有编辑权限的用户。
超级用户
你在管理站点的文章中遇到过超级用户。超级用户是项目的最高管理者,可以访问管理站点的所有内容。
他还可以删除其他普通用户。
普通用户
访问网站的人可以创建这种类型的用户帐户。例如,所有脸书和谷歌账户都属于这一类用户。
他们的权限会根据他们所扮演的角色类型而有所不同。超级用户/管理员决定分配给每个用户的权限。例如,在教室应用程序中,学生将拥有不同的权限,而教师将拥有其他附加权限。
使用 Django.contrib.auth 库进行认证
Django framework 有一个完整的身份验证库,称为 django.contrib.auth 库,内置来提供身份验证框架。
因此在本文中,我们使用内置的**。auth** 库本身。我们现在将研究该库提供的基本属性:
1)认证
基本语法是:
user = authenticate(request=None , credentials)
对于注册和登录 视图,authenticate 属性在语法上略有不同。在注册视图中,它只将请求凭证作为参数。
user = authenticate(username = "<username>", password = "<pasword>")
注意:用户名和密码是从请求本身获取的凭证。
- 在登录视图中,它需要一个请求凭证(用户名、密码),以及存储的用户名和密码。
user = authenticate(request, username="<stored_username>",password ="<stored_password>")
这里,包含在**“请求”中的请求凭证与存储在数据库中的用户名和密码**凭证相匹配。只有当 crendentials 匹配时,用户才通过身份验证。
2)登录(请求,用户 _ 信息)
登录功能用于用户登录网站。语法:
login(request,user)
用户在哪里:
user = authenticate(username,password)
3) 注销(请求)
注销属性只是注销当前登录的用户。语法:
logout(request)
4) 认证表单
AuthenticatioForm 是预构建的表单,存在于 **django.contrib.auth.forms 中。**该表单显示在 web 应用程序的 django 登录页面上。显示的字段有:
- 用户名
- 密码
5) 创建认证表单
django.contrib.auth.forms 中的预构建表单显示在 django 注册页面上。表格中显示的字段有:
- 用户名
- 密码 1
- 密码 2 (密码确认字段)
现在我们知道了 auth 库包含什么,让我们深入到编码部分!!
Django 用户认证实践
好吧!!阅读部分到此为止,现在让我们把手弄脏吧。
一旦用户正确登录,我们应该有东西显示!!因此,让我们创建一个简单的视图和模板
1)样本视图代码
将简单的 BookView 代码添加到 views.py 文件中
from django.shortcuts import render
def books(request):
if request.user.is_authenticated:
return render(request, 'itemsapp/books.html')
else:
return redirect('/books/signin')
2)样本模板代码
我们将创建一个示例图书模板来显示图书列表:
<h> Welcome to the Book Website</h>
<h2>List of Books</h2>
<ul><h3> The Prodigal Daughter</h3></ul><br>
<ul><h3> Deception Point</h3></ul><br>
<ul><h3> Washington Times</h3></ul><br>
<ul><h3> Sherlock Holmes</h3></ul><br>
<ul><h3> The Cooper Intrigue</h3></ul><br>
<a href = "{% url 'logout' %}">Logout here</a>
3) 创建注册视图
在 Views.py 中,添加注册视图代码:
from django.contrib.auth import authenticate,login
from django.contrib.auth.forms import UserCreationForm
def signup(request):
if request.user.is_authenticated:
return redirect('/books')
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data['username']
password = form.cleaned_data['password1']
user = authenticate(username = username,password = password)
login(request, user)
return redirect('/books')
else:
return render(request,'itemsapp/signup.html',{'form':form})
else:
form = UserCreationForm()
return render(request,'itemsapp/signup.html',{'form':form})
网页的注册模板将为:
<form method ='post'>
{% csrf_token %}
{{form.as_p}}
<input type="submit" value = "Submit">
</form>
<h3>Already Have an Account??</h3>
<a href = "{% url 'login' %}">Sign In Here</a>
4) 创建签到视图
现在在注册视图下面,将下面的登录视图添加到您的 views.py 中
from django.contrib.auth import authenticate,login
from django.contrib.auth.forms import AuthenticationForm
def signin(request):
if request.user.is_authenticated:
return redirect('/books')
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username =username, password = password)
if user is not None:
login(request,user)
return redirect('/books')
else:
form = AuthenticationForm()
return render(request,'itemsapp/signin.html',{'form':form})
else:
form = AuthenticationForm()
return render(request, 'itemsapp/signin.html', {'form':form})
网页的登录模板将是:
<form method = 'post'>
{% csrf_token %}
{{form.as_p}}
<input type = "submit" value = "Submit">
</form>
<h3>Dont have an account??</h3><br>
<a href = "{% url 'signup' %}">SignUp Here</a>
5) 创建注销视图
最后,我们将把注销视图代码添加到视图. py 文件中:
from django.contrib.auth import logout
def signout(request):
logout(request)
return redirect('/books/signin/')
6)将 URL 映射到视图
上一节中编码的视图的 URL 路径将是:
path('books/signup/', signup, name ='signup'),
path('books/signin/', signin, name = 'login'),
path('books/signout/', signout, name = 'logout'),
代码的实现
现在我们已经看到了代码的每一个单独的部分,这里是 views.py 文件的最终代码。
from django.shortcuts import render,redirect
from django.contrib.auth import authenticate,login,logout
from django.contrib.auth.forms import AuthenticationForm,UserCreationForm
def signup(request):
if request.user.is_authenticated:
return redirect('/books')
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data['username']
password = form.cleaned_data['password1']
user = authenticate(username = username,password = password)
login(request, user)
return redirect('/books')
else:
return render(request,'itemsapp/signup.html',{'form':form})
else:
form = UserCreationForm()
return render(request,'itemsapp/signup.html',{'form':form})
def signin(request):
if request.user.is_authenticated:
return redirect('/books')
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username =username, password = password)
if user is not None:
login(request,user)
return redirect('/books')
else:
form = AuthenticationForm()
return render(request,'itemsapp/signin.html',{'form':form})
else:
form = AuthenticationForm()
return render(request, 'itemsapp/signin.html', {'form':form})
def signout(request):
logout(request)
return redirect('/books/signin/')
而 urls.py 的最终代码将是:
from django.contrib import admin
from django.urls import path,include
from .views import signup,signin,signout,books
urlpatterns = [
path('books/', books),
path('books/signup/', signup, name ='signup'),
path('books/signin/', signin, name = 'login'),
path('books/signout/', signout, name = 'logout'),
]
就是这样!!现在启动服务器,进入 "/books"
当你转到端点“books/”时,如果你没有被认证,它将首先把你重定向到登录网页。
Books Website
现在,如果您没有帐户,请单击下面的链接,您将看到注册网页。
Sign Up
填写详细信息,然后点击回车键,您将被重定向回该书的网页。现在您已经通过了身份验证,将会显示图书列表。
Books Webpage
完成后,您可以按“注销”,您将再次被重定向到登录网页。
瞧啊。!您现在有了自己的用户认证系统!!
结论
就这样,伙计们!!这都是关于用户认证以及如何实现它。我希望这篇文章能帮助您获得关于用户认证的知识。
下一篇文章再见!!在那之前继续练习!!



