geekdoc-python-zh/docs/askpython/django-user-authentication.md

11 KiB
Raw Permalink Blame History

Django 用户认证——允许使用 Django 注册和登录

原文:https://www.askpython.com/django/django-user-authentication

在本文中,我们将学习 Django 用户认证以及相关的所有基础知识。但在此之前,让我们了解一下网站。

静态与动态网站

让我们快速看一下静态和动态网站的区别。

静态网站 动态网站
静态网站向用户显示固定信息 动态网站可以根据浏览者显示不同的信息
没有客户端-服务器交互 用户和服务器之间的大量数据交换
如果您不需要频繁更新数据,则更快、更便宜且易于维护 当我们需要用户与网站互动时,这是很重要的。使用正确的 CMS动态网站可以快速且容易地维护
通过呈现 HTML、JS 和 CSS 文件直接显示服务器上的内容。 基于数据库上为用户存储的可用内容显示前端

用户认证

现在几乎所有的网站都有用户认证程序,你可以手动或者通过谷歌/脸书账号创建一个账号。典型的用户验证页面如下所示:

Facebook User Authentication Page

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

Books Website

现在,如果您没有帐户,请单击下面的链接,您将看到注册网页。

Sign Up

Sign Up

填写详细信息,然后点击回车键,您将被重定向回该书的网页。现在您已经通过了身份验证,将会显示图书列表。

Books Webpage

Books Webpage

完成后,您可以按“注销”,您将再次被重定向到登录网页。

瞧啊。!您现在有了自己的用户认证系统!!

结论

就这样,伙计们!!这都是关于用户认证以及如何实现它。我希望这篇文章能帮助您获得关于用户认证的知识。

下一篇文章再见!!在那之前继续练习!!