目录

使用Django对中间件的调用思想完成自己的功能

中间件的调用只需要在配置文件中添加,如果不使用某个中间件,只需要在配置文件中将对应的字符串注释掉就可以,这种调用执行某一代码的方式是不是很方便呢?下面我们就利用Django对中间件的调用的思想,将自己的功能也实现和中间件一样的调用方式。

功能要求

假设实现的功能:信息的群发,要求我们写好的信息只需要一键发送就可以通过邮件、短信、微信三种方式一起发送出去,如果我们不需要某种通知方式只需要在配置文件中将其注释掉就可以。

importlib模块介绍

动态导入模块importlib,可以按照填入的以点隔开的字符串文件路径获的方式取到对应的文件。使用方法:

module_path = 'notify.msg'
md = importlib.import_module(module_path) #md就是notify文件夹下的msg文件

如果需要获取文件里面定义的函数或者类,可以使用反射的方法(这里将文件当做一个对象,一切皆对象)

cls = getattr(md,cls_name)#将文件名作为对象右面填类的名字就能拿到对应的类

功能的实现

1.建一个群发信息功能的包如下图,将每一张发送信息的方式写在一个独立的文件中。

2.在每一个通知文件中定义对应的通知类如:

class Msg:
def __init__(self):
pass # 发送信息前的准备 def send(self, content):
print(f'Msg通知:{content}')

3.将每一个文件添加到配置文件如下:

NOTIFY_LISTS = [
'notify.email.Email',
'notify.msg.Msg',
'notify.qq.Qq',
'notify.WeChat.WeChat'
]

4.在init中对类的查找和实例化进行处理

import importlib
import settings
def send_all(content):
for path in settings.NOTIFY_LISTS:
module_path,cls_name = path.rsplit('.',maxsplit=1)
module = importlib.import_module(module_path)
cls = getattr(module,cls_name)
obj = cls()
obj.send(content)

5.在start中调用包实现消息群发的功能

import os,sys
from notify import send_all sys.path.append(os.path.dirname(__file__)) if __name__ == '__main__':
send_all('现在测试通知') Email通知:现在测试通知
Msg通知:现在测试通知
QQ通知:现在测试通知
WeChat通知:现在测试通知

至此功能基本实现。

csrf中间件详细介绍

跨站请求伪造

csrf全称Cross-site request forgery(跨站请求伪造), 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

跨站请求伪造最常见的应用如钓鱼网站,钓鱼网站的具体钓鱼方式:钓鱼网站伪造一个和正规网站界面一模一样的网站,然后将转账(支付)功能的的form表单进行修改,当用户登录时提供的是正规网站的登录接口,而用户支付或转账的对方账户是假的,下面隐藏的是预先设定好的账户(input框的name和value),这样用户每次给对方进行转账都会将钱转到预先设定好的账户。如何解决跨站请求伪造呢?

从服务端的角度来解决这个问题的思路就是如果每次服务端都能识别出来向我提交请求的是我自己的页面还是别人的页面,那么钓鱼网站就无法在用户访问服务器的过程中伪装成服务端网页给服务端发送转账请求了。而Django中的中间件就是通过这种思想解决跨站请求伪造的问题的。

Django csrf中间件

当用户访问有Django csrf中间件的服务端时Django csrf中间件会给用户的get请求的页面携带一个随机字符串,当用户发送post请求时会校验用户的随机字符串,如果如果校验不通过则直接报403错误,禁止用户提交post请求。

<input type="hidden" name="csrfmiddlewaretoken" value="rJ47FeK9T55wavvVJGY6UxdM1kTMHhTqotGfaXjXIK8Ahz2Uvs02yR9T8bBn5q2D">

能否提交post请求的通常是form表单和ajax请求,Djangocsrf中间件在两种post请求中的使用方式是不同的,具体使用方法如下:

form表单

我们只需在form表单中添加{% csrf_token %}。

<form action="" method="post">
{% csrf_token %}
<p>username:<input type="text" name="username"></p>
<p>target_account:<input type="text" name="target_user"></p>
<p>money:<input type="text" name="money"></p>
<input type="submit">
</form>
<input type="hidden" name="csrfmiddlewaretoken" value="rJ47FeK9T55wavvVJGY6UxdM1kTMHhTqotGfaXjXIK8Ahz2Uvs02yR9T8bBn5q2D">

ajax

ajax有三种方式添加中间件标签。

方式一

先在页面任意的位置上书写{% csrf_token %},然后在发送ajax请求的时候通过标签查找获取随机字符串添加到data自定义对象即:

