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

Django 铺垫

【一】基础知识点

【1】web框架的本质

  • Web框架本质上可以看成是一个功能强大的socket服务端
  • 用户的浏览器可以看成是拥有可视化界面的socket客服端
  • 两种通过网络请求实现数据交互

【2】浏览器发送请求

(1)HTTP协议

  • HTTP协议是超文本传输协议,用于规定服务器和浏览器之间数据交互的格式。

(2)HTTP四大特性

  • 基于请求-响应模式:客户端发送请求,服务器返回响应。
  • 基于TCP/IP之上:作用于应用层之上的协议。
  • 无状态:HTTP协议本身不保存用户的信息,每个请求都是独立的。为了记录用户状态,出现了一些技术,如cookie、session和token。
  • 无/短链接:HTTP 1.0默认使用短链接,即请求-响应后立即断开连接。HTTP 1.1支持长链接,即双方建立连接后不会立即断开,如WebSocket。

(3)HTTP协议格式

  • 请求数据格式
    • 请求首行:标识HTTP协议和当前请求方式。
    • 请求头:多组键值对,包含请求的附加信息。
    • 空行:用于分隔请求头和请求体。
    • 请求体:并非所有请求都有,主要用于存放POST请求提交的敏感数据。
  • 响应数据格式
    • 响应首行:标识HTTP协议、当前请求方式和响应状态码。
    • 响应头:多组键值对,包含响应的附加信息。
    • 空行:用于分隔响应头和响应体。
    • 响应体:返回给浏览器展示给用户的数据。

(4)状态码

  • 1xx信息性状态码:请求已被接收,服务器正在处理
  • 2xx成功状态码:请求已被服务器接收、理解和处理
  • 3xx重定向状态码:表示需要进一步操作完成请求,移动到了新的URL
  • 4xx客户端错误状态码:客户端发送的请求错误
  • 5xx服务器错误状态码:服务器在处理请求时发生了错误

【3】动、静态网页

(1)静态网页

  • 介绍:

    • 静态网页是指在服务器上事先准备好的网页文件,其内容在用户访问时不会发生变化。静态网页通常由HTML、CSS和JavaScript等静态资源组成。
  • 特点:

    • 内容固定不变:静态网页的内容在服务器上生成,并在用户访问时以相同的形式呈现。

    • 简单易部署:静态网页不需要服务器端的动态处理,部署和维护相对简单。

    • 性能高效:由于没有动态处理的开销,静态网页加载速度较快。

  • 示例:

    • 一个静态网页的示例可以是一个展示公司产品信息的网页,其中包含公司的介绍、产品列表和联系方式等信息。
    • 还有错误页面等error.html

(2)动态网页

  • 介绍:

    • 动态网页是指在用户访问时通过服务器端的动态处理生成的网页,内容可以根据用户的请求和其他条件而变化。
  • 特点:

    • 内容可变:动态网页的内容可以根据用户的请求、数据库查询结果、用户状态等动态生成。

    • 复杂交互:动态网页可以支持更复杂的用户交互,如表单提交、数据验证、用户登录等。

    • 数据库和后端处理:动态网页通常需要与数据库进行交互,并由服务器端的程序处理用户请求。

  • 示例:

    • 一个动态网页的示例可以是一个在线商城,用户可以浏览商品、添加到购物车、下订单等操作,而这些操作都需要与服务器端进行交互并动态生成网页内容。

(3)总结

  • 静态网页是事先准备好的内容固定的网页,部署简单且加载速度快
  • 动态网页是根据用户请求和服务器端处理生成的网页,内容可变且支持复杂的交互操作。

【一】socket服务端搭建

【1】模板

(1)基础模板

  • 在web中输入127.0.0.1

  • 无法看任何信息

  • 因为没有按照HTTP协议传输内容

import socket# 创建socket对象
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 避免重启后端口被占用
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 监听端口
server.bind(("127.0.0.1", 8080))
# 创建半连接池
server.listen(5)while True:# 等待连接conn, addr = server.accept()# 接收数据recv_data = conn.recv(1024).decode('utf8')print(f"recv:>>>{recv_data}")# 二级制数据http_data = b"HTTP1.1 200 ok \r\n\r\n"data = b"hello world"# 发送数据conn.send(http_data + data)

