当前位置: 首页 > news >正文

Cookie与Session知识

目录

一.Cookie与Session的发展史

1.Cookie的发展史

2.Session的发展史

3.Cookie和Session的关系

4.总结

二.Cookie与Session详解

1.Cookie

2.Session

3.token

4.总结

三.Django操作Cookie

1.设置Cookie

2.获取Cookie

3.设置超时时间

4.注销Cookie

5.登录功能实现

(1.0)简单实现

(2.0)解决登录问题

(3.0)迭代-登录认证装饰器

四.Django操作Session

1.设置Session

2.获取Session

3.设置/获取Session多个值

4.django_session表中的session数据

5.设置过期时间

6.清空session

(1)request.session.delete():

(2)request.session.flush():

7.保存

原理剖析

案例演示

(1.0)简单的

(2.0)解决方法

(3.0)优化


一.Cookie与Session的发展史

Cookie和Session是用来在Web应用程序中跟踪用户会话数据的两种常用技术

1.Cookie的发展史

  1. 1994年,网景通信公司推出了第一个浏览器Cookie技术。Cookie是存储在用户计算机上的小型文本文件,用于跟踪用户在网站上的活动。
  2. 初始版本的Cookie只能存储很少的数据,并且没有强制加密机制,容易被恶意用户篡改或窃取。因此,随着互联网的快速发展,Cookie引起了一系列安全和隐私问题。

2.Session的发展史

  1. 由于Cookie存在的局限性,Web开发人员开始寻找更安全、可靠的替代方案。1997年,Sun Microsystems提出了基于服务器的会话管理方案,即Session。
  2. Session是在服务器端存储用户会话数据的一种技术。每当用户访问网站时,服务器会为其创建一个唯一的Session标识符(Session ID),并将会话数据存储在服务器上。
  3. Session ID一般通过Cookie或URL参数传递给客户端,用于识别用户的会话状态。

3.Cookie和Session的关系

  1. 在实际应用中,Cookie和Session通常结合使用。当用户首次访问网站时,服务器会为其分配一个唯一的Session ID,并将其存储在Cookie中,发送给客户端保存。
  2. 随后,客户端在每次请求中都会携带该Cookie,服务器通过解析Cookie中的Session ID,读取对应的会话数据,实现用户状态的跟踪和管理。

4.总结

Cookie和Session是Web应用程序中常用的用户会话跟踪技术

Cookie通过在客户端存储小型文本文件,并将会话标识符传递给服务器,实现会话状态的保持

Session则是在服务器端存储会话数据,通过Session ID实现对用户会话的追踪

他们的发展历程与互联网的发展紧密相关,为开发人员提供了更多的选择以保障安全性和用户体验的提升

二.Cookie与Session详解

以登录功能为例:

        如果不保存用户登录状态也就意味着用户每次访问网站都需要重复的输入用户名和密码

        这对用户来说体验极差

解决方法:

        当用户第一次登录成功之后将用户的用户名和密码返回给浏览器,让用户浏览器保存在本地

        之后访问网站的时候浏览器自动将保存在本地的用户名和密码发送给服务端,服务端获取之后自动验证,但是具有极大的安全隐患

优化:

        当用户登录成功之后,服务端产生一个随机字符串(在服务端保存数据,用K:V键值对的形式),交由客户端浏览器保存

        之后访问服务端时都带着随机字符串,服务端去数据库中比对是否有匹配到的随机字符串,从而获得用户信息

        但是如果截取到当前随机字符串,那么就可以冒充当前用户,其实还是有极大的安全隐患

        在web领域没有绝对的安全和绝对的不安全

1.Cookie

  • 服务器保存在客户端浏览器上的信息都可以称之为cookie
  • 它的表现形式一般都是K:V键值对(可以有多个)

2.Session

  • 保存在服务器上的信息都可以称之为session
  • 它的表现形式一般都是K:V键值对(可以有多个)

