django框架——csrf相关装饰器、基于中间件思想编写项目、auth认证模块

系列文章目录

第一章 django安装与介绍

第二章 django基础使用

第三章 路由层

第四章 虚拟环境、django版本区别、视图层

第五章 模板层

第六章 模型层(上)

第七章 模型层(下)

第八章 ajax

第九章 sweetalert前端插件、序列化组件、批量数据操作、分页器、Forms组件(上)

第十章 forms组件(下)、ModelForm简单使用、cookie与session简单使用

第十一章 django操作cookie补充、django操作session、CBV添加装饰器的三种方式、django中间件常见方法、csrf



一、csrf相关装饰器

csrf中间件是django用于网站防伪的,在配置文件中配置完毕后,只要是有提交数据的操作都要经过csrf组件的防伪验证

当我们在项目中有的位置不需要防伪验证时需要使用csrf的装饰器为对应的功能关闭csrf验证

from django.views.decorators.csrf import csrf_exempt,csrf_protect
csrf_exempt # 忽略csrf校验
csrf_protect # 开启csrf校验

1.针对FBV

@csrf_protect\@csrf_exempt
def login(request):
    return render(request,'login.html')

2.针对CBV

csrf_protect 三种CBV添加装饰器的方式都可以

 class Index(views.View):
     @method_decorator(csrf_protect)
     def get(self, request):
         # username = request.get_signed_cookie('username', salt='加盐')
         username = request.session.get('username')
         return render(request, 'index.html', locals())

 @method_decorator(csrf_protect, name='get')
 class Index(views.View):

     def get(self, request):
         # username = request.get_signed_cookie('username', salt='加盐')
         username = request.session.get('username')
         return render(request, 'index.html', locals())

class Index(views.View):

    @method_decorator(csrf_protect)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

    def get(self, request):
        # username = request.get_signed_cookie('username', salt='加盐')
        username = request.session.get('username')
        return render(request, 'index.html', locals())

csrf_exempt 只有一种方式可以生效(给重写的dispatch方法装)

class Index(views.View):

    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

    def get(self, request):
        # username = request.get_signed_cookie('username', salt='加盐')
        username = request.session.get('username')
        return render(request, 'index.html', locals())

二、基于中间件思想编写项目

为什么要使用中间件的形式来导入模块

项目开发完毕后会在服务器上启动之后没有意外是不会停止的,这种是时候当我们需要修改项目功能(新增、修改、删除、不使用等),这个时候就需要去修改核心的业务逻辑层代码。但随意修改业务逻辑层往往伴随很多问题(需要修改的代码正在使用、修改部分为核心代码必选先停止服务器等),针对这些问题,往往修改一次需要付出很高的代价,这个时候以中间件和配置文件的形式来使功能模块化,可随意修改删除将节省很高的成本

1.对django配置文件的理解

通过学习django7个中间件,我们知道在MIDDLEWARE中配置的不单单是一个字符串而是相当于导入模块的操作

2.如何实现django配置文件导入模块

importlib模块
该模块能够将字符串转化为对应的py文件路径,然后获取py文件(注:不能导入py文件中的类)

python反射
使用反射获取对象中的类、方法、变量

通过以上俩种代码可以完成将字符串路径所对应的py中的类、方法、变量转变为

1.创建一个my_mid包
创建func1.py、func2.py、func3.py
在这里插入图片描述
2.为三个py文件设置功能函数
func1.py

class Show1(object):
    def __init__(self, msg):
        self.msg =msg

    def show_p(self):
        print(f'你启用了func1组件的show_p功能,你传入了一个参数:%s'% self.msg)

    def show_p1(self):
        print(f'你启用了func1组件的show_p1功能,你传入了一个参数:{self.msg}')

func2.py

class Show2(object):
    def __init__(self, msg):
        self.msg = msg

    def show_p(self):
        print(f'你启用了func2组件的show_p功能,你传入了一个参数:%s'%self.msg)

    def show_p1(self):
        print(f'你启用了func2组件的show_p1功能,你传入了一个参数:{self.msg}')

