Django中间件与csrf
一. django中间件
1. 什么是django中间件
# django中间件是django的门户1. 请求来的时候需要先经过中间件才能到达真正的django后端2. 响应走的时候最后也需要经过中间件才能发送出去
2. django中间件的个数
django自带七个中间件, 分别是SecurityMiddleware, SessionMiddleware,CommonMiddleware, CsrfViewMiddleware, AuthenticationMiddleware,MessageMiddleware, XFrameOptionMiddleware
3. django请求生命周期流程图

4. 研究django中间件代码规律
# 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',]class SessionMiddleware(MiddlewareMixin):def process_request(self, request):...def process_response(self, request, response):...class CsrfViewMiddleware(MiddlewareMixin):def process_request(self, request):...def process_view(self, request, callback, callback_args, callback_kwargs):...def process_response(self, request, response):...class AuthenticationMiddleware(MiddlewareMixin):def process_request(self, request):...
5. 自定义中间件
# django支持程序员自定义中间件, 并且暴露给程序员五个可以自定义的方法# 掌握process_requestprocess_response# 了解process_viewprocess_template_responseprocess_exception
5-1. 自定义中间件流程
1. 在项目名或者应用名下创建一个任意名称的文件夹
2. 在该文件夹内创建一个任意名称的py文件
3. 在该py文件内需要书写类(注意: 这个类必须继承MiddlewareMixin)然后在这个类里面就可以自定义五个方法了提示: 这五个方法并不是全部都需要书写,用几个写几个
4. 需要将类的路径以字符串的形式注册到settings.py配置文件中的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',# 注册自己的中间件(在应用下创建路径有提示,但是如果在项目下创建就没有提示了 你就需要自己比对着书写)'你自己写的中间件的路径1','你自己写的中间件的路径2','你自己写的中间件的路径3',
]
5-2. 二种掌握自定义: process_request, process_response
'''
process_request1. 请求来的时候会依此走 MIDDLEWARE 中定义的该方法. 如果没有定义就跳过.执行顺序: MIDDLEWARE 中从上到下2. 如果返回 HttpResponse 对象, 请求将不会继续往后执行, 而是原路返回目的: 用来做全局相关的所有限制功能应用: 校验失败不允许访问process_response1. 响应走的时候会依此走 MIDDLEWARE 中定义的该方法. 如果没有定义就跳过.执行顺序: MIDDLEWARE 中从下到上2. 该方法必须返回 HttpResponse 对象2.1 默认返回形参response2.2 返回自定义的拓展: 综合2者: 如果 process_request 方法指定返回 HttpResponse对象.1. 后续 process_request 方法不执行.2. 从同级别 process_response 方法开始按照 MIDDLEWARE 从下到上依此返回.3. 如果 process_response 方法没有指定自定义返回结果, 默认返回的就是 process_request 中返回的结果. 否则返回 process_response 方法的结果拓展: flask框架也有一个中间件但是它的规律只要返回数据了就必须经过所有中间件里面的类似process_reponse方法
'''
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponseclass FirstMiddleware(MiddlewareMixin):def process_request(self, request):"""1. 请求来的时候需要经过每一个中间件里面的process_request方法结果的顺序是按照配置文件中注册的中间件从上往下的顺序依次执行2. 如果中间件里面没有定义该方法,那么直接跳过执行下一个中间件3 .如果该方法返回了HttpResponse对象,那么请求将不再继续往后执行而是直接原路返回(校验失败不允许访问...)process_request方法就是用来做全局相关的所有限制功能"""print('我是 FirstMiddleware 类中的定义的 process_request 方法')def process_response(self, request, response):"""1.响应走的时候需要结果每一个中间件里面的process_response方法该方法有两个额外的参数request,response2. 该方法必须返回一个HttpResponse对象. 不返回抛出异常: 'NoneType' object has no attribute 'get'2-1. 默认返回的就是形参response2-2. 你也可以自己返回自己的3. 顺序是按照配置文件中注册了的中间件从下往上依次经过如果你没有定义的话 直接跳过执行下一个:param response: 就是django后端返回给浏览器的内容"""print('我是 FirstMiddleware 类中的定义的 process_response 方法')return responseclass SecondMiddleware(MiddlewareMixin):def process_request(self, request):print('我是 SecondMiddleware 类中的定义的 process_request 方法')# return HttpResponse(# '研究2: 如果 process_request 方法返回了 HttpResponse 对象,那么请求将不再继续往后执行而是直接原路返回. 响应走的时候是经过同级别的 process_response 返回')def process_response(self, request, response):print('我是 SecondMiddleware 类中的定义的 process_response 方法')# return HttpResponse('研究1: 如果 process_response 方法返回了 HttpResponse 对象,那么响应按照自己的返回结果作为标准返回.')return response
5-3. 三种了解自定义: process_view, process_template_response, process_exception
'''
process_view路由匹配之前 或者 执行视图函数之前 时触发执行顺序: MIDDLEWARE 中从上到下
process_template_response视图函数返回结果中含有render属性是触发执行顺序: MIDDLEWARE 中从下到上
process_exception视图函数出现异常时触发执行顺序: MIDDLEWARE 中从下到上
'''
from django.utils.deprecation import MiddlewareMixinclass FirstMiddleware(MiddlewareMixin):def process_view(self, request, view_name, *args, **kwargs):"""路由匹配成功之后执行视图函数之前,会自动执行中间件里面的该放法顺序是按照配置文件中注册的中间件从上往下的顺序依次执行"""print(view_name, args, kwargs) # <function my_index at 0x000002345C28BEA0> ((), {}) {}print('我是第一个自定义中间件里面的 process_view')def process_template_response(self, request, response):"""返回的HttpResponse对象有render属性的时候才会触发顺序是按照配置文件中注册了的中间件从下往上依次经过def index(request):print('我是视图函数index')obj = HttpResponse('index')def render():print('内部的render')return HttpResponse("O98K")obj.render = renderreturn obj"""print('我是第一个自定义中间件里面的 process_template_response')return responsedef process_exception(self, request, exception):"""当视图函数中出现异常的情况下触发顺序是按照配置文件中注册了的中间件从下往上依次经过"""print('我是第一个中间件里面的 process_exception')print(exception)class SecondMiddleware(MiddlewareMixin):def process_view(self, request, view_name, *args, **kwargs):print(view_name, args, kwargs)print('我是第二个自定义中间件里面的 process_view')def process_template_response(self, request, response):print('我是第二个自定义中间件里面的 process_template_response')return responsedef process_exception(self, request, exception):print('我是第二个中间件里面的process_exception')print(exception)
二. csrf跨站请求伪造
1. csrf介绍
# csrf 全称 cross site request forgery 跨站请求伪造# 举一个实例来描述什么是csrf:我搭建一个跟正规网站一模一样的界面(中国银行)用户不小心进入到了我们的网站,用户给某个人打钱打钱的操作确确实实是提交给了中国银行的系统,用户的钱也确确实实减少了但是唯一不同的时候打钱的账户不适用户想要打的账户变成了一个莫名其妙的账户# 内部本质我们在钓鱼网站的页面 针对对方账户 只给用户提供一个没有name属性的普通input框然后我们在内部隐藏一个已经写好name和value的input框# 如何规避上述问题: csrf跨站请求伪造校验网站在给用户返回一个具有提交数据功能页面的时候会给这个页面加一个唯一标识, 斌且这个唯一标识永远不一样当这个页面朝后端发送post请求的时候 我的后端会先校验唯一标识,如果唯一标识不对直接拒绝(403 forbbiden)如果成功则正常执行
2. CSRF跨站请求伪造及解决思路流程图