(2)web端可以看到信息版

  • 按照HTTP协议格式发送
    • 响应首行 响应头 空行 响应体
import socket# 创建socket对象
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 避免重启后端口被占用
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 监听端口
server.bind(("127.0.0.1", 8080))
# 创建半连接池
server.listen(5)while True:# 等待连接conn, addr = server.accept()# 接收数据recv_data = conn.recv(1024).decode('utf8')print(f"recv:>>>{recv_data}")# 响应首行 响应头 空行http_data = b"HTTP1.1 200 ok \r\n\r\n"# 二级制数据send_data = b"hello world"# 发送数据conn.send(http_data + send_data)

【2】任务:接收浏览器信息

  • 在web中输入任意字符串
    • 在socket中找到这个字符串
  • 示例:127.0.0.1:8080/index
    • 拿到index
  • 示例:127.0.0.1:8080/home
    • 拿到home
  • 将服务端按照空格切分,发现是第二个数据
    • 所以通过recv_data.split(' ')[1]可以拿到
import socket# 创建socket对象
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 避免重启后端口被占用
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 监听端口
server.bind(("127.0.0.1", 8080))
# 创建半连接池
server.listen(5)while True:# 等待连接conn, addr = server.accept()# 接收数据recv_data = conn.recv(1024).decode('utf8')print(f"recv:>>>{recv_data.split(' ')[1]}")# 响应首行 响应头 空行http_data = b"HTTP1.1 200 ok \r\n\r\n"# 二级制数据send_data = b"hello world"# 发送数据conn.send(http_data + send_data)
recv:>>>/
recv:>>>/index
recv:>>>/home
recv:>>>/favicon.ico # 现在不用管

【二】基于wsgiref模块

  • 内置模块

【1】模板

(1)基础模板

  • 访问127.0.0.1:8080
  • 便会返回hello world
from wsgiref import simple_serverdef run(request, response):""":param request: 请求相关的数据:param response: 响应相关的数据:return: 返回给客户端的展示数据"""# 固定编写response("200 OK", [])return [b"hello world"]if __name__ == '__main__':# 端口和IPIP = "127.0.0.1"PORT = 8080# 创建服务端对象,只要有请求访问,便会执行run方法server = simple_server.make_server(IP, PORT, run)server.serve_forever()

(2)任务:根据请求返回不同信息

  • 同理通过分析response
    • 首先这是一个字典
    • 然后每次浏览器请求的后缀在PATH_INFO
    • 所以根据这个返回不同信息
from wsgiref import simple_serverdef run(request, response):""":param request: 请求相关的数据:param response: 响应相关的数据:return: 返回给客户端的展示数据"""# 固定编写response("200 OK", [])# 获取后缀内容get_path = request.get("PATH_INFO")if get_path == "/index":return [b"welcome index"]elif get_path == "/home":return [b"welcome home"]else:return [b"404 error"]if __name__ == '__main__':# 端口和IPIP = "127.0.0.1"PORT = 8080# 创建服务端对象,只要有请求访问,便会执行run方法server = simple_server.make_server(IP, PORT, run)server.serve_forever()

【2】存在的不足和优化

(1)问题

  • 如果网站很多,那么需要人为的写很多的elif
  • 每个分支下的功能根据业务逻辑的不同可能会比较复杂的逻辑

(2)函数和模块优化

  • urls
    • 后缀与函数名对应关系
    • (‘/index’,register)
    • 后缀专业名词称之为’路由’
    • 函数名专业名词称之为’视图函数’
    • urls.py专业名词称之为’路由层’
  • views
    • 专门编写业务逻辑代码
    • 可以是函数 也可以是类
    • 函数专业名词称之为’视图函数’
    • 类专业名词称之为’视图类’
    • views.py专业名词称之为’视图层’
  • templates
    • 专门存储html文件
    • html文件专业名词称之为’模板文件’
    • templates文件夹专业名词称之为’模板层’
  • static
    • 专门存储静态文件资源
    • 页面所需css文件、js文件、图片文件、第三方文件可统称为’静态资源’
