Day22 - 使用者身份验证

今天的实作内容主要根据教学网站进行。

Django提供了身份认证与授权系统,不论是登入、登出、密码管理,都有现成的模组可以使用。

今天将实作如何启用身份认证,并建立登入和登出页面。

启用身份认证

在建立startproject时,身份认证预设已经启用,可於settings.py确认以下配置内容是否正确:

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.contenttypes',
]

MIDDLEWARE = [
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
]

建立使用者帐号和群组

使用管理员介面新增群组和使用者

使用浏览器进入管理员网站,於网站上进行新增群组和使用者。
https://ithelp.ithome.com.tw/upload/images/20211004/2014188640e30n5n07.png

使用程序新增使用者

from django.contrib.auth.models import User

# Create user and save to the database
user = User.objects.create_user('myusername', '[email protected]', 'mypassword')

# Update fields and then save again
user.first_name = 'John'
user.last_name = 'Citizen'
user.groups
user.save()

使用程序将使用者加入群组

from django.contrib.auth.models import Group

mygroup = Group.objects.get(name='mygroupname') 
mygroup.user_set.add(myuser)

建立身份验证页面

URL

在专案资料夹下的urls.py增加以下内容:

urlpatterns += [
    path('accounts/', include('django.contrib.auth.urls')),
]

django.contrib.auth.urls 中包含登入、登出、密码变更等各子项目的url设定。

建立Template 资料夹

  1. 在专案资料夹下新增「templates」资料夹,里面建立子资料夹「registration」,新增「login.html」和「logged_out.html」。
  • login.html

使用user.is_authenticated属性来判断是否已通过身份验证:

  {% if user.is_authenticated %}
    <p>Your account doesn't have access to this page. To proceed,
    please login with an account that has access.</p>
  {% else %}
    <p>Please login to see this page.</p>
  {% endif %}
  • logged_out.html
{% extends "base_generic.html" %}

{% block content %}
  <p>Logged out!</p>
  <a href="{% url 'login'%}">Click here to login again.</a>
{% endblock %}
  1. 於专案资料夹下的settings.py新增templates资料夹路径,使该资料夹在模板加载器的搜寻范围内。
TEMPLATES = [
{
   'DIRS': ['./templates',],
   'APP_DIRS': True,
}

将登入和登出连结加入基础模板

修改「base_generic.html」,加入登入和登出两个页面的连结,并根据user.is_authentication作为判断条件进行显示。

{% if user.is_authenticated %}
<li>User: {{ user.get_username }}</li>
<li><a href="{% url 'logout'%}?next={{request.path}}">Logout</a></li>
{% else %}
<li><a href="{% url 'login'%}?next={{request.path}}">Login</a></li>
{% endif %}

<<:  视觉化当日趋势图(3)-取得python api方法

>>:  [Day19] 逻辑运算子

Day28 Java 注解

●Java 自定义注解 创建自定义注解类似於编写接口,不同之处在於interface关键字以@符号为...

你要的是Entity Framework吗?

很多初学Entity Framework( Core)(以下简称EF)的新手,刚开始使用EF时都会有...

[Day3] ESP32s 开发板介绍

前言 今天要来跟各位介绍ESP32s开发板的一些基本知识,现在如果上Google大神随手一搜「物联网...

登录档的资料格式与.reg档的介绍--各种REG的乱斗

本篇我们要来介绍,登录值的格式、.reg档的意义,不过最後登录档的备份因为篇幅太长我就留到下篇来讲,...

【从实作学习ASP.NET Core】Day24 | 前台 | Session 购物车 (2)

接续昨天的内容,今天要配合 SessionHelper 来完成购物车的主要功能 需要完成购物车的模型...