Django之csrf与auth模块操作

本文探讨了CSRF的概念、Django中如何通过中间件与表单处理CSRF校验,以及使用Ajax时的验证方法。还介绍了auth模块在用户认证中的角色,包括用户创建、验证和登录装饰器的使用。最后,详解了不同情况下如何在视图中应用csrf_protect和csrf_exempt,以及auth_user表的扩展和切换。
摘要由CSDN通过智能技术生成

csrf简介与策略

        为了避免钓鱼网站的漏洞,csrf要求发送请求的时候服务端响应时会分配一个随机字符串给客户端,当客户端第二次发送请求的时候携带上一次分配到的随机字符串到服务端进行校验

1.CSRF中间件

        django中间件作用于整个项目,CSRF校验就是django中间件的其中之一对全局的所以视图函数或视图类起作用如果将其注释的话则就是所有的都不校验

2.form表单请求

        form请求的CSRF校验只需加一个模版语法即可通过校验,也是最简单的一种使用方法语法格式如下:

<form action="" method"post">
    {% csrf_token %} <!-- 模版语法-->
</form>

3.Ajax请求

        Ajax请求也需要用CSRF来校验,方式有多种

方式一:

<!--方式1-->
{% csrf_token %}
<button id="d1">Ajax请求</button>
<script>
    $('#d1').click(function () {
        $.ajax({
            url:'',
            type:'post',
            // 先编写csrf模版语法 在利用标签查找和值获取
            data:{'username':'haha','csrfmiddlewaretoken':$('[name="csrfmifflewaretoken"]').val()},
            success:function (args){

            }
        }
            
    }

方式二:

<!--方式2-->
<button id="d1">Ajax请求</button>
<script>
    $('#d1').click(function () {
        $.ajax({
            url:'',
            type:'post',
            // 直接利用模版语法即可 引号不能省
            data:{'username':'haha','csrfmiddlewaretoken':'{{csrf_token }}'},
            success:function (args){

            }
        }
            
    }

方式三:

        方式三是一种通用的方法需要编写js,先创建静态文件夹(在django配置文件中配置一下静态文件路径)再创建js文件,js代码无需我们自己编写官方就已经提供了

<!--在网页中引入编写好的js文件-->
<script scr="/static/csrf.js"></script>
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
var csrftoken = getCookie('csrftoken');

function csrfSafeMethod(method) {
  // these HTTP methods do not require CSRF protection
  return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

$.ajaxSetup({
  beforeSend: function (xhr, settings) {
    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
      xhr.setRequestHeader("X-CSRFToken", csrftoken);
    }
  }
});

CBV添加装饰器方法

        有时候我们需要针对性的对几个请求需要校验几个不需要,如果靠通过注释中间件的话会导致其所有的统一不校验或者统一全部校验,在FBV与CBV中具体的方式有所不同

1.针对FBV中的校验

\bullet  csrf_protect:校验csrf

\bullet  csrf_exempt:不校验csrf

# 第一步需要先导包
from django.view.decorators.csrf import ccsrf_protect,csrf_exempt

# 用法很简单针对是否需要校验在函数上面加上装饰器即可
# 如果注释了CSRF中间件又想校验下面函数需要加装饰器
@csrf_protect
def login(request):
    return HttpResponse('登陆')


# 如果没有注释CSRF中间件又不想校验下面函数需要加装饰器
@csrf_exempt
def login(request):
    return HttpResponse('登陆')

2.针对CBV中的校验

        针对CBV我们不能直接在类上面直接加装饰器 需要借助专门给CBV添加装饰器的方法同时也有好几种不同的方法:

方式一:

        通过给CBV添加装饰器的方法直接在方法上指名道姓的添加,这种方式只能用于添加csrf_protect对csrf_exempt无效

class MyHome(views.View):
    def get(self,request):
        return HttpResponse('Get')

    @method_decorator(csrf_protect) # 校验post方法
    def post(self,request):
        return HttpResponse('Post')

方式二:

        在定义类上面提前添加好那些方法需要校验,这个方式同样也不能用来添加csrf_exempt

@method_decorator(csrf_protect,name='post') # 提前指定
class MyHome(views.View):
    def get(self,request):
        return HttpResponse('Get')

    def post(self,request):
        return HttpResponse('Post')

方式三:

        直接影响类中所有的方法同时支持csrf_protect与csrf_exempt

class MyHome(views.View):
    # @method_decorator(csrf_protect)
    @method_decorator(csrf_exempt)
    def dispatch(self,request,*args,**kwargs):
        super(MyHome,self).dispatch(request,*args,**kwargs)

    def get(self,request):
        return HttpResponse('Get')

    def post(self,request):
        return HttpResponse('Post')

ps:针对csrf_exempt只有方式3有效,针对其他装饰器上述三种方式都有效

auth模块简介

        auth模块是强大的django自带的一个用户认证模块,我们在开发网站的时候不可避免的需要用到用户的登录、注册等功能有了auth模块可以给我们带来更快的编写功能,django在执行数据库迁移命令后会产生一个auth_user表配合auth模块做用户认证,该表还是django admin后台管理默认的表

# admin后台管理员账号创建
python manage.py createsuperuser

auth模块常见功能:

# 1.创建用户

from django.contrib.auth.models import User 
User.object.create_user(username,password)
# 注意创建管理员一定要加上邮箱
User.object.create.superuser(username,password,email)
from django.contrib import auth # 导入模块

# 校验用户名和密码是否正确 
auth.authenticate(request,username,password)
# 用户登录
auth.login(request,user_obj)
# 判断用户是否登录
request.user.is_authecticated
# 获取登录用户对象
rquest.user
# 校验密码是否正确
request.user.check_password(old_password)
# 修改密码
request.user.set_password(new_password)
# 修改完记得保存
request.user.save()
# 注销登录
auth.logout(request)

auth给我们提供了装饰器工具,用来快捷的给某个视图添加登录校验,如果用户没有登录则会跳转到django默认的URL '/accounts/login/ ',如果需要自定义登录的URL则需要在配置文件settings.py中通过LOGIN_URL进行修改

from django.contrib.auth.decorators import login_required

@login_required
def My_view(request):
    pass

# 跳转局部配置
login_request(login_url='/login/'
# 跳转全局配置
LOGIN_URL = '/login/'

auth_user表切换

# 1.models.py
	 from django.contrib.auth.models import AbstractUser

    class Userinfo(AbstractUser):
        '''扩展auth_user表中没有的字段'''
        phone = models.BigIntegerField()
        desc = models.TextField()
# 2.settings.py
	 AUTH_USER_MODEL = 'app01.Userinfo'
好的,下面是基于 Django auth 模块的登录和注册模块的示例代码: ## 注册模块 ### 1. 创建注册页面 在 templates 目录下创建一个 register.html 文件,该文件包含一个表单,用户可以输入用户名和密码: ```html <!DOCTYPE html> <html> <head> <title>注册</title> </head> <body> <h2>注册</h2> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">注册</button> </form> </body> </html> ``` ### 2. 创建注册视图 在 views.py 文件中创建一个 register 视图,该视图处理用户提交的注册表单,并将新用户保存到数据库中: ```python from django.shortcuts import render, redirect from django.contrib.auth.forms import UserCreationForm def register(request): if request.method == 'POST': form = UserCreationForm(request.POST) if form.is_valid(): form.save() return redirect('login') else: form = UserCreationForm() return render(request, 'register.html', {'form': form}) ``` 在上面的代码中,我们使用 Django 自带的 UserCreationForm 表单处理用户提交的注册表单。如果表单数据有效,我们将表单数据保存到数据库中,并将用户重定向到登录页面。 ## 登录模块 ### 1. 创建登录页面 在 templates 目录下创建一个 login.html 文件,该文件包含一个表单,用户可以输入用户名和密码: ```html <!DOCTYPE html> <html> <head> <title>登录</title> </head> <body> <h2>登录</h2> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">登录</button> </form> </body> </html> ``` ### 2. 创建登录视图 在 views.py 文件中创建一个 login 视图,该视图处理用户提交的登录表单,并验证用户名和密码是否匹配: ```python from django.shortcuts import render, redirect from django.contrib.auth.forms import AuthenticationForm from django.contrib.auth import authenticate, login def login_view(request): if request.method == 'POST': form = AuthenticationForm(data=request.POST) if form.is_valid(): username = form.cleaned_data.get('username') password = form.cleaned_data.get('password') user = authenticate(username=username, password=password) if user is not None: login(request, user) return redirect('home') else: form = AuthenticationForm() return render(request, 'login.html', {'form': form}) ``` 在上面的代码中,我们使用 Django 自带的 AuthenticationForm 表单处理用户提交的登录表单。如果表单数据有效,我们使用 authenticate 函数验证用户名和密码是否匹配。如果匹配成功,我们使用 login 函数将用户登录到系统中,并将用户重定向到网站首页。 ### 3. 创建网站首页 在 urls.py 文件中创建一个网站首页的路由: ```python from django.urls import path from .views import register, login_view, home urlpatterns = [ path('register/', register, name='register'), path('login/', login_view, name='login'), path('', home, name='home'), ] ``` 在 views.py 文件中创建一个 home 视图,该视图返回网站首页的 HTML 页面: ```python from django.shortcuts import render def home(request): return render(request, 'home.html') ``` 在 templates 目录下创建一个 home.html 文件,该文件包含网站首页的 HTML 代码。 这就是基于 Django auth 模块的登录和注册模块的示例代码。希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值