data:{'username':'xxx','csrfmiddlewaretoken'

Django对中间件的调用思想、csrf中间件详细介绍、Django settings源码剖析、Django的Auth模块的更多相关文章

  1. 跨站请求伪造(csrf),django的settings源码剖析,django的auth模块

    目录 一.跨站请求伪造(csrf) 1. 什么是csrf 2. 钓鱼网站原理 3. 如何解决csrf (1)思路: (2)实现方法 (3)实现的具体代码 3. csrf相关的装饰器 (1)csrf_p ...

  2. 源码剖析Django REST framework的请求生命周期

    学习Django的时候知道,在Django请求的生命周期中,请求经过WSGI和中间件到达路由,不管是FBV还是CBV都会先执行View视图函数中的dispatch方法 REST framework是基 ...

  3. 源码剖析Django REST framework的认证方式及自定义认证

    源码剖析Django REST framework的认证方式 在前面说过,请求到达REST framework的时候,会对request进行二次封装,在封装的过程中会对客户端发送过来的request封 ...

  4. Django学习——Django settings 源码、模板语法之传值、模板语法之获取值、模板语法之过滤器、模板语法之标签、自定义过滤器、标签、inclusion_tag、模板的导入、模板的继承

    Django settings 源码 """ 1.django其实有两个配置文件 一个是暴露给用户可以自定义的配置文件 项目根目录下的settings.py 一个是项目默 ...

  5. Django的settings源码分析

    Django其实有两个配置文件,一个是暴露给用户的可以自定义的配置,一个是项目默认的配置,用户如果配置了就用用户的,没有配置就用默认的. 首先需要在settings文件中导入,然后查看settings ...

  6. django 之csrf、auth模块及settings源码、插拔式设计

    目录 基于django中间件拷贝思想 跨站请求伪造简介 跨站请求伪造解决思路 方式1:form表单发post请求解决方法 方式2:ajax发post请求解决方法 csrf相关的两个装饰器 csrf装饰 ...

  7. (day59)十一、CSRF、Auth模块、impotlib模块、settings源码

    目录 一.模拟实现中间件的编程思想 (一)impotlib模块 (二)实现功能的配置使用 二.跨站请求伪造CSRF (一)由来 (二)form表单的CSRF (三)ajax中的CSRF (1)通过da ...

  8. django restfulwork 源码剖析

    概要: 1.restful 规范(建议); 2. django rest framework框架 内容回顾: 1.开发模式; - 普通开发模式(前后端放在一起写) - 前后端分离 好处: 后端一套,前 ...

  9. Django Rest Framework源码剖析(八)-----视图与路由

    一.简介 django rest framework 给我们带来了很多组件,除了认证.权限.序列化...其中一个重要组件就是视图,一般视图是和路由配合使用,这种方式给我们提供了更灵活的使用方法,对于使 ...

随机推荐

  1. python虚拟环境mkvirtualenv使用

    安装virtualenvwrapper  pip install virtualenvwrapper   修改默认虚拟环境目录: 环境变量中新建: 变量名:WORKON_HOME 变量值:目录位置 ( ...

  2. 部署php程序报错解决---TP框架

    1.TP框架中 出现如下错误: 访问网站 http://192.168.0.204/ STORAGE_WRITE_ERROR_:./Runtime/Cache/Home/51620d75af91aa7 ...

  3. java:Mybatis框架1(基本配置,log4j,Junit4(单元测试))

    1.mybatis01: db.properties: driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test userna ...

  4. mysql 8.0.12 安装配置方法图文教程

    一.安装 1.从网上下载MySQL8.0.12版本,下载地址 2. 下载完成后解压 我解压的路径是:D:\Java\mysql-8.0.12-winx64 3. 配置文件 首先在解压的路径下查看是否含 ...

  5. CSS元素隐藏

    { display: none; /* 不占据空间,无法点击 */ } /*************************************************************** ...

  6. Hibernate 持久化对象和一级缓存

    关于如何手动创建Hibernate,Hibernate初了解已经介绍了,接下来了解持久化对象和一级缓存. Hibernate的持久化类有三种状态: 1.Transient瞬时态:持久化对象没有唯一标识 ...

  7. Spring Boot 中使用 WebSocket 实现一对多聊天及一对一聊天

    为什么需要WebSocket? 我们已经有了http协议,为什么还需要另外一个协议?有什么好处? 比如我想得到价格变化,只能是客户端想服务端发起请求,服务器返回结果,HTTP协议做不到服务器主动向客户 ...

  8. Shell编程、part4

    本节内容 1. shell函数 2. shell正则表达式 shell函数 shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数.给这段代码起个名字称为函数名,后续可以直 ...

  9. Pytorch调整学习率

    每隔一定的epoch调整学习率 def adjust_learning_rate(optimizer, epoch): """Sets the learning rate ...

  10. vue调用组件,组件回调给data中的数组赋值,报错Invalid prop type check failed for prop value. Expecte

    报错信息: 代码信息:调用一个tree组件,选择一些信息 <componentsTree ref="typeTreeComponent" @treeCheck="t ...