2024--Django平台开发-Django知识点(五)

day05 django知识点

今日概要:

  • 中间件 【使用】【源码】
  • cookie 【使用】【源码 - Django底层请求本质】
  • session【使用】【源码 - 数据库+请求周期+中间件】

1.中间件

1.1 使用

  • 编写类,在类型定义:process_request、process_view、process_response
  • 中间件注册,在settings中的配置。

1.1.1 正常

在这里插入图片描述

1.编写类

可以写在任意的目录:自定义的类、继承一个类**(推荐)**

from django.utils.deprecation import MiddlewareMixinclass KeLaMiddleware(MiddlewareMixin):def process_request(self, request):# request是请求相关所有的数据passdef process_view(self, request, view, *args, **kwargs):# request是请求相关所有的数据; view是试图函数; 路由参数*args, **kwargspassdef process_response(self, request, response):# request是请求相关所有的数据# response是试图函数返回的那个对象(封装了要返回到用户浏览器的所有数据)return response
2.注册
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',"utils.md.KeLaMiddleware"
]
# 动态导入 + 反射
3.测试
from django.utils.deprecation import MiddlewareMixinclass KeLaMiddleware(MiddlewareMixin):def process_request(self, request):print("KeLa.process_request")def process_view(self, request, view, *args, **kwargs):print("KeLa.process_view",view, *args, **kwargs)def process_response(self, request, response):print("KeLa.process_response")return response
from django.contrib import admin
from django.urls import path
from django.shortcuts import HttpResponsedef x1(request):print("视图.x1")return HttpResponse("x1")def x2(request, v1):print("视图.x2", v1)return HttpResponse("x2")urlpatterns = [path('admin/', admin.site.urls),path('x1/', x1),path('x2/<int:v1>/', x2),
]
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',"utils.md.KeLaMiddleware"
]
4.问题
  • 中间件的功能好像有点像装饰器【底层源码闭包】

  • 基于中间件可以做什么?

    • 根据请求周期,对 request 进行赋值,后续方便进行调用。

    • 根据请求周期,对业务逻辑代码进行自定义,决定是否可以继续向后

      • return None,继续向后走

      • return HttpResponse对象

        return HttpResponse("...")
        return render("...")        ->   HttpResponse("...")
        return JsonReponse("...")   ->   HttpResponse("...")
        
    • 根据请求周期,对返回给用户浏览器的数据进行自定义:删除内容、增加、cookie、响应头…

  • 这个中间件和nginx apache这样的中间件概念一样吗?比如做前置代理,做https

    Django中间件  /  拦截器  / RequestHanler
    
  • 中间件可以跨语言调用吗?比如别人不是用python 写的,但是可以给我们的django 项目用?

    Django中间件...
    架构中间件:Django + redis(C语言)
    
  • 中间件只要两层,不要中间那个process.riew行不行,是不是有些特定场合需要返回最后一层

    ...
    
  • 那Django内置的中间件完成了些什么功能?

    ...
    

1.1.2 “不正常”

在这里插入图片描述

如果用户向我的网站请求时,如果访问URL:

  • /x1/
  • /x2/
  • /x3/ ,比如携带凭证token,有凭证继续,无凭证返回无权访问。
http://127.0.0.1:8000/x2/12/
http://127.0.0.1:8000/x2/12/?xxx=123http://127.0.0.1:8000/x3/?token=12938791923981723123
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponseclass KeLaMiddleware(MiddlewareMixin):def process_request(self, request):# request.path_info# print(request.path_info,"KeLa.process_request")if request.path_info == "/x3/":token = request.GET.get('token')if token == "12938791923981723123":returnelse:return HttpResponse("无权访问")

如果用户向我的网站请求时,如果访问URL:

  • /x1/

  • /x2/ ,比如携带凭证token,有凭证继续,无凭证返回无权访问。

    x2/<int:v1>/', x2http://127.0.0.1:8000/x1/10/
    http://127.0.0.1:8000/x1/20/
    http://127.0.0.1:8000/x1/11/
    
  • /x3/

