第9次:身份验证

第7次课中展示了在Admin后台管理系统中创建超级用户、普通用户及权限管理的操作,本次课展示如果在代码中实现同样的功能。
本节的知识点将会在项目的用户注册与登录环节使用。

9.1 准备环境

1、新建项目chapter09

2、新建应用authapp

3、应用authapp下创建模型Book

from django.db import models

class Book(models.Model):
    name = models.CharField(max_length=100, verbose_name='书名')
    price = models.FloatField(verbose_name='价格')

4、注册模型到后台,authapp应用下admin.py

from django.contrib import admin

from authapp.models import Book

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ('name', 'price')

5、生成并执行迁移,创建数据库表

python manage.py makemigrations
python manage.py migrate

9.2 用户权限管理

User类提供了创建普通用户的方法create_user()和创建超级用户的方法create_superuser()

python manage.py shell

创建超级用户

from django.contrib.auth.models import User,Permission,Group
admin = User.objects.create_superuser('admin','admin@qq.com','admin')
admin.save()

创建普通用户

from django.contrib.auth.models import User
sd = User.objects.create_user('sd','sd@qq.com','sd')
sd.save()

默认情况下,通过User类创建的用户默认保存在数据表auth_user中。

修改密码

from django.contrib.auth.models import User
u=User.objects.get(username='admin')
u.set_password('admin')
u.save()

让用户可以登录到后台管理系统

User.objects.filter(username='sd').update(is_staff=True)

从表中取到用户

admin = User.objects.get(username = 'admin')
sd = User.objects.get(username='sd')

权限管理

from django.contrib.auth.models import User,Permission
#分配权限
sd.user_permissions.add(Permission.objects.get(codename = 'add_user'))
sd.user_permissions.add(Permission.objects.get(codename = 'change_user'))
sd.user_permissions.add(Permission.objects.get(codename = 'delete_user'))

sd.user_permissions.add(Permission.objects.get(codename = 'add_book'))
sd.user_permissions.add(Permission.objects.get(codename = 'change_book'))

#一次性增加多个权限
sd.user_permissions.add(Permission.objects.get(codename='add_book'),Permission.objects.get(codename='change_book'),Permission.objects.get(codename='delete_book'))

#通过列表,一次性增加多个权限
sd.user_permissions.set([Permission.objects.get(codename='add_book'),Permission.objects.get(codename='change_book'),Permission.objects.get(codename='delete_book'),Permission.objects.get(codename='view_book')])

#删除权限
sd.user_permissions.remove(Permission.objects.get(codename='add_book'))
sd.user_permissions.remove(Permission.objects.get(codename='change_book'))
#一次性移除多个权限
sd.user_permissions.remove(Permission.objects.get(codename='add_book'),Permission.objects.get(codename='change_book'),Permission.objects.get(codename='delete_book'))

查看用户的全部权限

#此时查到的权限为创建sd对象那一刻,sd对象所拥有的权限;如果通过sd对象更新了权限,想查看更新后的权限,需要重新获取到这个对象
sd.get_user_permissions()
sd.get_all_permissions()
#或者直接这样使用
User.objects.get(username='admin').get_user_permissions()
User.objects.get(username='sd').get_all_permissions()

查看用户的某个权限

has_perm('应用名.权限名_模型名')

super_user = User.objects.get(username='admin')
super_user.has_perm('auth.add_user')
super_user.has_perm('Good.add_Good')

9.3 组权限管理

#创建分组
group = Group.objects.create(name='python')
group.save()

#分配权限,一次性分配多个权限
group.permissions.add(Permission.objects.get(codename='add_book'),Permission.objects.get(codename='delete_book'),Permission.objects.get(codename='change_book'),Permission.objects.get(codename='view_book'))

#清空权限
group.permissions.clear()

#分配权限,一次性分配多个权限,set()
group.permissions.set([Permission.objects.get(codename='add_book'),Permission.objects.get(codename='delete_book'),Permission.objects.get(codename='change_book'),Permission.objects.get(codename='view_book')])