3.token

  • session虽然数据是保存在服务端的,但是挡不住数据量大
  • 解决办法:服务端不再保存数据
    • 登录成功之后将一段信息加密处理(用自己独特的加密方式进行加密)
  • 将加密之后的结果拼接在信息后面,整体返回给浏览器保存
  • 浏览器下次访问的时候带着该信息,服务端自动切取前面的一段信息再次使用自己的加密算法进行加密
  • 然后用这段密文与携带过来的密文进行比对

4.总结

  • cookie就是保存在客户端浏览器上的信息
  • session就算保存在服务端上的信息
  • session是基于cookie工作的(其实大部分的保存用户状态的操作都需要使用cookie)

三.Django操作Cookie

虽然Cookie是服务端告诉客户端浏览器需要保存内容,但是客户端浏览器可以选择拒绝保存,如果禁止自动保存Cookie那么只要是需要登录的网站都没办法正常登录了

  • 视图函数的返回值
return HttpResponse()
return render()
return redirect()
  • 变形
obj = HttpResponse()
return objobj1 = render()
return obj1obj2 = redirect()
return obj2

如果想要操作Cookie,必须进行以上变形才可以

1.设置Cookie

obj = HttpResponse()
obj.set_cookie(key,value)
return obj

2.获取Cookie

request.COOKIES.get(key)

3.设置超时时间

obj = HttpResponse()
obj.set_cookie(key,value,max_age=5)
# 设置超时时间 5s 到期
return obj
  • max_age
    • 设置超时时间,以秒为单位
  • expiress
    • 设置超时时间,针对IE浏览器使用,以秒为单位

4.注销Cookie

obj = HttpResponse()
# 设置超时时间 5s 到期
obj.delete_cookie(key)
return obj

5.登录功能实现

(1.0)简单实现

  • 路由
urlpatterns = [path('admin/', admin.site.urls),path('login/', views.login),path('home/', views.home),
]
  •  视图
def login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')if username == "dream" and password == "521":# 登陆成功之后,跳转到登陆成功之后才能看到的页面return redirect('/home/')return render(request, 'login.html')def home(request):return HttpResponse("登陆成功!")
  • 前端
<form action="" method="post"><p>username:<input type="text" name="username" class="form-control"></p><p>password:<input type="password" name="password" class="form-control"></p><input type="submit" class="btn btn-success">
</form>

问题:登录成功之后的跳转页面,不需要登录也可以直接访问到,只需要给对应的地址即可

(2.0)解决登录问题