项目文件夹  
├── server.py            // 主应用
├── urls.py             // 对应关系的存储
├── views.py        	// 业务逻辑的编写
├── templates文件夹      // 存储项目所需的html文件
│       └── home.html	// home页面
├── static文件夹         // 存储项目所需的静态文件
│       └── jquery-3.7.1.min.js		// jquery框架
│       └── bootstrap-grid.min.css  // bootstrap框架
......

(3)示例

  • server.py:主应用
from wsgiref import simple_server
from urls import urls
from views import errordef run(request, responce):responce('200 OK', []) current_path = request.get("PATH_INFO")func_name = Nonefor url_tuple in urls:  # ('/register', register)if current_path == url_tuple[0]:func_name = url_tuple[1]breakif func_name:res = func_name(request)else:res = error(request) return [res.encode('utf8')]if __name__ == '__main__':server = simple_server.make_server('127.0.0.1', 8080, run)server.serve_forever()
  • urls:对应关系的存储
from views import *urls = (('/home', login),('/index', index),
)
  • views:业务逻辑代码
# 功能函数
def register(request):return 'home'def index(request):return 'index'def error(request):return open(r'static/error.html', 'r', encoding='utf8').read()
  • static->error.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><meta name="viewport" content="width=device-width,initial-scale=1.0"><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script><link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script></head>
<body><h1>404 Error</h1>
</body>
</html>

【三】基于jinjia2模块

【1】任务:页面显示当前时间

  • server.py:主应用

    • 不做任何改变
  • urls:对应关系的存储

from views import *urls = (('/show_time', show_time),
)
  • views:业务逻辑代码
import timedef show_time(request):now_time = time.strftime("%x %X", time.localtime())return open(r"templates/time.html", 'r', encoding='utf8').read().replace("time", now_time)def error(request):return open(r'static/error.html', 'r', encoding='utf8').read()
  • templates->time.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><meta name="viewport" content="width=device-width,initial-scale=1.0"><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script><link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script></head>
<body><h1 style="text-align: center">time</h1>
</body>
</html>

【2】jinja2模块

(1)基础介绍

  • Jinja2是一个流行的Python模板引擎,它提供了一种灵活而强大的方式来生成动态内容。
  • Jinja2模板引擎可以用于各种应用程序,包括Web开发、生成配置文件、邮件模板等。

(2)特点和使用方法

  • 模板语法:
    • Jinja2使用一种类似于HTML的模板语法,通过插入变量、控制流语句和过滤器等,可以动态生成内容。
    • 例如,使用{{ variable }}表示插入变量,{% if condition %}...{% endif %}表示条件语句,{% for item in collection %}...{% endfor %}表示循环语句。
  • 模板继承:
    • Jinja2支持模板继承,可以定义一个基础模板,然后在子模板中继承基础模板并覆盖特定的部分。
  • 过滤器和函数:
    • Jinja2提供了一些内置的过滤器和函数,用于对变量进行格式化、转换和处理。例如,可以使用{{ variable|filter }}的语法来应用过滤器。
  • 变量上下文:
    • 在渲染模板时,可以通过向模板引擎提供一个变量上下文来传递数据。
    • 上下文可以是一个字典,其中包含模板中使用的变量和对应的值。
  • 扩展和自定义:
    • Jinja2允许通过扩展和自定义来增强模板引擎的功能。
    • 可以编写自定义的过滤器、函数和标签,或者使用现有的扩展库来扩展Jinja2的功能。

【3】使用jinja2模块

(1)演示

  • templates -> show_jinja2.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><meta name="viewport" content="width=device-width,initial-scale=1.0"><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script><link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script></head>