func3.py

class Show3(object):
    def __init__(self, msg):
        self.msg = msg

    def show_p(self):
        print(f'你启用了func3组件的show_p功能,你传入了一个参数:%s'%self.msg)

    def show_p1(self):
        print(f'你启用了func3组件的show_p1功能,你传入了一个参数:{self.msg}')

3.编写获取配置文件并转化为对象调用功能

    def run_way():
        # 1.获取配置文件中的路径
        from djangoceshi1 import settings
        # 2.对获取的路径进行处理
        total_mid = []
        # 3.将配置文件中的路径分开处理
        for MY_MID in settings.MY_MIDS:
            py_name, class_name = MY_MID.rsplit('.', maxsplit=1)
            # 4. 获取py文件后获取class对象
            import importlib
            py_obj = importlib.import_module(py_name)
            class_obj = getattr(py_obj, class_name)
            total_mid.append(class_obj)
        # 5.使用封装好的total_mid 可以不封装直接在for中调用
        for mid in total_mid:
            obj = mid('参数')
            obj.show_p()
            obj.show_p1()

完成以上步骤只需要触发即可
eg:

#随意在任意地方调用
run_way()

在这里插入图片描述
运行结果:
在这里插入图片描述

在这里插入图片描述
运行结果:
在这里插入图片描述


三、auth认证模块

auth是django提供给的快速完成用户相关功能的模块:
用户相关功能:创建、认证、编辑…

auth模块django也配套提供了一张用户表
执行数据库迁移命令之后默认产生的auth_user

django自带的admin后台管理用户登录参考的就是auth_user表
创建admin后台管理员用户:

python manage.py createsuperuser

auth_user表结构
在这里插入图片描述

使用auth模块需要先导入

from django.contrib import auth

1.authenticate()

提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。

如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。

authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。

user = auth.authenticate(username='username',password='password')

2.login()

该函数接受一个HttpRequest对象,以及一个经过认证的User对象。

该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据(一般情况储存在django_session中)。

def login(request):
	user = auth.authenticate(username='username',password='password')
	login(request, user)

3.user

对request使用.user可以获取当前请求中的user对象

def login(request):
	user = request.user
	

4.is_authenticated()

用来判断当前请求是否通过了认证(是否已存在session)。(实质上就是查看session)

request.user.is_authenticated()

5.校验登录装饰器

auth 给我们提供的一个装饰器工具,用来快捷的给某个视图添加登录校验。

from django.contrib.auth.decorators import login_required
	@login_required(login_url='/lg/')  # 局部配置
	@login_required  # 全局配置
	LOGIN_URL = '/lg/'  # 需要在配置文件中添加配置

若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ’ 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。

如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。

from django.contrib.auth.decorators import login_required
# 1.局部配置
	@login_required(login_url='/lg/')  # 局部配置 只对此处有效
# 2.全局配置
	@login_required  # 全局配置,之后使用该装饰器都会生效
	
	LOGIN_URL = '/lg/'  # 需要在配置文件中添加配置

6.密码

1.check_password()

auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。

密码正确返回True,否则返回False。

request.user.check_password('密码') 

2.set_password()

auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。

注意:设置完一定要调用用户对象的save方法

  request.user.set_password('新密码')
  request.user.save()

7.logout(request)

该函数接受一个HttpRequest对象,无返回值。

当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

auth.logout(request)

8.注册用户

auth为我们提供了俩种用户的创建
create_superuser为超级用户,该方法需要提供用户名、密码、邮箱等
create_suser为普通用户,该方法需要提供用户名、密码等

from django.contrib.auth.models import User
  User.objects.create_superuser(username='用户名1', password='密码1', email='asd@qq.com')
  User.objects.create_suser(username='用户名2', password='密码2')

