Django框架-12

这篇具有很好参考价值的文章主要介绍了Django框架-12。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

中间件

Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。

我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。

中间件的定义方式

定义一个中间件工厂函数,然后返回一个可以被调用的中间件。(闭包 知识)
中间件工厂函数需要接收一个可以调用的get_response对象。

返回的中间件也是一个可以被调用的对象,并且像视图一样需要接收一个request对象参数,返回一个response对象。

def simple_middleware(get_response):
# 此处编写的代码仅在Django第一次配置和初始化的时候执行一次。
def middleware(request):
# 此处编写的代码会在每个请求处理视图前被调用。
response = get_response(request)
# 此处编写的代码会在每个请求处理视图之后被调用。
return response
return middleware

例如,在users应用中新建一个middleware.py文件,

def my_middleware(get_response):
print('init 被调用')
def middleware(request):
print('before request 被调用')
response = get_response(request)
print('after response 被调用')
return response
return middleware

定义好中间件后,需要在settings.py 文件中添加注册中间件

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'users.middleware.my_middleware', # 添加中间件
]

定义一个视图进行测试

def demo_view(request):
print('view 视图被调用')
return HttpResponse('OK')

记得配置路由

多个中间件的执行顺序

在请求视图被处理前,中间件由上至下依次执行
在请求视图被处理后,中间件由下至上依次执行

定义两个中间件

def my_middleware1(get_response):
print('init1 被调用')
def middleware(request):
print('before request 1 被调用')
response = get_response(request)
print('after response 1 被调用')
return response
return middleware

def my_middleware2(get_response):
print('init2 被调用')
def middleware(request):
print('before request 2 被调用')
response = get_response(request)
print('after response 2 被调用')
return response
return middleware

注册添加两个中间件

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'users.middleware.my_middleware', # 添加
'users.middleware.my_middleware2', # 添加
]

CSRF跨站请求伪造

1、CSRF介绍

在前面课程中使用Post请求的时候,出现403错误,当时处理方式是注释掉中间件的csrf这行。这节课我们将详细讲 解什么是csrf,csrf的功能以及作用。

CSRF, Cross Site Request Forgery, 跨站点伪造请求。攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来 说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的 账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。造成个人信息泄露,与财产安全。

2、csrf攻击过程

1.用户打开浏览器,访问A网站,输入用户名和密码请求登录网站A

2.在用户信息通过验证后,网站A产生Cookie 信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

3.用户未退出网站A之前,在同一浏 览器中,打开另外一个网站B;

4.网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

5.浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向
网站A发出请 求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以用户的权
限处理该请求,导致来自 网站B的恶意代码被执行。

3、防御CSRF攻击

目前防御 CSRF 攻击主要有三种策略:验证 HTTP Referer 字段;在请求地址中添加 token 并 验证;在 HTTP 头中自定义属性并验证。

Django 防御csrf攻击: Django提供了csrf中间件用于防止CSRF攻击,而且是默认开启的。

MIDDLEWARE_CLASSES 中的csrf中间件,csrf中间件只对post请求有效,get请求无效。

1、django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 token 放在 cookie 里。然后每次 POST 请求都会带上这个 token

2、在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token

3、在所有的 POST 表单时,必须包含一个 csrfmiddlewaretoken 字段,只需要在表单中添加一个{%csrf_token %}标签,django会自动在模板中生成一个隐藏的表单域,带有后端响应页面时塞进来的随机生成的token值。

4、在处理 POST 请求之前,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提交的表单里的 csrfmiddlewaretoken 字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于 别人的 csrf 攻击,返回 403 Forbidden.

5、在所有 ajax POST 请求里,添加一个 X-CSRFTOKEN header,其值为 cookie 里的 csrftoken 的值开启了csrf中间件之后,在模板中的form表单添加一个{% csrf_token %}。 如果是用form表单提交的话直接在表单 中添加 {% csrf_token %}。