class KeLaMiddleware(MiddlewareMixin):def process_request(self, request):# request.path_info# print(request.path_info,"KeLa.process_request")# 以x2开头 或 正则   /x2/1111/   /x2/10/# if request.path_info == "/x2/":if request.path_info.startswith("/x2/"):token = request.GET.get('token')if token == "12938791923981723123":returnelse:return HttpResponse("无权访问")
class KeLaMiddleware(MiddlewareMixin):def process_view(self, request, view, *args, **kwargs):# request.path_info# print(request.path_info,"KeLa.process_request")url_name = request.resolver_match.url_nameif url_name == "x2":token = request.GET.get('token')if token == "12938791923981723123":returnelse:return HttpResponse("无权访问")

关于自定义prcess_response,一般用于对请求要返回的数据进行修改。

class KeLaMiddleware(MiddlewareMixin):def process_response(self, request, response):response["xx"] = "wupeiqi"return response

答疑

  • Settings 里面的中间件有多个组件,那运行项目时的执行顺序是怎样的?是执行完这些中间件再执行路由匹配吗?后面写的中间件是不是要对前面的中间件功能非常清楚才行、避免可能功能覆盖带来bug?
  • 這邊定義的響應頭在用戶下一次訪問的時候會帶上麽
  • js可以读到content的内容吗
  • 刚才讲的这个response返回值的修改,增加了一个“xx”=“yiyebaitou”,这种操作应该也可以增加的request请求头里面吧,那request增加的,是不是就和爬虫里面的某些js逆向参数,就是从这里来的?

1.2 使用(几乎不用)

  • 编写类,在类型定义:process_request、process_view、process_response、process_exception、process_template_response

    process_exception,视图函数有异常,处理出现异常时
    process_template_response,对于视图函数返回内容渲染扩展。- 在视图函数中如果返回的对象内部有一个render方法且可以被调用执行- process_template_response返回response参数(返回值)- 在自定义的MyReponse的render方法中必须返回HttpRespose
    
  • 中间件注册,在settings中的配置。

class KeLaMiddleware(MiddlewareMixin):def process_exception(self, request, exception):print(request)print(exception, type(exception))return HttpResponse("错误了")
def x1(request):print("视图.x1")return HttpResponse("x1")
class MyHttpResponse:def __init__(self, body):self.body = bodydef render(self):return HttpResponse(self.body)  # 真正的返回def x1(request):print("视图.x1")return MyHttpResponse("x1")
class KeLaMiddleware(MiddlewareMixin):def process_template_response(self, request, response):return response

def x1(request):print("视图.x1")return HttpResponse("源代码-x1")def x2(request, v1):return HttpResponse("源代码-x2")def x3(request):return HttpResponse("源代码-x3")

class MyHttpResponse:def __init__(self, body):self.body = bodydef render(self):return HttpResponse(self.body)def x1(request):print("视图.x1")return MyHttpResponse("x1")def x2(request, v1):return MyHttpResponse("x2")def x3(request):return MyHttpResponse("x3")
class KeLaMiddleware(MiddlewareMixin):def process_template_response(self, request, response):response.body = f"源代码-{response.body}"return response

1.3 源码

1.关于请求

在这里插入图片描述

from wsgiref.simple_server import make_serverdef run_server(environ, start_response):# 只要请求到来,就会走这里的代码# 1.根据请求 environ 进行后续业务处理# 2.返回内容。。。start_response('200 OK', [('Content-Type', 'text/html')])return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ]if __name__ == '__main__':httpd = make_server('127.0.0.1', 8000, run_server)  # # 有请求到来时,执行  obj(environ, start_response)httpd.serve_forever()
from wsgiref.simple_server import make_serverclass Handler:def __init__(self):# 做一些初始化动作self.name = "wupeiqi"def __call__(self,environ, start_response):# 根据初始化的动作,去执行...# ...start_response('200 OK', [('Content-Type', 'text/html')])return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ]if __name__ == '__main__':obj = Handler() # 执行 httpd = make_server('127.0.0.1', 8000, obj)  # 有请求到来时,执行 obj(environ, start_response)httpd.serve_forever()

在这里插入图片描述