#移除权限,一次性移除多个权限
group.permissions.remove(Permission.objects.get(codename='add_book'),Permission.objects.get(codename='delete_book'))

#用户加入组
sd.groups.add(group)
#分别查看sd权限,可看出两个函数的区别
sd.get_user_permissions()
sd.get_all_permissions()
#用户退出指定组
sd.groups.remove(group)
#用户退出所有组
sd.groups.clear()

9.4 用户登录与退出

authapp/views.py

# 用户登录
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect
from django.urls import reverse
from django.views import View


class LoginView(View):
    '''登录类视图'''

    def get(self, request):
        return render(request, "login.html")

    def post(self, request):
        """Post方式,用户名登录"""
        username = request.POST['username']  # 用户名
        password = request.POST['password']  # 密码
        user = authenticate(username=username, password=password)
        if user is not None:
            login(request, user)  # 用户登录
            return redirect(reverse('auth_app:index'))
        else:
            return render(request, 'login.html', {'account_errmsg': '用户名或密码错误'})



class LogoutView(View):
    """退出登录"""

    def get(self, request):
        logout(request)
        # 重定向到登录页面
        return redirect(reverse('auth_app:login'))


# 首页相关视图函数
class IndexView(View):
    '''进入首页'''

    def get(self, request):
        return render(request, 'index.html')


'''用于保护某个视图函数(函数视图或类视图)只能被已登录的用户访问。
当用户尝试访问该视图函数时,如果用户未登录,
则会被重定向到登录页面,要求其先进行登录操作。'''


@login_required()
def user_center(request):
    return render(request, 'userinfo.html')

在templates文件夹下边新建login.html

<body>
<div style="width:400px;vertical-align:middle;margin: 0 auto;">
    <form method="post" >
        {% csrf_token %}
        <td><label>用户名</label></td>
        <td><input type="text" name="username" placeholder="请输入用户名"></td>
        <br>
        <td><label>密码</label></td>
        <td><input type="password" name="password" placeholder="请输入密码"></td>
        <div style="color:red">{{ account_errmsg }}</div>
        <input type="submit" name="登录" style="height: 30px">
    </form>
</div>
</body>

templates文件夹下新建index.html

<body>
<div class="index">
    {% if user.is_authenticated %}
        欢迎您:{{ user.username }}
        <br>
        <a href="{% url 'auth_app:logout' %}">退出</a>
        <span>|</span>
        <a href="{% url 'auth_app:info' %}">用户中心</a>
    {% else %}
        <a href="{% url 'auth_app:login' %}">登录</a>
    {% endif %}
</div>
</body>

templates文件夹下新建userinfo.html

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户中心</title>
</head>
<body>
<p>用户中心页面</p>
<a href="{% url 'auth_app:logout' %}">退出登录</a>
</body>
</html>

配置根路由和子路由

根路由urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('authapp.urls', namespace='auth_app')),
]

在auth_app应用下新建urls.py文件,子路由auth_app/urls.py代码如下:

from django.urls import path, include

from auth_app import views

app_name = 'auth_app'
urlpatterns = [
    path('login/', views.LoginView.as_view(), name='login'),
    path('info/', views.user_center, name='info'),
    path('index/', views.IndexView.as_view(), name='index'),
    path('logout/', views.LogoutView.as_view(), name='logout')
]

访问服务器,python manage.py runserver
登录,在浏览器中输入 http://127.0.0.1:8000/login/
显示登录成功的首页信息,点击用户中心,进入用户中心界面。

9.5 Cookie

9.5.1 Cookie是什么

Cookie是访问某个网站时保存在用户本地的一小段文本信息。