from django.shortcuts import render, HttpResponse, redirect# Create your views here.
def login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')if username == "dream" and password == "521":# 登陆成功之后,保存用户登陆状态obj = redirect('/home/')# 让浏览器记录cookieobj.set_cookie("sign", "1314521")'''浏览器不单单只是帮我们保存cookie而且在后面每次访问的时候都会带着cookie'''# 登陆成功之后,跳转到登陆成功之后才能看到的页面return objreturn render(request, 'login.html')def home(request):# 读取携带的cookie,cookie正确登陆成功if request.COOKIES.get("sign") == "1314521":return HttpResponse("登陆成功!")# 读取携带的cookie,cookie不正确跳转到登陆页面return redirect('/login/')

(3.0)迭代-登录认证装饰器

用户如果没有登录的情况下想访问一个需要登录的页面,那么先跳转到登录页面,当用户输入正确的用户名和密码之后再跳转到用户之前想访问的页面去,而不是直接写死

from django.shortcuts import render, HttpResponse, redirect# Create your views here.
def login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')if username == "dream" and password == "521":# 获取用户上一次想要访问的url# 结果可能为空 -- 直接访问logintag_url = request.GET.get('tag_url')if tag_url:obj = redirect(tag_url)else:# 登陆成功之后,保存用户登陆状态obj = redirect('/home/')# 让浏览器记录cookieobj.set_cookie("sign", "1314521")'''浏览器不单单只是帮我们保存cookie而且在后面每次访问的时候都会带着cookie'''# 登陆成功之后,跳转到登陆成功之后才能看到的页面return objreturn render(request, 'login.html')# 校验用户登录状态的装饰器
def auth_check(func):def inner(request, *args, **kwargs):# 获取到用户上一次想要访问的urltag_url = request.get_full_path()# 读取携带的cookie,cookie正确登陆成功if request.COOKIES.get("sign") == "1314521":res = func(request, *args, **kwargs)return reselse:# 读取携带的cookie,cookie不正确跳转到登陆页面return redirect(f'/login/?next={tag_url}')return inner@auth_check
def home(request):return HttpResponse("home登陆成功!")@auth_check
def index(request):return HttpResponse("index登陆成功!")@auth_check
def func(request):return HttpResponse("func登陆成功!")

四.Django操作Session

Session数据是保存在服务端的,给客户端返回的是一个随机字符串

1.设置Session

request.session['key'] = value

2.获取Session

request.session.get('key')

3.设置/获取Session多个值

  • 给session设置多个值的时候存在数据库中的数据仍是一条
  • 但是在取session的时候,可以通过request.session对象获取到设置的多组键值对

4.django_session表中的session数据

  • django_session表中的数据条取决于浏览器
    • 同一个计算器(IP地址)上同一个浏览器只会有一条数据失效
    • 同一个计算器(IP地址)上多个浏览器会有多个数据生效
    • 当session过期的时候可能会出现多条数据对应一个浏览器
      • 但是这些数据不会持久化存储,会被定时清理掉,可以手动清除也可以代码清除
  • 目的是为了节省服务器数据库资源

5.设置过期时间

# 设置session
request.session['key'] = value
# 设置过期时间
request.session.set_expiry()
  • 参数
    • 整数
      • 多少秒过期
    • 日期对象
      • 到指定日期失效
    • 0
      • 一旦退出当前浏览器窗口就失效
    • 不写
      • 失效时间取决于Django内部全局session失效的时间

6.清空session

(1)request.session.delete():

只删除服务端的


该方法用于删除当前用户的Session数据,但是会保留Session的Key,这意味着Session对象本身仍然存在,但其中的数据将被清空,下次访问时,如果Session没有被重新填充则会得到一个空的Session对象

def clear_session(request):request.session.delete()# 其他操作或返回响应

​​​​​​​(2)request.session.flush():

服务端和客户端都删除


该方法用于完全删除当前用户的Session,包括Session对象的所有相关数据,下次访问时将创建一个新的空Session对象

def clear_session(request):request.session.flush()# 其他操作或返回响应

7.保存

1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)2. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎其他公用设置项:
SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)

原理剖析

  • *request*.session['sign'] = '369'内部发生了哪些事
    • Django内部会自动帮我们生成一个随机字符串
    • Django自动将随机字符串和对应的数据存储到django_session表中
      • 先在内存中产生操作数据的内存
      • 在响应经过Django中间件的时候才去操作数据库
    • 将产生的随机字符串返回给客户端浏览器保存
  • request.session.get('sign')内部发生了哪些事
    • 自动从浏览器中获取sessionid对应的随机字符串
    • 根据该随机字符串去django_session表中查找对应的数据
      • 如果匹配成功,则将对应的数据取出并以字典的形式封装到request.session中
      • 如果匹配不成功,则request.session中的数据为None

案例演示

(1.0)简单的
  • 路由
# session操作
path('set_session/', views.set_session),
  • 视图
def set_session(request):request.session['sign'] = "369"return HttpResponse("返回消息")
  • 会报错
OperationalError at /set_session/
no such table: django_session
  • 数据是保存在服务端的
    • 在默认情况下操作session的时候需要Django默认的一张django_session表
  • 数据库迁移命令时
    • Django会默认创建很多表,其中就有Django_session表
  • Django默认session的过期时间是14天
    • 但是我们可以人为的修改过期时间
(2.0)解决方法
  • 先进行数据库迁移命令
    • 再进行访问
    • session会自动保存到django_session表中
(3.0)优化
  • 路由
# session操作
path('set_session/', views.set_session),
path('get_session/', views.get_session),
  • 视图
def set_session(request):request.session['sign'] = "369"return HttpResponse("返回消息")def get_session(request):request.session.get("sign")return HttpResponse("拿取成功消息")

相关文章:

Cookie与Session知识

目录 一.Cookie与Session的发展史 1.Cookie的发展史 2.Session的发展史 3.Cookie和Session的关系 4.总结 二.Cookie与Session详解 1.Cookie 2.Session 3.token 4.总结 三.Django操作Cookie 1.设置Cookie 2.获取Cookie 3.设置超时时间 4.注销Cookie 5.登录功能实…...

Vue批量全局处理undefined和null转为““ 空字符串

我们在处理后台返回的信息&#xff0c;有的时候返回的是undefined或者null&#xff0c;这种字符串容易引起用户的误解&#xff0c;所以需要我们把这些字符串处理一下。 如果每个页面都单独处理&#xff0c;那么页面会很冗余&#xff0c;并且后期如果有修改容易遗漏&#xff0c…...

【2023年APMCM亚太杯C题】完整数据与解题思路

2023年亚太杯C题 数据下载与搜集重点数据其余数据第一问第二问第三问第四问第五问第六问 数据与思路获取 数据下载与搜集 该题并没有提供数据集&#xff0c;对所需数据进行收集整理是对题目进行求解的基础。在本题中&#xff0c;主要需要以下数据&#xff1a;新能源汽车历史销…...

嵌入式单片机方向和Linux驱动开发方向哪个发展前景好?

嵌入式单片机方向和Linux驱动开发方向哪个发展前景好&#xff1f; 在某些平台上看到很多人鼓吹嵌入式Linux开发比单片机开发要好&#xff0c;让所有人都去做嵌入式Linux开发。说这种话的人大多数是嵌入式Linux的培训机构&#xff0c;或者是一开始就以嵌入式Linux入门的那一批人…...

如何搭建Zblog网站并通过内网穿透将个人博客发布到公网

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…...

2:kotlin集合(Collections)

集合有助于数据分组&#xff0c;方便后续操作 集合类型说明Lists有序的可重复的集合Sets无序的不可重复的集合Maps键值对映射集合&#xff0c;键唯一&#xff0c;且一个键只能映射到一个值 每个集合类型都可以是可变的或者只读的 List List按照添加的顺序存储内容&#xff…...

小诺2.0开源版工程启动

小诺是一款开源的前后端开发框架&#xff0c;同若依、SpringBladex一样可作为私活、外包脚手架。 开源地址&#xff1a;Snowy: 最新&#xff1a;&#x1f496;国内首个国密前后分离快速开发平台&#x1f496;&#xff0c;采用Vue3AntDesignVue3 ViteSpringBootMpHuToolSaToke…...

idea手动导入maven包

当maven仓库中没有包时&#xff0c;我们需要手动导入jar到maven项目中 1.这里的maven设置成你自己安装的maven 2.查看pom.xml文件中maven&#xff0c;以下面为例 <dependency><groupId>com.jdd.pay</groupId><artifactId>mapi-sdk-v3</artifactId&…...

2、单片机及开发板介绍

单片机介绍 单片机&#xff0c;英文Micro Controller Unit,简称&#xff1a;MCU 内部集成&#xff1a;CPU、RAM(随机存储器)、ROM&#xff08;只读存储器&#xff09;、定时器、中断系统、通讯接口等 作用&#xff1a;信息采集&#xff08;传感器&#xff09;、处理&#xff0…...

Leetcode 第 372 场周赛题解

Leetcode 第 372 场周赛题解 Leetcode 第 372 场周赛题解题目1&#xff1a;2937. 使三个字符串相等思路代码复杂度分析 题目2&#xff1a;2938. 区分黑球与白球思路代码复杂度分析 题目3&#xff1a;2939. 最大异或乘积思路代码复杂度分析 题目4&#xff1a;2940. 找到 Alice 和…...

mysql查询统计最近12个月的数据

项目场景&#xff1a; mysql查询统计最近12个月的数据&#xff0c;按每个月纵向展示&#xff0c;效果图 sql语句 注意&#xff1a;count( v.uuid ) 这里的是被统计那张表的id SELECT m.month,count( v.uuid ) AS total FROM (SELECT DATE_FORMAT(( CURDATE()), %Y-%m ) AS mon…...

14.Python 模块

目录 1. 使用模块2. 使用包3. 常用模块3.1 日期和时间3.2 伪随机数3.3 摘要算法3.4 JSON 处理3.5 图像处理 模块是Python用来组织代码的一种方法&#xff0c;包是Python用来组织模块的一种方法。 常用基本语法如下&#xff1a; Windows 按住winR 输入 cmd&#xff0c;Mac 打开…...

三十分钟学会Linux的基本操作

GNU/Linux GNU项目是由Richard Stallman发起的自由软件运动&#xff0c;旨在创建一个完全自由的操作系统。虽然GNU项目已经开发了大量的系统组件和工具&#xff0c;但它一直缺少一个完整的操作系统内核。在这时Linus Torvalds开发了Linux内核&#xff0c;并将其发布为自由软件…...

1688商品详情数据接口(1688.item_get)

1688商品详情数据接口是一种程序化的接口&#xff0c;通过这个接口&#xff0c;商家或开发者可以使用自己的编程技能&#xff0c;对1688平台上的商品信息进行查询、获取和更新。这个接口允许商家根据自身的需求&#xff0c;获取商品的详细信息&#xff0c;例如价格、库存、描述…...

SA实战 ·《SpringCloud Alibaba实战》第14章-服务网关加餐:SpringCloud Gateway核心技术

大家好,我是冰河~~ 一不小心《SpringCloud Alibaba实战》专栏都更新到第14章了,再不上车就跟不上了,小伙伴们快跟上啊! 在《SpringCloud Alibaba实战》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基…...

设计师不能忽视的几个宝藏图标设计工具

在这个快速变化的时代&#xff0c;设计师对创新和实用工具的需求越来越大。这就要求我们及时跟上潮流&#xff0c;不断探索和尝试最新、最有价值的图标设计工具。只有这样&#xff0c;我们才能在竞争激烈的设计市场中脱颖而出。以下是我们精心挑选的2024年值得一试的图标设计工…...

设计模式-行为型模式-模板方法模式

一、什么是模板模式 模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一个算法骨架&#xff0c;允许子类在不改变算法整体结构的情况下重新定义算法的某些步骤。 主要组成部分&#xff1a; 1、模板方法&#xff08;Templ…...

露营管理系统预约小程序效果如何

旅游经济已经复苏&#xff0c;并且市场规模增速加快&#xff0c;近一年来远途/周边游客户增多&#xff0c;不少旅游景区在节假日常常面对客流爆满现象。同时露营作为近几年突然火热的项目&#xff0c;其需求也是日渐上升。 然而在高需求的同时&#xff0c;我们也看到露营经营痛…...

【产品安全平台】上海道宁与Cybellum将整个产品安全工作流程整合到一个专用平台中,保持构建的互联产品的网络安全和网络合规性

Cybellum将 整个产品安全工作流程 整合到一个专用平台中 使设备制造商能够 保持他们构建的互联产品的 网络安全和网络合规性 产品安全性对 每个人来说都不一样 每个行业的系统、工作流程和 法规都存在根本差异 因此&#xff0c;Cybellum量身定制了 Cybellum的平台和技…...

css 实现鼠标上移添加下划线

效果图 实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wi…...

线上知识竞赛策划指南:如何让活动更有趣吸引人

&#x1f4a1; 线上知识竞赛策划指南&#xff1a;如何让活动更有趣吸引人创意为核 互动为翼 让知识“活”起来&#x1f4cc; 一、打破常规&#xff1a;从主题与形式入手一场成功的线上知识竞赛&#xff0c;始于一个引人入胜的主题。不要局限于“百科全说”&#xff0c;可以尝…...

Flowable 流程审计与排查:如何通过历史任务查询快速定位线上问题

Flowable 流程审计与排查&#xff1a;如何通过历史任务查询快速定位线上问题 当生产环境的审批流程突然停滞&#xff0c;或是某个关键业务环节出现异常时&#xff0c;运维团队往往面临巨大压力。上周我们遇到一个典型案例&#xff1a;某金融产品的开户流程在夜间批量处理时&…...

MacOS上使用CoreBluetooth框架的BLE适配器选择指南

引言 在物联网(IoT)应用开发中,蓝牙低功耗(BLE)技术是非常常见的一种无线通信方式。开发者常常需要使用BLE中央设备(如Mac)来扫描、连接并与BLE外设进行数据交换。然而,如何在MacOS上选择特定的BLE适配器(例如外部USB BLE适配器)并不是一件显而易见的事。本文将探讨如何在Ma…...

ARM PMU性能监控单元架构与RLU/RLH机制解析

1. ARM PMU性能监控单元架构解析性能监控单元(Performance Monitoring Unit, PMU)是现代处理器架构中用于硬件性能分析和事件监控的关键组件。在ARM架构中&#xff0c;PMUv3作为第三代性能监控架构&#xff0c;提供了强大的性能计数和事件采样能力。与传统的软件性能分析工具相…...

【仅限首批PHP贡献者内部文档】:PHP 8.9命名空间隔离的5个未写入手册的底层约束(含ZTS线程安全临界阈值)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;PHP 8.9命名空间隔离的架构演进与设计动机 PHP 8.9 并非官方已发布的版本&#xff08;截至 2024 年&#xff0c;PHP 最新稳定版为 8.3&#xff09;&#xff0c;但作为构想中的前瞻性演进分支&#xff0…...

wireshark学习-ARP

ARP用于问对方的ip地址ping一下&#xff0c;抓包一下字面意思&#xff0c;谁是1.2这个地址&#xff1f;给我回复一下mac&#xff0c;我是1.11.2的地址在我这&#xff0c;我的mac地址是...言简意赅ping完了之后会建立一个缓存表&#xff0c;暂时保存ip地址与mac的映射关系&#…...

ARM架构FAR寄存器解析:异常处理与虚拟化关键机制

1. ARM架构异常处理机制概述在ARMv8/ARMv9架构中&#xff0c;异常处理机制是系统可靠性和安全性的基石。当处理器执行过程中遇到无法继续正常执行的状况时&#xff08;如非法内存访问、未对齐访问、指令执行错误等&#xff09;&#xff0c;会触发异常并跳转到预先定义的异常处理…...

2026最权威的六大AI写作网站解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 当下各类AI写作工具不断涌现&#xff0c;然而多数都得付费订阅。本文着重关注真正能够免费使…...

抖音无水印下载终极指南:3分钟搞定批量下载,免费获取高清资源

抖音无水印下载终极指南&#xff1a;3分钟搞定批量下载&#xff0c;免费获取高清资源 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and brow…...

python pyright

从Python开发者的角度看Pyright&#xff1a;一个被低估的类型检查工具 做Python开发这些年&#xff0c;类型检查这事儿一直挺有意思。早期大家觉得动态类型是Python的“优势”&#xff0c;后来随着代码规模增长&#xff0c;越来越多的人开始拥抱类型注解。而说到类型检查工具&a…...