2.启动Django项目WSGIHandler.__init__

在这里插入图片描述

在这里插入图片描述

3.请求到来WSGIHandler.__call__

流程:中间件的执行、路由匹配、视图函数的执行。

小结

  • 1.7.x源码,底层实现,是基于好几个列表。

  • 4.x源码,

    函数的作用域 + 闭包 + 装饰器
    面向对象 + __call__方法
    
    # 核心
    # handler = SecurityMiddleware对象
    #             __call__
    #                process_request
    #                get_reponse = SessionMiddleware对象
    #                process_response 
    #                              __call__
    #                                   process_request 
    #                                   get_reponse = CommonMiddleware对象
    #                                   process_response
    #                                                 __call__
    #                                                     process_request
    #                                                     get_reponse = KeLaMiddleware对象
    #                                                     process_response
    

答疑

  • 没悟透,不需要吾、只需要懂【不需要背+建立】
  • 有些难
    • 入门,听懂+能用(全家桶)
    • 文档,用法没有源码。
    • 源码,到底是怎么实现的功能(不修改、扩展)【*】
  • 感觉听懂了,但又不清楚,这是不是学源码的正常情况,看B站视频写程序都很简单,也容易懂
  • 课下还是得自己分析分析,一定会忘记

2.Cookie

本质上:保存在用户浏览器上键值对。

在这里插入图片描述

2.1 使用

from django.urls import path
from django.shortcuts import HttpResponsedef x1(request):# 包含:响应体、响应头、状态码等信息obj = HttpResponse("x1", status=201, reason="OK")# 设置响应头obj['name'] = "wupeiqi"# 设置cookie# import datetime# ctime = datetime.datetime.now() + datetime.timedelta(seconds=10)obj.set_cookie("v3", "root", max_age=10, path="/")obj.set_cookie("v2", "hello")obj.set_signed_cookie("info", "xiaoguang")  # 签名return objdef x2(request):print(request.COOKIES)xx = request.get_signed_cookie("info")  # 用户不能自己修改cookie的内容print(xx)# print(request.COOKIES.get('v1'))# print(request.COOKIES.get('v2'))return HttpResponse("x2")urlpatterns = [path('x1/', x1, name='x1'),path('x2/', x2, name='x2'),
]

2.2 源码

  • HttpResponse,包裹

    # 包含:响应体、响应头、状态码等信息
    obj = HttpResponse("x1", status=201, reason="OK")# 设置响应头
    obj['name'] = "yiyebaitou"# 设置cookie
    # import datetime
    # ctime = datetime.datetime.now() + datetime.timedelta(seconds=10)obj.set_cookie("v3", "root", max_age=10, path="/")
    obj.set_cookie("v2", "hello")obj.set_signed_cookie("info", "xiaoguang")  # 签名
    return obj
    
  • WSGIRequest

    class WSGIHandler(base.BaseHandler):request_class = WSGIRequestdef __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.load_middleware()def __call__(self, environ, start_response):set_script_prefix(get_script_name(environ))signals.request_started.send(sender=self.__class__, environ=environ)request = self.request_class(environ)
    
    class HttpRequest:def get_signed_cookie(self, key, default=RAISE_ERROR, salt="", max_age=None):cookie_value = self.COOKIES[key]value = signing.get_cookie_signer(salt=key + salt).unsign(cookie_value, max_age=max_age)return valueclass WSGIRequest(HttpRequest):def __init__(self, environ):self.environ = environ...@cached_propertydef COOKIES(self):raw_cookie = get_str_from_wsgi(self.environ, "HTTP_COOKIE", "")return parse_cookie(raw_cookie)
    

3.Session

Session的使用一般依赖于Cookie,将一些数据不再发送值浏览器,而是保存的后端的服务器上。

在这里插入图片描述

