Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘
系列文章目录
- Django入门全攻略:从零搭建你的第一个Web项目
- Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作
- Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解
- Django ORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践
- 跨域问题与Django解决方案:深入解析跨域原理、请求处理与CSRF防护
- Django视图层探索:GET/POST请求处理、参数传递与响应方式详解
- Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘
- …(可在同专栏下查看最近更新文章)
文章目录
- 系列文章目录
- 前言
- 一、静态路由
- 1.1 静态路由匹配方式:
- 1.2 静态路由示例
- 二、动态路由
- 2.1 动态路由参数传递
- 2.2 动态路由转换器
- 2.3 动态路由传参与GET传参的异同点
- 三、路由分发
- 3.1 路由分发的概念
- 3.2 include路由分发实现
- 四、Cookie
- 4.1 HTTP短连接是什么
- 4.2 状态保持是什么
- 4.3 什么是COOKIE
- 4.4 框架对于COOKIE的操作
- 五、Session
- 5.1 Session的原理
- 5.2 框架是如何存储管理Session的
- 5.3 框架如何操作Session
- 5.4 Session示例
- 5.5 Session与Cookie的对比
- 六、CSRF
- 6.1 什么是CSRF
- 6.2 CSRF攻击模拟实现
- 6.3 如何防止CSRF攻击
前言
主要介绍了Django中静态路由、动态路由、路由分发、Cookie和Session以及CSRF等内容
一、静态路由
Django的路由系统中,通过urls的匹配,可以直接映射到特定的视图函数或类视图,在当前整个路由中没有携带任何动态改变的值,称之为静态路由。
通俗来说,访问路径中,不存在动态传递数据,称之为静态路由
urlpatterns属性:
urlpatterns
是路由文件中的一个全局变量,用来存放路由及视图函数的映射关系
用户发起的请求URL
都会首先进入主控制目录下的这个urls.py
文件中进行查找匹配:
- 首先找到
urls.py
下的urlpatterns
全局变量,这是一个路由规则实例的列表数据。 - 按照先后定义顺序,进行路由匹配。
- 找到第一个匹配项时停止匹配,执行匹配到的视图函数。
- 遍历完全,未发现匹配,
django
进行异常处理
其中urlpatterns
中的每一个路由映射规则可以由path
或re_path
进行构造
1.1 静态路由匹配方式:
path方法:
path(str, view, kwargs=None, name=None)
'''
str:一个匹配对应url地址的规则字符串
view:路由对应的视图函数,并且会自动封装HttpRequest作为第一个参数给这个视图函
kwargs:视图函数的关键字参数
name:该路由的全局命名,可以让我们方便的在django项目中任意部分显示的使用,相当于为url取变量名,接下来全局使用该命名值即可;当对应url路由改变之后,结合路由反向解析使用的地方不需要更改路由,案例:<a href="{% url url_name %}"></a>
'''
re_path方法:
re_path(regex, view, kwargs=None, name=None)
'''
regex:一个匹配对应url地址的规则字符串
view:路由对应的视图函数,并且会自动封装HttpRequest作为第一个参数给这个视图函
kwargs:视图函数的关键字参数
name:该路由的全局命名,可以让我们方便的在django项目中任意部分显示的使用,相当于为url取变量名,接下来全局使用该命名值即可;当对应url路由改变之后,结合路由反向解析使用的地方不需要更改路由
'''
1.2 静态路由示例
# views.py
from django.http import HttpResponse
def index(request):return HttpResponse('Hello Worlds!') # urls.py
from django.urls import path,re_path
from urlapp import views
urlpatterns = [path('index/',views.index),re_path(r"^/$",views.index),#此处完善对应的正则表达式即可re_path(r"^index/\d+/$",IndexView.as_view()), #CBV
]
二、动态路由
动态路由:访问路径中,存在动态传递数据,称之为动态路由
2.1 动态路由参数传递
例如在遇到一些内容翻页的场景时,我们的连接可能是:xx.com/airticle_list/1/
、xx.com/airticle_list/2/
# views.py
def index(request,x,y):content = "x:%s\ny:%s" % (x,y) return HttpResponse(content)
定义如上函数,将会接收连接中的后两部份path
值作为参数,分别依次给到x
和y
2.2 动态路由转换器
# urls.py
from django.urls import path,re_path
from urlapp import views
urlpatterns = [path('<int:x>/<str:y>/',views.index), # 指明类型 访问:`http://127.0.0.1:8000/1/abc/`path("<x>/<y>/",views.index), # 不指明类型 访问:`http://127.0.0.1:8000/abc/abc/`re_path(r"^(?P<x>\d+)/(?P<y>[a-zA-Z]+)/$"), # (?P<name>pattern) 正则分组re_path(r"^(\d+)/([a-zA-Z]+)/$"),
]
- 其他内置Path转换器,可以将我们的路由参数规定为指定类型
'''
str:匹配除了路径分隔符(`/`)之外的非空字符串,这是默认的形式
int:匹配正整数,包含0
slug:匹配字母、数字以及横杠、下划线组成的字符串
uuid:匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00
path:匹配任何非空字符串,包含了路径分隔符
'''
自定义转换器:
在Django中,自定义路由转换器(Custom Route Converter) 允许你根据特定的正则表达式和规则来定义如何解析URL中的参数,并将其传递给视图函数或类视图。这种机制允许你更加灵活地处理URL模式,尤其是当内置的路由转换器(如
int
、slug
、path
等)无法满足你的需求时。
# urls.py
from django.urls import path,re_path,converters
class PhoneConverter:regex = '1[3-9]\d{9}'def to_python(self, value):return int(value)def to_url(self, value):return str(value)#在 项目的 urls.py 文件中 注册 自定义的路由转换器
converters.register_converter(PhoneConverter, 'phone')
#在路由配置中
urlpatterns = [path('index/<phone:id>/',views.index), # 指明类型
]
2.3 动态路由传参与GET传参的异同点
- 动态路由传参,参数需要参与路由匹配,在路由匹配中获取参数
- GET参数,参数部分不需要参与路由匹配,在视图中获取参数
三、路由分发
3.1 路由分发的概念
每个子
app
都拥有自己独立的urls.py
路由映射文件,而主控路由文件里只需要使用include
函数导入子app
下路由文件即可,这就是路由分发
3.2 include路由分发实现
from django.contrib import admin
from django.urls import path,includeurlpatterns = [path('admin/', admin.site.urls),path('urlapp/',include("urlapp.urls")) # 使用include 实现路由分发,找到子app下的路由文件
]
四、Cookie
4.1 HTTP短连接是什么
HTTP短连接
,也称为非持久连接,在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。
HTTP长连接
,也称为持久连接(Persistent Connection)或HTTP keep-alive连接,是一种使用单个TCP连接来发送和接收多个HTTP请求/响应的通信方式。HTTP/1.1起,默认使用长连接。与HTTP短连接不同,长连接在发送一个HTTP请求后不会立即关闭TCP连接,而是保持连接打开状态,以便在同一连接上发送和接收后续的HTTP请求/响应。
4.2 状态保持是什么
Cookie
及Session
一直以来都是Web开发中非常关键的一环,因为HTTP
协议本身为无状态,每一次请求之间没有任何状态信息保持,往往我们的Web服务无法在客户端访问过程中得知用户的一些状态信息,比如是否登录等等;那么这里通过引入Cookie
或者Seesion
来解决这个问题
客户端存储信息使用:Cookie
服务端存储信息使用:Session
4.3 什么是COOKIE
当客户端访问时,服务端会为客户端生成一个
Cookie
键值对数据,通过Response
响应给到客户端。当下一次客户端继续访问相同的服务端时,浏览器客户端就会将这个Cookie
值连带发送到服务端.
Cookie
是基于客户端的,它们与用户的浏览器会话相关联。服务器使用Cookie
来跟踪和识别用户的浏览器会话,以便为用户提供个性化的体验或记住用户的设置和偏好。
Cookie 主要由以下几部分组成:
- 名称(Name):Cookie 的名称,用于标识该 Cookie
- 值(Value):与 Cookie 名称关联的值,通常用于存储用户信息或状态。
- 过期时间(Expires/Max-Age):指定 Cookie 的有效期。如果设置了过期时间,则 Cookie 会在该时间后自动失效;否则,Cookie 将在浏览器关闭时失效。
- 路径(Path):指定 Cookie 适用的页面路径。只有该路径下的页面才能访问该 Cookie。
- 域(Domain):指定可以接收该 Cookie 的域名。通常设置为设置该 Cookie 的网站的域名。
- 安全标志(Secure):如果设置了该标志,则只能通过 HTTPS 协议传输该 Cookie。这有助于增加 Cookie 的安全性。
- HttpOnly 标志:如果设置了该标志,则 JavaScript 无法访问该 Cookie。这有助于防止跨站脚本攻击(XSS)。
4.4 框架对于COOKIE的操作
在
django
的代码中,我们可以使用一些提供Response
响应的类,如:HttpResponse
,redirect
等实例的内置set_cookie
函数来进行django
项目中的Cookie
设置
set_cookie(key, value='', max_age=None, expires=None, path='/',domain=None, secure=False, httponly=False)
'''
参数解释:
key: Cookie的key值,未来通过该key值获取到对应设置好的Cookie。
value='': 对应Cookie的key值的value,比如: set_cookie(key='value',value='shuai')
max_age=None: Cookie生效的时间,单位为秒,如果Cookie值只持续在客户端浏览器的会话时长,那么这个值应该为None。存在该值时,expires会被计算得到。
expires=None: Cookie具体过期日期,是一个datetime.datetime对象,如果该值存在,那么max_age也会被计算得到
如果同时设置了expires和max_age,老版本中以expires为准,新版本中会报错,建议使用:单独使用max_agepath='/': 指定哪些url可以访问到Cookie,默认/为所有。
domain=None: 当我们需要设置的为一个跨域的Cookie值,那么可以使用该参数,比如: domain='.test.com',那么这个Cookie值可以被www.test.com、bbs.test.com等主域名相同的域所读取,否则Cookie只被设置的它的域所读取。为None时,代表当前域名下全局生效。
secure=False: https加密传输设置,当使用https协议时,需要设置该值,同样的,如果设置该值为True,如果不是https连接情况下,不会发送该Cookie值。
httponly=False: HTTPOnly是包含在HTTP响应头部中Set-Cookie中的一个标记。为一个bool值,当设置为True时,代表阻止客户端的Javascript访问Cookie。这是一种降低客户端脚本访问受保护的Cookie数据风险的有效的办法。
'''
设置COOKIE:
# views.py
from django.shortcuts import render,HttpResponse
# Create your views here.def set_cookie(request):# 在HTTPResponse部分设置COOKIE值cookie_reponse = HttpResponse('这是一个关于cookie的测试')cookie_reponse.set_cookie('test','hello cookie')return cookie_reponse
以上视图函数返回一个
HttpResponse
对象,并在该对象中集成COOKIE
值的设定,设置key
值为test
,value
值为hello cookie
设置过期时间:
import datetime
current_time = datetime.datetime.now() # 当前时间
expires_time = current_time + datetime.timedelta(seconds=10) # 向后推延十秒
set_cookie('key','value',expires=expires_time) #设置Cookie及对应超时时间datetime.timedelta是Python中一个用于表示时间差的类。它可以表示一段时间,例如几天、几小时、几分钟等。使用datetime.timedelta可以在日期和时间上进行简单的加减操作。
获取COOKIE:
def get_cookie(request):# 获取cookie值,从request属性中的COOKIE属性中cookie_data = request.COOKIES.get('test')return HttpResponse('Cookie值为:%s' % cookie_data)
Cookie
值存储在request
中的COOKIES
属性中
并且该属性获取到的结果与python中的字典类似,直接通过内置函数get
获取即可
删除COOKIE:
def delete_cookie(request):response = HttpResponseRedirect('/check_cookie/')response.delete_cookie('test')return response
在Cookie
中删除指定的key
及对应的value
,如果key
值不存在,也不会引发任何异常。
防止篡改COOKIE:
通过
set_signed_cookie
函数进行持有签名的COOKIE
值设置,避免用户在客户端进行修改
HttpResonse.set_signed_cookie(key, value, salt='', max_age=None,
expires=None, path='/', domain=None, secure=None, httponly=True)
# 为cookie值添加签名,其余参数与set_cookie相同
Request.get_signed_cookie(key, salt='', max_age=None)
# 从用户请求中获取通过salt盐值加了签名的`Cookie`值
这里的
salt
要与之前存储时使用的salt
值相同才可以解析出正确结果。
还要注意的是,如果对应的key值不存在,则会引发KeyError
异常,所以要记得异常捕获来确定是否含有Cookie
值
def check_salt_cookie(request):try:salt_cookie = request.get_signed_cookie(key='salt_cookie',salt='nice')except KeyError: #获取不到该key值的Cookieresponse = HttpResponse('正在设置一个salt Cookie值')response.set_signed_cookie(key='salt_cookie',salt='nice',value='salt_cookie')return responseelse: #获取到了对应key值,展示到新的HttpResonse中return HttpResponse('获取到的salt Cookie值:%s' % salt_cookie)
五、Session
5.1 Session的原理
Session
在网络中,又称会话控制,简称会话。用以存储用户访问站点时所需的信息及配置属性。当用户在我们的Web
服务中跳转时,存储在Session
中的数据不会丢失,可以一直在整个会话过程中存活。
5.2 框架是如何存储管理Session的
在
django
中,默认的Session
存储在数据库中session
表里。默认有效期为两个星期。
5.3 框架如何操作Session
当
settings.py
中SessionMiddleware
激活后
在视图函数的参数request
接收到的客户端发来的HttpResquest
请求对象中都会含有一个session
属性
存储session:
request.session[key] = value
request.session['name'] = 'zs'
获取Session:
session_data = request.session.get(Key)
session_data = request.session[Key]
在
Session
中获取对应值,get
方法获取时,如不存在该Key
值,不会引发异常,返回None
;
而第二种直接通过get方法获取,如Key
值不存在,引发KeyError
删除Session:
del request.seesion[Key]
# 删除对应session,Key值不存在时,引发KeyErrorrequest.session.clear()
# 清空Session中的所有数据。这里客户端还会保留sessionid;
# 只不过在服务端sessionid对应的数据没有了request.session.flush()
# 直接删除当前客户端的的Seesion数据。这里不光服务端sessionid对应的数据没有了,客户端的`sessionid`也会被删除
设置有效期:
request.session.set_expiry(value)
# 设置Session的有效时间
'''
value: 有效时间。- 为整数时: 将在value为秒单位之后过期 - 为0时: 将在用户关闭浏览器之后过期。- 为None时: 使用全局过期的设置,默认为两个星期,14天。- 为datetime时: 在这个指定时间后过期 2023-8-10 12:00:00
'''
request.session.get_expiry_age()
# 返回距离过期还剩下的秒数
request.session.clear_expired()
# 清除过期的Session会话
5.4 Session示例
from django.shortcuts import render,HttpResponseimport datetimedef set_session(request):if request.session.get('test_id'):session_data = request.session.get('test_id')# 用户拿到的的session随机字符串session_key = request.session.session_key # 获取客户端浏览器中的SessionID值session_expire = request.session.get_expiry_age()now = datetime.datetime.now()expire_time = now + datetime.timedelta(seconds=session_expire)response_body = '<div>SessionID : %s</div>' % session_key + \'<div>Session : %s</div>' % session_data + \'<div>ExpireTime : %s</div>' % expire_timereturn HttpResponse(response_body)else:request.session['test_id'] = 'TEST'request.session.set_expiry(None)return HttpResponse('已设置好Session')
用户在第一次访问时,会走
else
分支,此时还没有任何服务端的Session
及客户端的Cookie
值设定
那么我们会通过request.session[Key]
的方式来设置一个Session
值,值为TEST
当用户第二次访问时将展示出所设置好的
Session
值及在客户端浏览器中存储的sessionid
def delete_session(request):if request.session.get('test_id'):del request.session['test_id']return HttpResponse('Session被删了')else:return HttpResponse('目前没有任何需要删除的session')
5.5 Session与Cookie的对比
1.cookie
数据存放在客户的浏览器
上,session
数据放在服务器
上。
2. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。
4. 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
六、CSRF
6.1 什么是CSRF
CSRF(Cross-site request forgery):跨站请求伪造。
6.2 CSRF攻击模拟实现
从上图可以看出,要完成一次 CSRF 攻击,受害者必须满足两个必要的条件:
(1)登录受信任网站 A,并在本地生成 Cookie。(如果用户没有登录网站 A,那么网站 B 在诱导的时候,请求网站 A 的 api 接口时,会提示你登录)
(2)在不登出 A 的情况下,访问危险网站 B(其实是利用了网站 A 的漏洞)。
6.3 如何防止CSRF攻击
讨论 GET 和 POST 两种请求,对于 GET,其实也没什么需要防范的。为什么?
因为 GET 在 “约定” 当中,被认为是查询操作,查询的意思就是,你查一次,查两次,无数次,结果都不会改变(用户得到的数据可能会变),这不会对数据库造成任何影响,所以不需要加其他额外的参数。
所以这里要提醒各位的是,尽量遵从这些约定,不要在 GET 请求中出现 /delete, /update, /edit 这种单词。把 “写” 操作放到 POST 中。
对于 POST,服务端在创建表单的时候可以加一个隐藏字段,也是通过某种加密算法得到的。在处理请求时,验证这个字段是否合法,如果合法就继续处理,否则就认为是恶意操作。
<form method="post" action="/delete"><!-- 其他字段 --><input type="hidden" />
</form>
这个 html 片段由服务端生成。
这的确是一个很好的防范措施,再增加一些处理的话,还能防止表单重复提交。
可是对于一些新兴网站,很多都采用了 “前后端分离开发” 的设计,或者退一步,无论是不是前后端分离,它的 HTML 可能是由 JavaScript 拼接而成,并且表单也都是异步提交。所以这个办法有它的应用场景,也有局限性。
相关文章:
Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘
系列文章目录 Django入门全攻略:从零搭建你的第一个Web项目Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解Django ORM深度游ÿ…...
第7章 用户输入和 while 循环
第7章 用户输入和 while 循环 7.1 函数 input()的工作原理7.1.1 编写清晰的程序7.1.2 使用 int()来获取数值输入7.1.3 求模运算符 7.2 while 循环简介7.2.1 使用 while 循环7.2.2 让用户选择何时退出7.2.3 使用标志7.2.4 使用 break 退出循环7.2.5 在循环中使用 continue7.2.6 …...
xshell远程无法链接上VM的centos7
1、现象如下, 2.1解决办法:查证后发现这个默认的设置为vmnet0 2.2解决办法:重启win10的虚拟机网卡(先禁用再启用) 3.参考文章:Xshell连接不上虚拟机centos7_centos7的nat模式可以ping通网络,但是用xshell连…...
拥抱AI-图片学习中的卷积神经算法详解
一、定义 卷积神经算法(Convolutional Neural Networks, CNN)是深度学习领域中的一种重要算法,特别适用于处理图像相关的任务。以下是卷积神经算法的详细解释: 1. 基本概念 定义:卷积神经网络是一类包含卷积计算且具…...
超详解——深入详解Python基础语法——基础篇
目录 1 .语句和变量 变量赋值示例: 打印变量的值: 2. 语句折行 反斜杠折行示例: 使用括号自动折行: 3. 缩进规范 缩进示例: 4. 多重赋值(链式赋值) 多重赋值的应用: 5 .多…...
系统架构设计师【论文-2017年 试题2】: 论软件架构风格(包括写作要点和经典范文)
题目:论软件架构风格 (2017年 试题2) 软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式。体系结构风格 定义一个系统家族,即一个体系结构定义一个词汇表和一组约束。词汇表中包含一些构件和 连接件类型ÿ…...
Spring Boot 事务传播机制详解
Spring Boot 事务传播机制详解 1. 事务传播机制概述 Spring Boot 中的事务传播机制用于处理多个事务方法之间相互调用时的事务行为,保证数据的完整性和一致性。当务传播机制定义了在调用一个事务方法时,当前事务该如何传播或传递。Spring Boot 中的事务…...
【机器学习】生成对抗网络 (Generative Adversarial Networks | GAN)
生成对抗网络 (Generative Adversarial Networks | GAN) 介绍 生成对抗网络 (Generative Adversarial Networks,简称GAN) 是一种强大的深度学习模型,用于生成具有逼真感的图像、音频和文本等内容。GAN 的核心理念是通过训练两个神经网络,生…...
[ADS信号完整性分析]深入理解IBIS AMI模型设计:从基础到实践
在高速数字设计领域,信号完整性(SI)分析对于确保系统性能至关重要。IBIS AMI(Algorithmic Model Interface)模型作为一种强大的工具,能够帮助设计师在系统层面上评估和优化SERDES(串行器/解串器…...
Plotly : 超好用的Python可视化工具
文章目录 安装:开始你的 Plotly 之旅基本折线图:简单却强大的起点带颜色的散点图:数据的多彩世界三维曲面图:探索数据的深度气泡图:让世界看到你的数据小提琴图:数据分布的优雅展现旭日图:分层数…...
Linux电话本的编写-shell脚本编写
该电话本可以实现以下功能 1.添加用户 2.查询用户 3.删除用户 4.展示用户 5.退出 代码展示: #!/bin/bash PHONEBOOKphonebook.txt function add_contact() { echo "Adding new contact..." read -p "Enter name: " name …...
蓝牙开发 基础知识
零、基础知识 0.1、Android 应用可通过 Bluetooth API 执行以下操作 扫描其他蓝牙设备查询本地蓝牙适配器的配对蓝牙设备建立 RFCOMM 通道通过服务发现连接到其他设备与其他设备进行双向数据传输管理多个连接 0.2、蓝牙进行通信的四大必需任务 设置蓝牙查找局部区域内的配对…...
QNX 7.0.0开发总结
1 QNX编译 1.1 基本概念 QNX可以直接使用Linux Makefile编译库和二进制,在Makefile文件中指定CCaarch64-unknown-nto-qnx7.0.0-g,或者CCx86_64-pc-nto-qnx7.0.0-g,保存退出后,运行source /qnx_sdk_path/qnxsdp-env.sh,…...
Golang使用讯飞星火AI接口
一、API申请 https://www.bilibili.com/video/BV1Yw411m7Rs/?spm_id_from333.337.search-card.all.click&vd_source707ec8983cc32e6e065d5496a7f79ee6 注册申请,需要在此页面获取appid、apisecret、apikey https://www.xfyun.cn/ https://console.xfyun.cn/ser…...
矫正儿童发音好帮手
《言语构音语音训练手册——下颌、唇部、舌部构音运动障碍》教辅书 儿童言语构音语音问题越来越受到家长的关注,大多数家长受到儿童说话晚、口齿不清、发音错误等问题的困扰,国外报道2岁儿童言语构音语音障碍达到17%,3岁达4%~7.5%࿰…...
wordpress主题导航主题v4.16.2哈哈版
1.下载授权接口源码onenav-auth-api-v2.zip ,在宝塔新建一个网站,域名为 auth.iotheme.cn,设置wordpress伪静态,申请ssl证书。将上面源码解压后上传到此网站根目录。 2. 在宝塔根目录etc下 hosts 中添加 127.0.0.1 auth.iotheme.…...
内存分布图
1.基本数据类型和常量存放在常量池中。 2.类的成员存放在堆中,如果成员是其他类对象也存放在堆中 3.数组和数组的内容放在堆中 4.类对象存放在栈中。 5.单独的对象存放在栈中。 6.引用数据类型存放在堆或栈中。 Java中对象到底存在堆中还是栈中_java对象在堆还…...
如何发布自己的NPM插件包?
安装 Node.js : 如果没有安装的,Nodejs下载安装:http://nodejs.cn/download/ 首先确保你已经安装了 Node.js 和 npm。你可以通过运行以下命令来检查是否已经安装: node -v npm -v初始化项目: 创建一个新的项目文件夹…...
计算广告读书杂记-待整理
不知不觉已经在字节干了两年多广告研发,也跳槽去了一家广告公司继续深耕,借着这个劲,重新读一遍《计算广告》这本书,并将一些重点概念进行记录。...
No module named _sqlite3解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
防飞单,赢市场:售楼处客流统计管理新篇章
在竞争激烈的房地产市场中,售楼处作为楼盘销售的重要窗口,其管理效率和服务质量直接关系到楼盘的销售业绩和品牌形象。然而,传统的客户人数统计方式往往存在诸多不足,如数据不准确、统计效率低下等,这些问题给售楼处的…...
LeetCode:419. 甲板上的战舰(遍历 Java)
目录 419. 甲板上的战舰 题目描述: 实现代码与解析: 遍历 原理思路: 419. 甲板上的战舰 题目描述: 给你一个大小为 m x n 的矩阵 board 表示甲板,其中,每个单元格可以是一艘战舰 X 或者是一个空位 . &…...
【python】OpenCV—Blob Detection(11)
学习来自OpenCV基础(10)使用OpenCV进行Blob检测 文章目录 1、cv2.SimpleBlobDetector_create 中文文档2、默认 parameters3、配置 parameters附录——cv2.drawKeypoints 1、cv2.SimpleBlobDetector_create 中文文档 cv2.SimpleBlobDetector_create 是 O…...
【C++】 基础复习 | 数据类型,输入,输出流 scanf printf
文章目录 1 基本数据类型1.1 基本数据类型1.2 构造类型1.3 指针类型(Pointers) 2 基础输入输出2.1 通过输入输出操作符>> <<2.2 通过scanf和printf输入和输出2.2.1 输出printf 函数2.2.2 输出scanf 函数2.2.3 注意事项 1 基本数据类型 了解…...
linux pxe和无人值守
一 PXE和无人值守 pxe c/s模式 允许客户端通过网络从远程服务器(服务端)下载引导镜像 加载安装文件 实现自动化安装操作系统 无人值守 就是安装选项不需要认为干预 可以自动化实现 pxe的优点 1 规模化 同时装配多台服务器 20多 30台 2 自动化 …...
Questflow借助MongoDB Atlas以AI重新定义未来工作方式
MongoDB客户案例导读 Questflow借助MongoDB Atlas赋能AI员工,助力中小型初创企业自动化工作流程,简化数据分析,提升客户体验,推动AI与员工的协作,重新定义未来工作方式。 协作式AI自动化平台 无需编码即可拥有自己的…...
数值计算精度问题(浮点型和双整型累加精度测试)
这篇博客介绍双整型和浮点数累加精度问题,运动控制轨迹规划公式有大量对时间轴的周期累加过程,如果我们采用浮点数进行累加,势必会影响计算精度。速度的不同 进一步影响位置积分运算。轨迹规划相关问题请参考下面系列文章,这里不再赘述: 1、博途PLC 1200/1500PLC S型速度曲…...
算法训练营day56
题目1:300. 最长递增子序列 - 力扣(LeetCode) class Solution { public:int lengthOfLIS(vector<int>& nums) {// dp数组含义是第i个数的严格递增子序列的长度// 内层的递推公式就是 取 0 到 i - 1之间最大的dp数组 然后 1vector…...
基于STM32的智能水产养殖系统(二)
TPS5433IDR TPS5433IDR 是一款由德州仪器 (Texas Instruments) 生产的高效降压转换器(Buck Converter)。它能够将较高的输入电压转换为较低的输出电压,适用于各种电源管理应用。 主要特性 输入电压范围: 5.5V 至 36V输出电压范围: 0.9V 至 …...
[工具探索]富士mini90拍立得使用指南
文章目录 1. 基本功能介绍1.1 相机外观1.2 电池与胶片 2. 设置相机2.1 装入电池2.2 装入胶片 3. 拍摄模式3.1 标准模式3.2 儿童模式3.3 远景模式3.4 双重曝光模式3.5 Bulb(B)模式3.6 **派对模式**3.7 微距模式3.8 **亮度模式**3.9 **定时拍摄模式**3.10 …...
wix做的网站在国内访问不/想开个网站怎样开
GitHub地址 用Builder模式重新打造一个dialog,案例中有两种Builder,分别是CommonBuilder和MDBuilder,如果还想实现其他的通用dialog,继承自FRBaseDialogBuilder即可。 1、用法: 1.1、普通Dialog private void showComm…...
海口网站建设fwlit/域名注册信息查询
文章目录⛄引言一、Redis 实现好友关注 -- Feed流实现推送到粉丝收件箱⛅Feed 流实现方案⚡推送到粉丝收件箱三、Redis 实现好友关注 -- 实现分页滚动查询 实时获取信息⛵小结⛄引言 本博文参考 黑马 程序员B站 Redis课程系列 在点评项目中,有这样的需求ÿ…...
免费网站是/成都搜索优化排名公司
上一篇介绍了如何爬取豆瓣TOP250的相关内容,今天我们来模拟登陆GitHub。 1 环境配置 语言:Python 3.6.1 IDE: Pycharm 浏览器:firefox 抓包工具:fiddler 爬虫框架:Scrapy 1.5.0 操作系统:Windo…...
橙色wordpress模板/如何开展网络营销活动
这段时间去面试了几家公司,发现比较大的公司相对于重视基础问题。这里边又有几个问题特别的突出。他们是:同步时钟设计、亚稳态、异步FIFO。可以说,这些个问题要是弄清楚了,就至少满足了技术方面1/3的要求,另外的2/3是…...
北京做网站公司有哪些/收录优美图片手机版
在某个微信群里看到个积分题目,说是用六年级的知识解???其实根据后面运行的结果来看,手算可能不太行。 import pandas as pd import matplotlib.pyplot as plt %matplotlib inline import numpy as npx1 np.arange(…...
金华住房和城乡建设厅网站/爱站工具包官网
静态调用如果需要使用内置的规则验证单个数据,可以使用静态调用的方式。控制器验证如果你需要在控制器中进行验证,并且继承了\think\Controller的话,可以调用控制器类提供的validate方法进行验证,如下:如果定义了验证器…...