Cookie的用途有:

  1. 记录用户登录状态,方便用户在下次访问时不必再次输入用户名和密码。

  2. 记录用户偏好设置,如语言和字体大小等。

  3. 跟踪用户行为以用于广告和分析:通过分析cookie中的数据,网站可以更好地了解用户的兴趣和行为,以便提供更好的服务。

  4. 用于购物车:通过管理Cookie,网站可以在用户离开网站时保存他们购物车中的商品列表,便于用户下次继续购买。

  5. 提供个性化内容:通过利用Cookie中的信息,网站可以为每个用户提供相关的个性化内容。

9.5.2 用法

1、创建cookie_app应用,并把应用名添加到setting.py的INASTALLED_APP中。
2、配置路由

并分别在根urls.py和cookie_app/urls.py文件中配置URL。

根urls.py

path('cookie_app/', include('cookie_app.urls')),

cookie_app/urls.py

from django.urls import path, include

from cookie_app import views

urlpatterns = [
    path('set_cookie/', views.set_cookie),
    path('show_cookie/', views.show_cookie),
    path('delete_cookie/',views.delete_cookie)
]

cookie_app/views.py

from django.http import HttpResponse

def set_cookie(request):
    """设置cookie"""
    response = HttpResponse('设置cookie')
    response.set_cookie('python', 'chapter08', max_age=600)
    return response


def show_cookie(request):
    cookie = request.COOKIES.get('python')
    return HttpResponse(f'cookie的值是:{cookie}')


def delete_cookie(request):
    response = HttpResponse('删除cookie')
    response.delete_cookie('python')
    return response

在浏览器地址栏中输入“http://127.0.0.1:8000/cookie_app/set_cookie/”,此时Cookie已经设置完成,点击浏览器中的“查看网站信息”图标可以打开正在使用的Cookie信息,查看已设置的Cookie。

最后,在浏览器地址栏中输入“http://127.0.0.1:8000/cookie_app/show_cookie/”,此时页面响应Cookie的值。

最后,在浏览器地址栏中输入“http://127.0.0.1:8000/cookie_app/delete_cookie/”,此时通过查看网站信息查看Cookie是否删除。

9.6 Session

9.6.1 Session是什么

Session是一种存储在服务器端的用于记录用户信息的机制。

HTTP是一种无状态协议,每个请求都是独立的,服务器不知道两个请求是否来自同一个客户端。为了解决这个问题,Session被引入。Session可以存储在服务器端的内存、硬盘、数据库等不同的位置,用户在访问网站时,服务器会为每个访问用户创建一个Session ID,用于标识该用户的Session对象,Session ID会被存储在客户端的Cookie中,并在每个HTTP请求中传递回服务器。

Session的主要用途是记录用户信息,例如用户的登录信息、购物车内容、浏览历史、个人设置等。通过session,程序可以识别不同的用户,并为每个用户提供个性化的服务。Session还可以用于跨页面传递数据,例如将用户输入数据传递到下一个页面。Session也可以用于实现网站的安全机制,例如记录用户最后一次操作时间,强制用户在一定时间内重新登录,防止非法访问。

9.6.2 Session的用法

1、创建session_app应用,并把应用名添加到setting.py的INASTALLED_APP中。
2、创建视图

session_app/views.py

from django.http import HttpResponse

# Create your views here.
def set_session(request):
    """设置session的name和value,和"""
    request.session['python'] = 'chapter08'
    request.session.set_expiry(10)  # 设置过期时间,秒
    return HttpResponse('写入session')


# 获取session
def get_session(request):
    value = request.session.get('python')
    return HttpResponse(f"Python对应的 value值为:{value}")

根路由

path('session_app/', include('session_app.urls'))

session_app/urls.py

from django.urls import path

from session_app import views

urlpatterns = [
    path('set_session/', views.set_session),
    path('get_session/', views.get_session),
]
python manage.py runserver

在浏览器地址栏中输入http://127.0.0.1:8000/session_app/set_session/并按下回车键,此时Session已写入完成。可在数据库中查询到

在浏览器地址中输入“http://127.0.0.1:8000/session_app/get_session/”,可看到Session中key值为“Python”所对应的value值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值