<body>
<h1>字典数据展示</h1>
<p>{{ user }}</p>
<p>{{ user.name }}</p>
<p>{{ user['pwd'] }}</p>
<p>{{ user.get('hobby') }}</p>
<h1>列表数据展示</h1>
<p>{% for i in new_list %}<span>元素:{{ i }}</span>{% endfor %}
</p>
</body>
</html>
  • views
import time
from jinja2 import Template# 功能函数
def show_time(request):now_time = time.strftime("%x %X", time.localtime())return open(r"templates/time.html", 'r', encoding='utf8').read().replace("time", now_time)def show_jinja2(request):user_dict = {"name": "bruce", "age": 18, "hobby": "playing"}new_list = ["aa", "bb", "cc", 11, 22, 33]data = open("templates/show_jinja2.html", 'r', encoding='utf8').read()temp_obj = Template(data)res = temp_obj.render({"user": user_dict, "new_list": new_list})return resdef error(request):return open(r'static/error.html', 'r', encoding='utf8').read()
  • urls
from views import *urls = (('/show_time', show_time),('/show_jinja2', show_jinja2),
)

(2)任务:页面显示时间

  • templates->time.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><meta name="viewport" content="width=device-width,initial-scale=1.0"><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script><link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script></head>
<body><h1 style="text-align: center">{{ time }}</h1>
</body>
</html>
  • views
import time
from jinja2 import Template# 功能函数
def show_time(request):now_time = time.strftime("%x %X", time.localtime())return open(r"templates/time.html", 'r', encoding='utf8').read().replace("time", now_time)def show_time_jinja2(request):now_time = time.strftime("%x %X", time.localtime())data = open(r"templates/time.html", 'r', encoding='utf8').read()temp_obj = Template(data)res = temp_obj.render({"time":now_time})return resdef error(request):return open(r'static/error.html', 'r', encoding='utf8').read()
  • urls
from views import *urls = (('/show_time', show_time),('/show_time_jinja2', show_time_jinja2)
)

【四】网络框架和MVC架构

【1】网络框架

  • 网络框架是一种软件框架,用于构建Web应用程序。它提供了一系列工具、库和规范,以简化Web开发过程,包括路由处理、请求处理、模板引擎、数据库连接等功能。
  • 网络框架通常提供了一种结构和组织应用程序的方式,使得开发者可以更加高效地开发和维护Web应用程序。
  • 网络框架可以是基于某种编程语言的,如Python的Flask和Django框架,JavaScript的Express框架等。

【2】MVC架构

  • MVC(Model-View-Controller)是一种常见的软件设计模式,用于组织和分离应用程序的逻辑和视图。
  • MVC架构将应用程序分为三个核心组件:
    • 模型(Model):负责处理数据和业务逻辑。模型通常与数据库交互,处理数据的读取、写入和验证等操作。
    • 视图(View):负责展示数据给用户,并接收用户的输入。视图通常是用户界面的一部分,如网页、移动应用程序的界面等。
    • 控制器(Controller):负责处理用户的请求,协调模型和视图之间的交互。控制器接收用户的输入,根据业务逻辑来更新模型,并将更新后的数据传递给视图进行展示。
  • MVC架构的优势在于将应用程序的不同功能模块进行了分离,使得代码更加可维护、可扩展和易于测试。

【3】小结

  • 在Web开发中,网络框架通常采用MVC架构来组织应用程序的代码。
  • 框架提供了路由处理、请求处理和模板引擎等功能,而开发者则可以按照MVC的思想将应用程序的逻辑和视图进行分离,提高开发效率和代码质量。
  • 通过网络框架和MVC架构的结合,开发者可以更好地组织和管理Web应用程序,并实现灵活、可扩展的应用开发。

【五】主流后端框架

【1】Django

(1)介绍

  • Django是一个使用Python编写的高级Web应用程序框架。它以快速开发和可扩展性为目标,提供了一系列工具和功能,使得构建复杂的Web应用程序变得简单和高效。