3. 针对form与ajax的符合校验设置来解决CSRF问题
# form表单符合校验: 只需要指定一个 {% load csrf_token %} 即可<head>{% load static %} {# 方式三 #}<script src="{% static 'js/pass_csrf.js' %}"></script></head><body><h3>我是正规网站</h3><form action="" method="post">{% csrf_token %}<p>转账账户: <input type="text" name="user"></p><p>目标账户: <input type="text" name="target_user"></p><p>转账金额: <input type="text" name="money"></p><input type="submit" value="form表单提交"></form><br># ajax符合校验设置
'''
方式一: 利用标签查找获取页面上的随机字符串'csrfmiddlewaretoken': $("[name='csrfmiddlewaretoken']").val()
方式二: 利用模版语法提供的快捷书写'csrfmiddlewaretoken': '{{ csrf_token }}'注意: 这里是 '{{ csrf_token }}' 而不是 {% csrf_token %}
方式三: 通用直接拷贝js代码并应用到自己的html页面上即可{% load static %}<script src="{% static 'js/pass_csrf.js' %}"></script>
'''
<button id="d1">ajax方式提交</button>
<script>$('#d1').on('click', function () {$.ajax({url: '',type: 'post',data: {'user': 'jason',{#'user': $("[name='user']").val(),#}{#'target_user': $("[name='target_user']").val(),#}'target_user': 'egon',{#'money': $("[name='money']").val(),#}'money': '100000',{#'csrfmiddlewaretoken': $("[name='csrfmiddlewaretoken']").val(),#} // 方式一{#'csrfmiddlewaretoken': '{{ csrf_token }}',#} // 方式二},success: function () {},})})
</script>
ajax符合校验设置第三种方法的js代码拷贝
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 protectionreturn (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}$.ajaxSetup({beforeSend: function (xhr, settings) {if (!csrfSafeMethod(settings.type) && !this.crossDomain) {xhr.setRequestHeader("X-CSRFToken", csrftoken);}}
});
4. {% csrf_token%} 与 {{ csrf_token }}的表现形式及两者之间的关系
# {% csrf_token%}<input type="hidden" name="csrfmiddlewaretoken" value="Fuih8hBFfSw7usOBVz1FF8yWYlBVeqmJ59O0HGGZp9Rko4Ovm9F5QnS2Zm0dKV5K"># {{ csrf_token }}# 对应的就是{% csrf_token %}input标签中的value值BTYOUHdtrTRzOKnSFn1yzu4hnbs2J88h1yuxt6iNBacMImnM6XFYKJonocRkfDRi
三. csrf相关装饰器
# 需求
'''
1. 网站整体都不校验csrf,就单单几个视图函数需要校验
2. 网站整体都校验csrf,就单单几个视图函数不校验
'''
1. 针对FBV
from django.views.decorators.csrf import csrf_protect, csrf_exempt# @csrf_exempt
# @csrf_protect
def my_transfer(request):if request.method == "POST":user = request.POST.get('user')target_user = request.POST.get('target_user')money = request.POST.get('money')print(f'{user}给{target_user}转了{money}元')return render(request, 'my_transfer.html')
2. 争对CBV
"""
csrf_protect 需要校验针对csrf_protect符合装饰器的三种玩法
csrf_exempt 忽视校验针对csrf_exempt只能给dispatch方法加才有效
"""
from django.views.decorators.csrf import csrf_protect, csrf_exempt
from django.utils.decorators import method_decorators# @method_decorator(csrf_protect, name='post')
class MySelfCsrfToken(View):# @method_decorator(csrf_protect)def dispatch(self, request, *args, **kwargs):return super(MySelfCsrfToken, self).dispatch(request, *args, **kwargs)def get(self, request):return HttpResponse('get 请求')# @method_decorator(csrf_protect)def post(self, request):return HttpResponse('post 请求')# @method_decorator(csrf_exempt, name='post')
class MySelfCsrfToken(View):@method_decorator(csrf_exempt)def dispatch(self, request, *args, **kwargs):return super(MySelfCsrfToken, self).dispatch(request, *args, **kwargs)def get(self, request):return HttpResponse('get 请求')# @method_decorator(csrf_exempt)def post(self, request):return HttpResponse('post 请求')
四. 总结
# django中间件# 什么是django中间件: 它是django的大门请求来的时候要先过中间件才能到达真正的django后端响应走的时候也需要经过中间件才能发送出去# django中间件个数: 自带七个SecurityMiddlewareSessionMiddlewareCommonMiddlewareCsrfViewMiddlewareAuthenticationMiddlewareMessageMiddlewareXFrameOptionMiddleware# django提供了5种自定义中间件方法process_requestprocess_responseprocess_viewprocess_template_responseprocess_exception# 自定义中间件流程1. 应用 或 项目 下创建任意文件夹2. 在创建的任意文件夹下创建任意的.py文件3. 在创建的任意的.py文件中书写类. 该类要继承MiddlewareMixin4. 到settings.py配置文件中找到MIDDLEWARE注册# 二种掌握自定义: process_request, process_response# process_request1. 请求来的时候会从上到下依此执行注册了中间件类中的方法. 没有定义就跳过2. 如果返回了HttpResponse对象, 请求将不会往下执行, 而是原路返回功能: 用来做全局相关的所有限制功能应用: 效验用户权限功能# process_response1. 响应走的时候会从下到上依此执行注册了中间件类中的方法. 没有定义就跳过2. 该方法必须返回HttpResponse对象2-1. 返回参数response2-2. 返回自定义HttpResponse对象# 二者综合:如果process_request方法返回的是HttpResponse对象. 请求将不会往下继续执行,开始按照同级别定义的process_response方法, 按照注册了中间件类中的顺序从下到上依此返回.如果在返回的途中的process_response方法没有使用自定义的HttpResponse对象的形式返回, 那么最终返回的结果就按照process_request方法返回的HttpResponse对象为准如果在返回的途中的process_response方法自定义的自己的HttpResponse对象,那么将会按照当前HttpResponse返回的结果作为标准. 同时如果上一层也定义了,就按照上一层的结果返回.# 基本使用from django.utils.deprecation import MiddlewareMixinclass MyMiddleware(MiddlewareMixin):def process_request(self, request)...def process_response(self, request, response):...return response# 三种了解自定义: process_view, process_template_response, process_exception# process_view在路由匹配之前视图函数执行之前触发执行顺序: 在注册了的中间件类中从上到下# process_template_response在视图函数返回的HttpResponse对象含有render属性时触发执行顺序: 在注册了的中间件类中从下到上# process_exception在视图函数执行过程中抛出异常时触发执行顺序: 在注册了的中间件类中从下到上# csrf跨站请求伪造# csrf 全称 cross site request forgery 跨站请求伪造# 什么是CSRF就是基于不同的服务端发送出相同的展示页面, 假的页面与真的页面展示给用户看时候一模一样,在用户输入敏感信息的时候, 提交的不是用户想提交的内容, 而是隐藏在标签中的内容,虽然都是提交到同一个正规服务器, 但是提交的数据内容不是用户指定的了. 而是隐藏的内容.# 本质:钓鱼网站不提供用户输入的name属性值, 而是提供自己指定的隐藏的写好的name以及对应的value# 规避:在给用户返回一个具有提交数据的功能页面的时候附加一个唯一标识,在用户提交请求过来的时候, 服务端效验这个请求中是否含有对应的唯一标识,如果有则正常执行 如果没有则拒绝并返回403 forbbiden# 争对form与ajax的符合校验设置来解决CSRF问题# 争对form在返回的页面书写 {% csrf_token %}# 争对ajax: 在data参数中指定方式一: data: {'csrfmiddlewaretoken': $('[name=csrfmiddlewaretoken].val()')}方式二: {'csrfmiddlewaretoken': `{{ csrf_token }}`}方式三: 自定义js文件copy代码. 再配置静态文件导入.# csrf相关装饰器from django.utils.decorators.csrf import csrf_protect, csrf_exempt# 争对FBV@csrf_protect# @csrf_exemptdef index(request):if request.method == 'POST':return HttpResponse('index')return render(request, 'index.html')# 争对CBVcsrf_protect三种方式都可以csrf_exempt只争对dispatch方法有效
相关文章:
Django中间件与csrf
一. django中间件 1. 什么是django中间件 # django中间件是django的门户1. 请求来的时候需要先经过中间件才能到达真正的django后端2. 响应走的时候最后也需要经过中间件才能发送出去 2. django中间件的个数 django自带七个中间件, 分别是SecurityMiddleware, SessionMiddle…...
【搜维尔科技】产品推荐:Virtuose 6D RV,大型工作空间触觉设备
Virtuose 6D RV为一款具有大工作空间并在所有6自由度上提供力反馈的触觉设备,设计专用于虚拟现实环境,特别适合于大型虚拟物体的处理。 Virtuose 6D RV是当今市场上唯一将高工作效率与高工作量相结合在一起的产品。6D RV特别适合于缩放与操纵等应用&…...
<JavaEE> 什么是线程(Thread)?进程和线程有什么区别?
目录 一、线程(Thread)的概念 二、线程存在的意义 2.1 并发编程 2.2 比进程更“轻量” 三、使用线程时应该注意 四、进程和线程的区别 五、Java中的线程和操作系统中的线程是不同的概念 六、多线程编程 一、线程(Thread)的…...
【赠书第7期】从零基础到精通Flutter开发
文章目录 前言 1 安装Flutter和Dart 2 了解Flutter的基础概念 2.1 Widget 2.2 MaterialApp和Scaffold 2.3 Hot Reload 3 编写你的第一个Flutter应用 3.1 创建一个Flutter项目 3.2 修改默认页面 3.3 添加交互 4 深入学习Flutter高级特性 4.1 路由和导航 4.2 状态管…...
《golang设计模式》第三部分·行为型模式-07-观察者模式(Observer)/发布者—订阅者模式
文章目录 1. 概念1.1 角色1.2 类图 2. 代码示例2.1 代码2.2 类图 1. 概念 观察者(Observer)指当目标对象状态发生变化后,对状态变化事件进行响应或处理的对象。 1.1 角色 Subject(抽象主题): 它可以有多…...
Maven中常用命令以及idea中使用maven指南
文章目录 Maven 常用命令compiletestcleanpackageinstallMaven 指令的生命周期maven 的概念模型 idea 开发maven 项目idea 的maven 配置idea 中创建一个maven 的web 工程在pom.xml 文件添加坐标坐标的来源方式依赖范围编写servlet maven 工程运行调试 Maven 常用命令 compile …...
深度学习之八(生成对抗网络--Generative Adversarial Networks,GANs)
概念 生成对抗网络(Generative Adversarial Networks, GANs)是一种深度学习模型,由 Ian Goodfellow 等人于2014年提出。GAN 的目标是通过训练两个神经网络(生成器和判别器),使得生成器能够生成与真实数据相似的样本,而判别器能够区分真实样本和生成样本。这两个网络相…...
内部网关协议_路由信息协议RIP_开放路径优先OSPF协议_基本知识
目录: 因特网路由选择协议概述 路由信息协议RIP 开放路径优先OSPF协议 因特网路由选择协议概述 一.路由选择分类 静态路由选择和动态路由选择 静态路由选择: 采用人工配置的方式给路由器添加网络路由、默认路由和特定主机路由等路由条目。静态路由选择简单、开销小&#…...
Linux python安装 虚拟环境 virtualenv
根目录创建 venvs 文件夹 sudo mkdir /venvs 进入 /venvs 目录 cd /venvsp 创建虚拟环境,前提要按照 python3 安装 的 命令 sudo apt install python3 sudo python3 -m venv 虚拟环境名 激活虚拟环境 sourcepippip /venvs/zen-venv/bin/activatepinpi 安装flask pip…...
洛谷 P1883 函数
P1883 函数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Error Curves - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这两题是一模一样的,过一题水两题。 分析 主要难点在于证明F(x)是一个单峰函数可以被三分,但是我随便画了几个f(x)之后发现好像…...
【C++心愿便利店】No.14---C++之探索list底层原理
文章目录 前言一、list的介绍及使用1.1 list的介绍1.2 list的使用1.2.1 list的构造1.2.2 list iterator的使用1.2.3 list capacity1.2.4 list element access1.2.5 list modifiers1.2.6 list operations1.2.7 list的迭代器失效 二、list的模拟实现2.1 定义一个结构体实现list的…...
【广州华锐互动】VR防溺水安全内容体验提高群众防溺水意识
在全球各地,溺水是导致儿童和青少年死亡的主要原因之一。据世界卫生组织的统计,全球每年有超过36万人因溺水而死亡,其中大部分是儿童和青少年。因此,提供有效的防溺水教育和培训至关重要。随着科技的发展,虚拟现实&…...
【Skynet 入门实战练习】游戏模块划分 | 基础功能模块 | timer 定时器模块 | logger 日志服务模块
文章目录 游戏模块基础功能模块定时器模块日志模块通用模块 游戏模块 游戏从逻辑方面可以分为下面几个模块: 注册和登录网络协议数据库玩法逻辑其他通用模块 除了逻辑划分,还有几个重要的工具类模块: Excel 配置导表工具GM 指令测试机器人…...
python内置模块binascii,二进制数据和ASCII字符串之间进行转换
一、简介 binascii是Python标准库中的一个模块,提供了在二进制数据和ASCII字符串之间进行转换的功能。它包含了一些用于处理二进制数据的函数,可以进行二进制数据的编码、解码和转换。 二、方法 binascii.unhexlify(hexstr):将十六进制表示…...
如何开启MySQL的慢查询日志
说明:如果需要查看某一条SQL查询速度慢,并对慢的SQL进行优化,那么开启MySQL慢查询日志是一定要做的事情,本文介绍如何开启MySQL的慢查询日志; 查看MySQL慢查询是否开启 首先,输入下面的命令,查…...
Spine的BoundingBoxAttachment碰撞检测
引擎版本 —— cocos creator 2.3.4 游戏代码: //优先初始化的时候,获取到cc.PhysicsPolygonColliderthis._poly this.dragonFooAni.node.getComponent(cc.PhysicsPolygonCollider);//下面的修改顶点位置的方法可以在update里面去执行//获取骨骼动画上…...
Proteus下仿真AT89C51报“串行口通信失败,请检查电平适配是否正确。”解决办法
在Proteus下进行AT89C51串行口仿真时,如果遇到“串行口通信失败,请检查电平适配是否正确”的错误提示,以下是一些解决办法: 1. 了解AT89C51和外部设备的电平要求: 首先,了解AT89C51和外部设备之间的电平…...
微信小程序制作
如果你也想搭建一个小程序,但不知道如何入手,那么今天我就教你如何使用第三方制作平台,在短短三十分钟内搭建一个小程序。 一、登录小程序制作平台 首先,登录到小程序制作平台的官方网站或应用程序,进入后台管理系统。…...
快速在WIN11中本地部署chatGLM3
具体请看智谱仓库github:GitHub - THUDM/ChatGLM3: ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型 或者Huggingface:https://huggingface.co/THUDM/chatglm3-6b 1. 利用Anaconda建立一个虚拟环境: conda create -n chatglm3 pyt…...
土地利用数据技术服务
一、背景介绍 土地是人类赖以生存与发展的重要资源和物质保障,在“人口-资源-环境-发展(PRED)”复合系统 中,土地资源处于基础地位。随着现代社会人口的不断增长以及工业化、城市化进程的加速&a…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