3.1 使用

  • Session到底要存储到哪里?默认数据库。

    INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes',# 'django.contrib.sessions',     # sessions功能的APP    django_session'django.contrib.messages','django.contrib.staticfiles',
    ]
    
    MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware', # process_request/process_response'django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',# "utils.md.KeLaMiddleware",
    ]
    
    ############
    # SESSIONS #
    ############
    # Session存储在哪里?
    SESSION_ENGINE = "django.contrib.sessions.backends.db"# 如果存储到文件中,文件的路径。
    SESSION_ENGINE = "django.contrib.sessions.backends.file"
    SESSION_FILE_PATH = None# 存储到缓存
    SESSION_ENGINE = "django.contrib.sessions.backends.cache"
    SESSION_CACHE_ALIAS = "default"# 存储到缓存 + 数据库
    SESSION_ENGINE = "django.contrib.sessions.backends.cache_db"
    SESSION_CACHE_ALIAS = "default"# 存储到cookie
    SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"# class to serialize session data
    SESSION_SERIALIZER = "django.contrib.sessions.serializers.JSONSerializer"# -------------------------------
    # Cookie name. This can be whatever you want.
    SESSION_COOKIE_NAME = "sessionid"
    # Age of cookie, in seconds (default: 2 weeks).
    SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
    # A string like "example.com", or None for standard domain cookie.
    SESSION_COOKIE_DOMAIN = None
    # Whether the session cookie should be secure (https:// only).
    SESSION_COOKIE_SECURE = False
    # The path of the session cookie.
    SESSION_COOKIE_PATH = "/"
    # Whether to use the HttpOnly flag.
    SESSION_COOKIE_HTTPONLY = True
    # Whether to set the flag restricting cookie leaks on cross-site requests.
    # This can be 'Lax', 'Strict', 'None', or False to disable the flag.
    SESSION_COOKIE_SAMESITE = "Lax"
    # Whether to save the session data on every request.
    SESSION_SAVE_EVERY_REQUEST = False
    # Whether a user's session cookie expires when the web browser is closed.
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False
    

    注意:如果是非数据库,可以主调用app的注册代码部分。

  • 请求=登录,生成Session、Cookie。

  • 再次请求,默认携带cookie,根据Cookie中的凭证,去找到Session中原本存储的数据。

    request.session['id'] = 999
    request.session['id'] = 88
    request.session.get("id")# del request.session['id']
    # request.session.clear()
    
    from django.urls import path
    from django.shortcuts import HttpResponsedef x1(request):request.session['id'] = 999request.session['name'] = 'wupeiqi'request.session['age'] = '25'return HttpResponse("x1")def x2(request):print(request.session.get("id"))print(request.session.get("name"))print(request.session.get("age"))return HttpResponse("x2")urlpatterns = [path('x1/', x1, name='x1'),path('x2/', x2, name='x2'),
    ]
    

3.2 源码

1.引擎配置

  • 数据库引擎

    SESSION_ENGINE = "django.contrib.sessions.backends.db"
    
    INSTALLED_APPS = ['django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',
    ]
    
    >>>python manage.py makemigrations
    >>>python manage.py migrate
    
  • 文件

    # 如果存储到文件中,文件的路径。
    SESSION_ENGINE = "django.contrib.sessions.backends.file"
    SESSION_FILE_PATH = None
    
    INSTALLED_APPS = [#'django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',
    ]
    

2.中间件

MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware',  # 必须设置'django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware',...
]
2.1 创建对象

在启动django程序时,会自动创建 SessionMiddlewared对象。

class MiddlewareMixin:def __init__(self, get_response):self.get_response = get_responseclass SessionMiddleware(MiddlewareMixin):def __init__(self, get_response):super().__init__(get_response)# "django.contrib.sessions.backends.db"   "django.contrib.sessions.backends.file"engine = import_module(settings.SESSION_ENGINE)# db.SessionStore    file.SessionStoreself.SessionStore = engine.SessionStore
2.2 请求到来 *
def process_request(self, request):# 1.去Cookie中读取凭证 mid="123123123123"session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME)# 2.实例化request.session = self.SessionStore(session_key)
def x1(request):# request.session -> file.SessionStore() / request.session['id'] = 999request.session['name'] = 'wupeiqi'    类中的__setitem__request.session['age'] = '25'return HttpResponse("x1")
2.3 请求结束 *
...

