首页 > 编程语言 >Python基础day64 auth模块

Python基础day64 auth模块

时间:2023-08-14 15:44:19浏览次数:50  
标签:username Python request auth day64 csrf password user

csrf跨站请求的相关装饰器

# Django中有一个中间件对csrf跨站做了验证,我只要把csrf的这个中间件打开,意味着所有的方法都要被验证
在所有的视图函数中:
只有几个视图函数做验证
只有几个函数不做验证

# csrf_protect: 哪个视图函数加了这个装饰器,这个函数就会做验证
# csrf_exempt:哪个视图函数加了这个装饰器,这个函数就不会做验证

from django.views.decorators.csrf import csrf_exempt,csrf_protect
# @csrf_protect
@csrf_exempt
def index(request):
    return render(request, 'index.html')

# @csrf_protect
def func(request):
    return render(request, 'func.html')


"""
CBV针对于csrf_exempt:只有第三张方式才生效,其余两种方式不行
CBV针对于csrf_protect:三种方式都可以
"""
# @method_decorator(csrf_exempt,name='post') # 第二种方式也不行
# @method_decorator(csrf_protect,name='post') # 第二种方式也行
class Login(View):
    # @method_decorator(csrf_exempt)  # 第三张方式可以
    @method_decorator(csrf_protect)  # 第三张方式可以
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)
    # 不让post方法做验证
    # @method_decorator(csrf_exempt)  # 第一种方式不行
    # @method_decorator(csrf_protect)  # 第一种方式行
    def post(self, request):
        print("post")
        return HttpResponse("post")

Auth模块的使用

Auth模块是什么?

  Auth模块是Django自带的用户认证模块:

我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。

Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统–auth,它默认使用 auth_user 表来存储用户数据。

在执行数据库迁移命令的时候,会自动生成一个默认的表,其中有auth_开头的很多表
auth_user表的作用:djagno自带的后台管理系统所依赖的数据就在这张表中
默认情况下,auth_user表是空表,没有用户名和密码,因此我们需要自己创建用户数据
需要创建一个超级管理员账号才能登录

# 添加超级管理员命令
python38 manage.py createsuperuser

Auth模块的相关方法

# 登录功能、注册功能、修改密码、退出系统、认证功能等学习如何使用
# 登录功能
user_obj = auth.authenticate(request, username=username, password=password)
print(user_obj)  # 查询不出来,返回None
print(user_obj)  # jerry 登录成功之后的用户对象
print(user_obj.username)  # 拿到对象的具体内容
print(user_obj.password)  # 拿到对象的具体内容
'''注意事项:传递参数的时候,用户名和密码必须同事传入
要么全部使用Auth模块的方法,要么全部自己写,不能混合使用
'''
if auth.ogj:
    auth.login(request, user_obj) # 保存用户信息相当于request.session['username'] = user_obj.usernane
'''写了auth.login,就可以在全局任何有request对象的地方通过request.user拿到用户的对象
    return redirect('/page/')


# auth自带的认证登录装饰器
# @login_required # 默认跳转http://127.0.0.1:8000/accounts/login/?next=/order/

@login_required(login_url='/order/login/')  # 局部设置,指定跳转
def order(request):
    # 验证用户是否登录
    print(request.user.is_authenticated)  # True/False
    return HttpResponse('reder')

###################配置文件中全局配置

LOGIN_URL = '/login/' # 全局配置
'''
    当局部和全局都存在的时候,按局部的
    如果局部没有,按照全局的