(2)特点

  • 完整的功能集:Django提供了许多内置的功能和模块,包括数据库ORM、表单处理、用户认证、管理界面等。这些功能的集成使得开发者可以更快速地构建功能完善的Web应用程序,而无需从头开始编写大量的代码。
  • 高度可扩展:Django采用了松散耦合的设计,使得开发者可以方便地扩展和定制应用程序。它支持插件和第三方应用的集成,以及自定义模型、视图和模板等。
  • 强大的模板引擎:Django的模板引擎提供了丰富的模板语法和功能,使得开发者可以轻松地生成动态内容和处理数据。它支持模板继承、过滤器、标签等特性,使得模板的重用和组织变得更加简单。
  • 自动化的管理界面:Django自带了一个强大的管理界面,可以自动生成数据库管理界面,使得开发者可以方便地管理和操作数据。这个管理界面提供了增删改查等常见操作的功能,并且可以进行自定义扩展。

(3)组成结构

  • Django的组成结构基于MVC(Model-View-Controller)架构,但在Django中,通常称之为MTV(Model-Template-View):
    • 模型(Model):模型负责处理数据和业务逻辑。它定义了数据模型和数据库表之间的映射关系,并提供了对数据的增删改查等操作。
    • 模板(Template):模板负责展示数据给用户。它使用Django的模板语言,将数据和逻辑结合起来生成最终的HTML页面。
    • 视图(View):视图负责处理用户的请求和逻辑处理。它接收用户的请求,从数据库中获取数据,然后将数据传递给模板进行渲染,并返回生成的HTML页面给用户。

【2】Flask

(1)介绍

  • Flask是一个使用Python编写的微型Web框架,它以简洁和灵活为特点。Flask提供了一些基本的工具和库,使得构建Web应用程序变得简单和可扩展。

(2)特点

  • 简洁而灵活:Flask的设计理念是保持简单和可扩展性,它提供了一些核心功能,但并没有强制性的约束。开发者可以根据需求自由选择和集成其他库和工具,以满足特定的应用需求。
  • 轻量级:Flask是一个轻量级的框架,它的核心库非常小巧,并且没有多余的依赖。这使得Flask在资源消耗和性能方面表现出色,适合构建小型和简单的Web应用程序。
  • 易学易用:Flask的API设计简单直观,容易学习和使用。它提供了路由处理、请求处理、模板引擎等基本功能,使得开发者可以快速上手并进行开发。
  • 可扩展性:尽管Flask本身是一个微型框架,但它支持通过插件和扩展来增加功能。开发者可以根据需要选择和集成各种扩展,以满足特定的应用需求。

【3】Tornado

(1)介绍

  • Tornado是一个使用Python编写的高性能Web框架和异步网络库。它以处理大量并发连接和高性能为目标,适用于构建高性能的Web应用程序和实时Web服务。

(2)特点

  • 高性能:Tornado采用了异步的事件驱动编程模型,通过非阻塞的I/O操作和事件循环机制,实现了高性能的网络通信。它可以处理大量的并发连接,并具有出色的响应能力。
  • 内置异步支持:Tornado内置了对异步编程的支持,包括异步请求处理、异步HTTP客户端和异步数据库访问等。这使得开发者可以编写高效的异步代码,处理并发请求和I/O操作。
  • 轻量级:Tornado是一个轻量级的框架,它的核心库非常小巧,并且没有多余的依赖。这使得Tornado在资源消耗和性能方面表现出色,适合构建高性能的Web应用程序。
  • WebSocket支持:Tornado提供了对WebSocket的原生支持,使得开发者可以方便地构建实时Web应用程序和实时通信服务。

【4】FastAPI

(1)介绍

  • FastAPI是一个使用Python编写的现代化Web框架,它旨在提供高性能和易用性。FastAPI基于Python 3.7+的类型注解和异步编程模型,使得开发者可以快速构建高性能的Web API应用程序。