总结

  • 使用角度:
    • 中间件
    • Cookie
    • Session:Cookie + 中间件
  • 源码流程:
    • 中间件、cookie、session

答疑

  • 老师,cookie过期时间设置以后,请求的时候是在哪块判断的cookie是否过期

    data = request.COOKIES.get("v1")# 过期或未设置
    
  • 老师 那session以文件方式存储,那每次运行都会覆盖上一次的吗

    • 覆盖
    • 是否变更
  • 每个浏览器应该是不同的文件吧

  • 有个基础知识问题:response.Item这里的干什么的?

  • 一个用户ID 是不是只会 对应一个 session,比如更换浏览器访问,后台就会被变更了 对吧

    A浏览器
    B浏览器
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/235140.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity Editor实用功能:Hierarchy面板的对象上绘制按按钮并响应

目录 需求描述上代码打个赏吧 需求描述 现在有这样一个需求&#xff1a; 在Hierarchy面板的对象上绘制按钮点击按钮&#xff0c;弹出菜单再点击菜单项目响应自定义操作在这里的响应主要是复制对象层级路路径 看具体效果请看动图&#xff1a; 注&#xff1a; 核心是对Edito…

控制el-table的列显示隐藏

控制el-table的列显示隐藏&#xff0c;一般的话可以通过循环来实现&#xff0c;但是假如业务及页面比较复杂的话&#xff0c;list数组循环并不好用。 在我们的页面中el-table-column是固定的&#xff0c;因为现在是对现有的进行维护和迭代更新。 对需要控制列显示隐藏的页面进…

【EI会议征稿通知】第三届仿真设计与计算建模国际学术会议(SDCM 2024)

The 3rd International Conference on Simulation Design and Computational Modeling 第三届仿真设计与计算建模国际学术会议&#xff08;SDCM 2024&#xff09; 第三届仿真设计与计算建模国际会议&#xff08;SDCM 2024&#xff09;将于 4 月 26-28 日在中国重庆召开。第二届…

【博士每天一篇文-算法】Graph Structure of Neural Networks

阅读时间&#xff1a;2023-11-12 1 介绍 年份&#xff1a;2020 作者&#xff1a;尤家轩 斯坦福大学 期刊&#xff1a; International Conference on Machine Learning. 引用量&#xff1a;130 论文探讨了神经网络的图结构与其预测性能之间的关系。作者提出了一种新的基于图的…

【leetcode】力扣算法之旋转图像【难度中等】

题目描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 用例 输入&#xff1a; matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&…

java 体育明星管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web 体育明星管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysq…

2000-2022各省、地级市风险投资(VC)数据

2000-2022各省、地级市风险投资&#xff08;VC&#xff09;数据 1、时间&#xff1a;2000-2022年 2、范围&#xff1a;350个地级市&#xff0c;34省 3、指标&#xff1a;包含投资机构层面的风险投资原始数据&#xff0c;汇总到省市层面的结果数据&#xff0c;具体指标如下&a…

【Java集合篇】ConcurrentHashMap是如何保证fail- safe的

ConcurrentHashMap是如何保证fail-safe的 ✅典型解析✅拓展知识仓✅分段锁☑️分段锁适用于什么情况&#x1f7e1;分段锁的锁争用情况,是否会带来一定的性能影响✔️分段锁的优缺点&#x1f7e2; 还有哪些其他的线程安全哈希表实现&#x1f7e0;Hashtable和 Collections区别&am…

二叉树及其实现

二叉树 一.树的概念及结构1.1树的概念1.2相关概念 2.二叉树的概念及结构2.1 概念2.2 特殊的二叉树 3.二叉树的遍历3.1 前序、中序以及后序遍历3.2 层序遍历3.3 判断二叉树是否是完全二叉树3.4 二叉树的高度3.5 二叉树的叶子节点个数3.6 二叉树的第k层的节点个数3.7 二叉树销毁3…

Java面向对象综合练习(拼图小游戏),用java图形化界面实现拼图小游戏