9.拓展auth_user表

方法1

直接使用一对一关系让别的表关联auth_user表
这样可以变相的增加auth_user表的字段

方法2

当我们设计用户表时想要拥有更多字段并且可以使用django提供的登录、注册等功能。这个时候继承auth_user表,这样可以拓展字段还能继续使用django提供的便捷功能。

from django.contrib.auth.models import AbstractUser
class Users(AbstractUser):
    # 编写AbstractUser类中没有的字段 不能是AbstractUser已拥有的字段
    phone = models.BigIntegerField()
    addr = models.CharField(max_length=32)

编写完毕需要去配置文件中设置

AUTH_USER_MODEL = 'app01.Users'

此时迁移表就能完成拥有auth_user功能和字段的新用户表
注意:
1.迁移操作是否已有记录,有就将其删除
2.迁移操作是否已生成表,是最好删除所有表(可以只删除auth前缀的表)

练手项目:
bbs论坛

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django AuthDjango框架中的一个内置应用程序,用于处理用户认证和授权。它提供了一套用于处理用户登录、注册、密码重置等操作的视图和模板。 下面是一个简单的Django Auth教程,演示如何在Django应用程序中使用Auth应用程序。 1. 创建Django项目 首先,创建一个新的Django项目: ``` $ django-admin startproject myproject ``` 2. 创建Django应用程序 在Django项目中创建一个新的应用程序: ``` $ python manage.py startapp myapp ``` 3. 配置Django AuthDjango项目中配置Django Auth。在myproject/settings.py文件中添加以下内容: ``` INSTALLED_APPS = [ # ... 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # ... ] MIDDLEWARE = [ # ... 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', # ... ] AUTHENTICATION_BACKENDS = [ 'django.contrib.auth.backends.ModelBackend', ] ``` 这将启用Django Auth,并为用户身份验证和授权设置所需的中间件和后端。 4. 创建用户模型 在myapp/models.py文件中创建一个新的用户模型: ``` from django.contrib.auth.models import AbstractUser class User(AbstractUser): pass ``` 这将创建一个自定义用户模型,它继承自Django的AbstractUser类。 5. 迁移数据库 现在,运行以下命令来创建数据库表: ``` $ python manage.py makemigrations $ python manage.py migrate ``` 6. 创建用户视图 在myapp/views.py文件中创建一个新的用户视图: ``` from django.shortcuts import render, redirect from django.contrib.auth.forms import UserCreationForm from django.contrib.auth import login, authenticate def register(request): if request.method == 'POST': form = UserCreationForm(request.POST) if form.is_valid(): user = form.save() login(request, user) return redirect('home') else: form = UserCreationForm() return render(request, 'registration/register.html', {'form': form}) def home(request): return render(request, 'home.html') ``` 这将创建两个视图:一个用于用户注册,另一个用于主页。 7. 创建用户模板 在myapp/templates/registration目录中创建一个名为register.html的新模板: ``` {% extends 'base.html' %} {% block content %} <h2>Register</h2> <form method="POST"> {% csrf_token %} {{ form.as_p }} <button type="submit">Register</button> </form> {% endblock %} ``` 这将创建一个简单的用户注册表单。 8. 创建主页模板 在myapp/templates目录中创建一个名为home.html的新模板: ``` {% extends 'base.html' %} {% block content %} <h2>Welcome!</h2> {% endblock %} ``` 这将创建一个简单的主页。 9. 配置URL模式 在myapp/urls.py文件中配置URL模式: ``` from django.urls import path from . import views urlpatterns = [ path('register/', views.register, name='register'), path('', views.home, name='home'), ] ``` 这将为用户注册和主页视图添加URL模式。 10. 运行Django应用程序 最后,运行以下命令来启动Django开发服务器: ``` $ python manage.py runserver ``` 然后在Web浏览器中访问http://localhost:8000/register以注册新用户,或访问http://localhost:8000/以查看主页。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值