(2)特点

  • 高性能:FastAPI基于异步编程模型,利用Python 3.7+的类型注解和静态类型检查,实现了高性能的请求处理。它使用基于Starlette的异步服务器,能够处理大量的并发请求。
  • 快速开发:FastAPI的设计目标是提供快速开发的体验。它提供了自动生成API文档、输入数据验证、请求处理等功能,使得开发者可以快速构建和部署Web API应用程序。
  • 类型注解和自动文档:FastAPI利用Python的类型注解,可以自动生成API文档和输入数据验证。开发者可以通过类型注解定义输入和输出的数据模型,并自动生成交互式的API文档。
  • 异步支持:FastAPI完全支持异步编程,可以处理异步请求和异步操作。它基于Python的协程和异步IO,能够处理高并发和高负载的请求。

相关文章:

Django 铺垫

【一】基础知识点 【1】web框架的本质 Web框架本质上可以看成是一个功能强大的socket服务端用户的浏览器可以看成是拥有可视化界面的socket客服端两种通过网络请求实现数据交互 【2】浏览器发送请求 &#xff08;1&#xff09;HTTP协议 HTTP协议是超文本传输协议&#xff…...

浅谈C++的继承与多态(静态绑定、动态绑定和虚函数等)

今天我们来谈谈C的继承与多态&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;本篇的关键内容如下&#xff1a; 继承的本质及其原理派生类的构造和析构过程重载、隐藏和覆盖类的向下或向上转型静态绑定与动态绑定虚函数对类的影响虚析构函数 下面&#xff0c;我们将对这…...

【无人机综合考试题】

1.请选择出哪一个功能选项&#xff0c;在手动遥控飞行时&#xff0c;可以改变各通道的操作灵敏度? 行程比例在手动遥控飞行时&#xff0c;可以改变各通道的操作灵敏度 用于起降的遥控器中 THR、ELE 通道分别控制多旋翼无人机的什么运动? AIL(左、右移动)RUD(左、右水平旋转…...