<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册表单</title>
</head>
<body>
{#请求方式:post请求 请求路径:/viewdemo/register/ #}
<form method="post" action="/users/login/">
{% csrf_token %}
用户名:<input type="text" name="uname"/><br>
密码:<input type="password" name="upwd"/><br>
<input type="submit" value="登录"/>
</form>
</body>
</html>

如果是用ajax提交的话,需要携带一个键为 csrfmiddlewaretoken 值为 {% csrf_token %} 的参数
示例:
如果在模板中写的 post 提交的话 可以在参数中携带这个参数: csrfmiddlewaretoken: '{{csrf_token }}

$.post('/blog/register_user/', {'uname': username,
'upwd':upwd,csrfmiddlewaretoken:
'{{ csrf_token }}'}, function (data) {
//注册成功 加载成功页面,或者重定向到其他页面
//window.href = 'http://www.baidu.com'
$('html').html(data)
}

在js文件中,可以先获取前端页面中由{% csrf_token %} 生成的隐藏域的input 标签的value值文章来源地址https://www.toymoban.com/news/detail-546118.html

<input name="csrfmiddlewaretoken"
value="lt5VtILNu1q44aVfQEFP2NgiUEtere0bZNnoNVSNjjX1AsfRDE9bvSn7ZmbeYL7Z"
type="hidden">
var csrf = $("input[name='csrfmiddlewaretoken']").val();
$.post('/blog/check_name/', {'uname': username,csrfmiddlewaretoken: csrf},
function (data) {
}

到了这里,关于Django框架-12的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python Web框架要点---Django流程详解

    用于搭建Web应用程序 免去不同Web应用相同代码部分的重复编写,只需关心Web应用核心的业务逻辑实现 接收并解析HTTP请求,获取具体的请求信息 处理本次HTTP请求,即完成本次请求的业务逻辑处理 构造并返回处理结果——HTTP响应 重点 重点 MVT流程:掌握M,V,T的每个模块的功能

    2024年02月04日
    浏览(30)
  • python之django框架入门,看完你就会

    目录 1.创建Django项目  2.创建Django应用  3.定义ORM模型 4.创建并执行数据库迁移 5.定义视图函数 6.定义URL路由 7.编写模板 Django是一个基于Python的Web框架,它旨在提供开发人员一个高效而且富有灵活性的工具集。它包含了一套完整的组件,涵盖了从路由、视图、模板、表单到O

    2024年02月09日
    浏览(47)
  • Python 框架学习 Django篇 (六) ORM关联

    像是上一章我们很少会通过页面点击去添加和绑定关系表,更多的时候都是通过django的语法实现,接下来我们做一个案例 django rom是怎么操作外键关系的 创建mode模型表 Django_demo/mgr/models.py 添加测试数据 1、字段访问 案例 2、单个字段过滤 如果我们想要查询学生表中所有关于

    2024年02月08日
    浏览(34)
  • Python Web开发:Django与Flask框架

    Django和Flask都是Python中非常受欢迎的Web开发框架。虽然它们都是用于构建Web应用程序的工具,但它们在设计理念、使用方式和适用场景等方面存在一些差异。 Django Django是一个“大而全”的框架,遵循MVC设计模式。它内置了很多功能,如ORM(对象关系映射)、模板引擎、表单处

    2024年02月22日
    浏览(43)
  • 二挡起步——pythonweb开发Django框架,前端原生+Django后端框架+python网络抓包(代替数据库数据)(附带小案例)

     大家好,我是csdn的博主: lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主 lqj_本人擅长微信小程序,前端,python,等方面的知识 https://blog.csdn.net/lbcyllqj?spm=1011.2415.3001.5343 哔哩哔哩欢迎关注: 小淼Develop 小淼Develop的个人空间-小淼Develop个

    2024年02月03日
    浏览(53)
  • django如何连接sqlite数据库?

    目录 一、SQLite数据库简介 二、Django连接SQLite数据库 1、配置数据库 2、创建数据库表 三、使用Django ORM操作SQLite数据库 1、定义模型 2、创建对象 3、查询对象 总结 本文将深入探讨如何在Django框架中连接和使用SQLite数据库。我们将介绍SQLite数据库的特点,Django的数据库配置,以

    2024年02月06日
    浏览(40)
  • Python - Django 框架 - 设置SECRET_KEY

    在Django中,SECRET_KEY是一个重要的配置项,用于加密和保护用户数据、会话和其他敏感信息。下面是设置SECRET_KEY的几种常见方法: 请确保将’your-secret-key’替换为自己的实际密钥。这种方法简单直接,但在版本控制系统中共享代码时存在风险,因为密钥可以被他人看到。 在这

    2024年02月16日
    浏览(18)
  • Python web 框架对比:Flask vs Django

    哈喽大家好,我是咸鱼 今天我们从几个方面来比较一些现在流行的两个 python web 框架——Flask 和 Django,突出它们的主要特性、优缺点和简单案例 到最后,大家将更好地了解哪个框架更适合自己的特定需求 参考链接:https://djangocentral.com/flask-vs-django-selecting-the-perfect-python-web

    2024年02月11日
    浏览(36)
  • python三大开发框架django、 flask 和 fastapi 对比

    本文讲述了什么启发了 FastAPI 的诞生,它与其他替代框架的对比,以及从中汲取的经验。 如果不是基于前人的成果,FastAPI 将不会存在。在 FastAPI 之前,前人已经创建了许多工具 。 几年来,我一直在避免创建新框架。首先,我尝试使用许多不同的框架,插件和工具来解决

    2024年02月10日
    浏览(48)
  • 微信小程序提交数据,python的django框架接收

    一、微信小程序部分,这里要注意:content-type的设置与后台接收的格式相关,在这里设置成application/x-www-form-urlencoded 二、python部分,这里用 json.loads方法加载整个 request.body,因为整个body就是一个json数据 原始数据是这样的:

    2024年02月12日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包