1. 设计游戏的目的 锻炼逻辑思维能力利用Java的图形化界面&#xff0c;写一个项目&#xff0c;知道前面学习的知识点在实际开发中的应用场景 2. 游戏的最终效果呈现 Hello&#xff0c;各位同学大家好。今天&#xff0c;我们要写一个非常有意思的小游戏 —《拼图小游戏》 我们…

自行车商城网站网页设计与制作web前端设计html+css+js成品。电脑网站制作代开发。vscodeDrea

【自行车商城网站网页设计与制作web前端设计htmlcssjs成品。电脑网站制作代开发。vscodeDrea】 https://www.bilibili.com/video/BV1wT4y1p7jq/?share_sourcecopy_web&vd_sourced43766e8ddfffd1f1a1165a3e72d7605

您的计算机已被.LIVE勒索病毒感染?恢复您的数据的方法在这里!

引言&#xff1a; 在数字时代&#xff0c;.LIVE勒索病毒如暗夜中的黑暗调&#xff0c;威胁着个人和企业的数字安全。本文将深入介绍.LIVE勒索病毒的特征&#xff0c;提供解密数据的方法&#xff0c;并讨论预防措施&#xff0c;让我们共同筑起数字世界的防护之墙。数据的重要性…

太惨了,又一个程序员被渣的开年大瓜

今天闲暇之余浏览了一下mm&#xff0c;忽然看见一条瓜&#xff1a;某东pdf瓜&#xff0c;一份19页的PDF文件&#xff0c;题为《婚房变赠予&#xff0c;京东渣女出轨连环套设计冤大头程序员》&#xff0c;点进去看了一下&#xff0c;简直炸裂了三观&#xff0c;男同志们一定要保…

什么是预训练Pre-training—— AIGC必备知识点,您get了吗?

Look&#xff01;&#x1f440;我们的大模型商业化落地产品&#x1f4d6;更多AI资讯请&#x1f449;&#x1f3fe;关注Free三天集训营助教在线为您火热答疑&#x1f469;&#x1f3fc;‍&#x1f3eb; 随着人工智能(AI)不断重塑我们的世界&#xff0c;其发展的一个关键方面已经…

数据结构之单调栈、单调队列

今天学习了单调栈还有单调队列的概念和使用&#xff0c;接下来我将对其定义并配合几道习题进行讲解&#xff1a; 首先先来复习一下栈与队列&#xff1a; 然后我们来看一下单调栈的定义&#xff1a; 单调栈中的元素从栈底到栈顶的元素的大小是按照单调递增或者单调递减的关系进…

Javaweb之SpringBootWeb案例的详细解析

SpringBootWeb案例 前面我们已经讲解了Web前端开发的基础知识&#xff0c;也讲解了Web后端开发的基础(HTTP协议、请求响应)&#xff0c;并且也讲解了数据库MySQL&#xff0c;以及通过Mybatis框架如何来完成数据库的基本操作。 那接下来&#xff0c;我们就通过一个案例&#xf…

生信 R语言

11.芯片表达矩阵下游分析 ​rm(list ls())#清除所有变量 options(stringsAsFactors F) #BiocManager::install("CLL") suppressPackageStartupMessages(library(CLL)) data("sCLLex") sCLLex ## ExpressionSet (storageMode: lockedEnvironment) ## as…

centos下系统全局检测工具dstat使用

目录 一&#xff1a;没有需要安装 二&#xff1a;dstat命令参数 三、监测界面各参数含义&#xff08;部分&#xff09; 四、dstat的高级用法 一&#xff1a;没有需要安装 yum install dstat 二&#xff1a;dstat命令参数 有默认选项&#xff0c;执行dstat命令不加任何参数…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷②

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷2 目录 需要竞赛软件包环境以及备赛资源可私信博主&#xff01;&#xff01;&#xff01; 2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷2 模块一 …

Java中什么序列化?

在Java中&#xff0c;序列化是一种将对象转换为字节序列的机制&#xff0c;使得对象可以在网络上传输或存储到文件中&#xff0c;而后可以通过反序列化还原为对象。Java提供了java.io.Serializable接口&#xff0c;通过实现这个接口的类可以实现对象的序列化和反序列化。 序列…