'''

Auth模块之退出系统

def logout(request):
    # 清除cookie或者session
    auth.logout(request)
    return redirect('/home/')

Auth模块之修改密码功能

# 验证老密码是否正确
is_right = request.user.check_password(old_password)

# 修改密码
request.user.set_password(new_password) # 这种写法没有真正的操作数据库
request.user.save()  # 操作数据库的

Auth模块之注册功能

from django.contrib.auth.models import User
# 入库
# User.objects.create(username=username, password=password)
# User.objects.create_user(username=username, password=password)
User.objects.create_superuser(username=username, password=password,email='[email protected]')

扩展默认的auth_user表

# 默认情况下使用的就是auth_user的默认字段
# 扩展我们自己的字段

# 前提是:所有的模型类都继承
from django.contrib.auth.models import AbstractUser

# 不要继承了models.Model
扩展之后需要在配置文件中加一句话

"""""在扩展表之前数据库不能够迁移,扩展这个表需要在迁移数据库之前做"""""
# 如果你迁移了,还想扩展怎么办?
1. 换库
2. 需要删除很多个应用的migrations文件夹

python manage.py migrate myapp --fake

"""
    扩展表之后发生的变化:
        1. 原来的auth_user表不存在了,换成你自己新建的表名了
        2. 原来的auth_user表中的字段还都在,然后多了自己扩展的字段
        3. 继承的类要发生改变AbstractUser
        4. 在配置文件中加入下面一句话:
            AUTH_USER_MODEL = 'app01.UserInfo'
            AUTH_USER_MODEL = '应用名.类名'
        5. 扩展之后还是按照原来的auth_user表使用
        6. auth模块中的数据还是你扩展的表
        7. 扩展之前别迁移.
"""

 

标签:username,Python,request,auth,day64,csrf,password,user
From: https://www.cnblogs.com/zfq132/p/17628819.html

相关文章

  • ​Python爬虫IP代理池的建立和使用
    写在前面建立Python爬虫IP代理池可以提高爬虫的稳定性和效率,可以有效避免IP被封锁或限制访问等问题。下面是建立Python爬虫IP代理池的详细步骤和代码实现:1.获取代理IP我们可以从一些代理IP网站上获取免费或付费的代理IP,或者自己租用代理IP服务。这里我们以站大爷代理为例,获取......
  • 8.0 Python 使用进程与线程
    python进程与线程是并发编程的两种常见方式。进程是操作系统中的一个基本概念,表示程序在操作系统中的一次执行过程,拥有独立的地址空间、资源、优先级等属性。线程是进程中的一条执行路径,可以看做是轻量级的进程,与同一个进程中的其他线程共享相同的地址空间和资源。线程和进程都......
  • 6.0 Python 使用函数装饰器
    装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为"装饰器"(Decorator),装饰器的功能非常强大,装饰器一般接受一个函数对象作为参数,以对其进行增强,相当于C++中的构造函数,与析构函数。装饰器本质上是一个python函数,它可以让其他函数......
  • 7.0 Python 面向对象编程
    python是一种面向对象的编程语言,面向对象编程(Object-OrientedProgramming,OOP)是一种编程思想,其核心概念是“对象”。对象是指一个具有特定属性和行为的实体,而面向对象编程就是通过对这些实体进行抽象、分类、封装和继承等操作,来实现程序的结构和逻辑。在python中,我们可以通过定义类......
  • 9.0 Python 内置模块应用
    Python是一种高级、面向对象、通用的编程语言,由GuidovanRossum发明,于1991年首次发布。Python的设计哲学强调代码的可读性和简洁性,同时也非常适合于大型项目的开发。Python语言被广泛用于Web开发、科学计算、人工智能、自动化测试、游戏开发等各个领域,并且拥有丰富的第三方库......
  • 8.0 Python 使用进程与线程
    python进程与线程是并发编程的两种常见方式。进程是操作系统中的一个基本概念,表示程序在操作系统中的一次执行过程,拥有独立的地址空间、资源、优先级等属性。线程是进程中的一条执行路径,可以看做是轻量级的进程,与同一个进程中的其他线程共享相同的地址空间和资源。线程和进程都可......
  • 6.0 Python 使用函数装饰器
    装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为"装饰器"(Decorator),装饰器的功能非常强大,装饰器一般接受一个函数对象作为参数,以对其进行增强,相当于C++中的构造函数,与析构函数。装饰器本质上是一个python函数,它可以让其他函......
  • Python基础day65 BBS个人博客项目完整搭建
    BBS-个人博客项目的完整搭建项目开发流程一、项目分类现在互联网公司需要开发的主流web项目一般分为两类:面向互联网用户,和公司内部管理。面向互联网用户:C(consumer)端项目公司内部管理:B(business)端项目还有一类web应用,基本采用基于角色的权限控制,不同的员工在这套系统......
  • 软件测试|Python科学计算神器numpy教程(五)
    NumPy的高级索引功能前言NumPy是Python中最受欢迎的科学计算库之一,它提供了丰富的功能来处理和操作数组数据。在本文中,我们将深入了解NumPy的高级索引功能,这些功能允许我们根据特定条件或索引数组来访问和修改数组的元素,为数据科学和数组操作提供了更大的灵活性和控制力。NumP......
  • 软件测试|Python科学计算神器numpy教程(六)
    NumPy的广播机制前言NumPy是Python中最受欢迎的科学计算库之一,它提供了高性能的多维数组对象和丰富的数组操作功能。其中,广播机制是NumPy的重要特性之一,它允许不同形状的数组进行算术运算,提供了灵活而高效的数组操作能力。在本文中,我们将深入探讨NumPy的广播机制,以便更好地理解......