JS精度计算的几种解决方法,1、转换成整数计算后再转换成小数,2、toFixed,3、math.js,4、bignumber.js,5、big.js

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、转换成整数计算后再转换成小数二、toFixed三、math.js四、bignumber.js五、big.js总结 前言 原始计算 let aNum 6.6 0.3;let bNum 6.6 - 0.2;let cNum 6.6 * 0.3;let dNum 6.6 / 0.2;console.log(…...

v77.递归

理解&#xff1a; 函数直接或者间接地调用自身&#xff1b;并且有边界条件。 1&#xff1a; #include <stdio.h> int main() {int result fun(3);printf("%d",result);return 0 ; } int fun(int num) {if(num 1)return num;return num fun(num-1); }思路…...

Spring Cloud微服务功能及其组件详细讲解

Spring Cloud微服务功能及其组件详细讲解 文章目录 Spring Cloud微服务功能及其组件详细讲解前言&#xff1a;什么是微服务&#xff1f;一、Spring Cloud原理简述二、核心组件1、服务发现——Nacos/Eureka/Consul1&#xff09;Nacos服务发现2&#xff09;Eureka服务发现3&#…...

(三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练

这里写目录标题 一、colmap解算数据放入高斯1. 将稀疏重建的文件放入高斯2. 将稠密重建的文件放入高斯 二、vkitti数据放入高斯 一、colmap解算数据放入高斯 运行Colmap.bat文件之后&#xff0c;进行稀疏重建和稠密重建之后可以得到如下文件结构。 1. 将稀疏重建的文件放入高…...

4635: 【搜索】【广度优先】回家

题目描述 小 H 在一个划分成了nm 个方格的长方形封锁线上。 每次他能向上下左右四个方向移动一格&#xff08;当然小 H 不可以静止不动&#xff09;&#xff0c; 但不能离开封锁线&#xff0c;否则就被打死了。 刚开始时他有满血 6 点&#xff0c;每移动一格他要消耗 1 点血量…...

Uibot6.0 (RPA财务机器人师资培训第1天 )RPA+AI、RPA基础语法

训练网站&#xff1a;泓江科技 (lessonplan.cn)https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981(本博客中会有部分课程ppt截屏,如有侵权请及请及时与小北我取得联系~&#xff09; 紧接着小北之前的几篇博客&#xff0c;友友们我们即将开展新课的学习~…...

【吊打面试官系列】Redis篇 -Redis集群的主从复制模型是怎样的?

大家好&#xff0c;我是锋哥。今天分享关于 【Redis集群的主从复制模型是怎样的&#xff1f;】 面试题&#xff0c;希望对大家有帮助&#xff1b; Redis集群的主从复制模型是怎样的&#xff1f; 为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用&#xff0c;所…...

高效的二进制列化格式 MessagePack 详解

目录 MessagePack 序列化原理 MessagePack 数据类型及编码方式 MessagePack 序列化与反序列化过程 MessagePack 的优势 应用场景 注意事项 小结 MessagePack &#xff08;简称 msgPack&#xff09;是一种高效的二进制序列化格式&#xff0c;可以将各种数据类型&#xff…...

鸿蒙Harmony应用开发—ArkTS-if/else:条件渲染

ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态&#xff0c;使用if、else和else if渲染对应状态下的UI内容。 说明&#xff1a; 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 使用规则 支持if、else和else if语句。 if、else if后跟随的条件语句…...

JAVA 100道题(14)

14.使用LinkedList实现一个简单的堆栈&#xff08;Stack&#xff09;数据结构。 下面是一个简单的Java程序&#xff0c;使用LinkedList来实现一个堆栈&#xff08;Stack&#xff09;数据结构。在这个程序中&#xff0c;我们定义了一个MyStack类&#xff0c;它包含了一些基本的堆…...

STM32+ESP8266水墨屏天气时钟:简易多级菜单(数组查表法)

项目背景 本次的水墨屏幕项目需要做一个多级菜单的显示&#xff0c;所以写出来一起学习&#xff0c;本篇文章不单单适合于水墨屏&#xff0c;像0.96OLED屏幕也适用&#xff0c;区别就是修改显示函数。 设计思路 多级菜单的实现&#xff0c;一般有两种实现的方法 1.通过双向…...

数学建模综合评价模型与决策方法

评价方法主要分为两类&#xff0c;其主要区别在确定权重的方法上 一类是主观赋权法&#xff0c;多次采取综合资讯评分确定权重&#xff0c;如综合指数法&#xff0c;模糊综合评判法&#xff0c;层次评判法&#xff0c;功效系数法等 另一类是客观赋权法&#xff0c;根据各指标…...

window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm)

window下安装并使用nvm&#xff08;含卸载node、卸载nvm、全局安装npm&#xff09; 一、卸载node二、安装nvm三、配置路径和下载源四、使用nvm安装node五、nvm常用命令六、卸载nvm七、全局安装npm、cnpm八、遇到的问题 nvm 全名 node.js version management&#xff0c;顾名思义…...

Mysql——基础命令集合

目录 前期准备 先登录数据库 一、管理数据库 1.数据表结构解析 2.常用数据类型 3.适用所有类型的修饰符 4.使用数值型的修饰符 二、SQL语句 1.SQL语言分类 三、Mysql——Create,Show,Describe,Drop 1.创建数据库 2.查看数据库 3.切换数据库 4.创建数据表 5.查看…...

记录一次流相关故障

记录一次流相关故障 1、项目中有个JSON字典文件&#xff0c;通过流的方式加载进来&#xff0c;写了个输入流转字符串的方法&#xff0c;idea开发环境下运行一切正常&#xff0c;打成jar或者war包运行时&#xff0c;只能加载出部分数据&#xff0c;一开始怀疑过运行内存分配过小…...

linux源配置:ubuntu、centos;lspci与lsmod命令区别

1、ubuntu源配置 1&#xff09;先查电脑版本型号: lsb_release -c2&#xff09;再编辑源更新&#xff0c;源要与上面型号对应 参考&#xff1a;https://midoq.github.io/2022/05/30/Ubuntu20-04%E6%9B%B4%E6%8D%A2%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F%E6%BA%90/ /etc/apt/…...

面试算法-88-反转链表

题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 解 class Solution {public ListNode reverseList(ListNode head) {if(head null || hea…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

表单设计器拖拽对象时添加属性

背景&#xff1a;因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...