Python CGI编程

文章目录

  • 什么是CGI
  • CGI架构
  • Web服务器支持及配置
  • CGI程序示例
  • CGI环境变量
  • GET和POST方法
    • GET方法
    • POST方法
    • 区别
    • 注意事项
  • 使用POST方法传递数据
    • 1. 创建HTML表单
    • 2. 编写CGI脚本
    • 3. 配置服务器
    • 4. 提交表单
    • 5. 服务器处理请求
    • 注意事项
  • 通过CGI程序传递checkbox数据
    • 创建HTML表单
    • 编写CGI脚本
    • 注意事项
  • 通过CGI程序传递Radio数据
    • 创建HTML表单
    • 编写CGI脚本
    • 注意事项
  • 通过CGI程序传递 Textarea 数据
    • 创建HTML表单
    • 编写CGI脚本
    • 注意事项
  • 通过CGI程序传递下拉数据
    • 创建HTML表单
    • 编写CGI脚本
    • 注意事项

什么是CGI

CGI是“计算机生成图像”(Computer-Generated Imagery)的缩写,它指的是通过计算机软件创造的静态或动态的图像。这种技术广泛应用于电影、动画、视频游戏以及模拟器等多个领域。通过CGI,制作人员能够创造出从现实世界拍摄无法实现的场景和效果,或者重现那些过于危险、成本过高或无法实现的场景。
在电影产业中,CGI技术使得电影制作人大大扩展了他们的创意界限,从《侏罗纪公园》中的恐龙到《阿凡达》中的外星世界,CGI技术为观众带来了前所未有的视觉体验。在动画制作中,从《玩具总动员》到《冰雪奇缘》,CGI让动画角色和世界变得更加生动和逼真。
除了娱乐产业,CGI在科学研究、医学、建筑和军事模拟等领域也有着重要的应用。例如,科学家可以使用CGI来可视化复杂的分子结构,医生可以模拟手术过程,建筑师可以创建建筑物的三维模型,而军事训练可以利用CGI进行模拟战斗场景的演练。
随着技术的发展,CGI技术也在不断进步,包括更加逼真的渲染技术、更加高效的动画制作流程以及更加智能的图像处理算法等。

CGI架构

在这里插入图片描述

Web服务器支持及配置

Web服务器及其支持与配置的简要概述:

  • Apache与mod_wsgi:
    • Apache是世界上最流行的Web服务器软件之一。
    • mod_wsgi是一个Apache模块,它允许Apache服务器运行Python WSGI应用程序。
    • 配置mod_wsgi通常涉及到编辑Apache的配置文件(httpd.conf或apache2.conf),添加对Python代码的引用,并确保mod_wsgi模块已加载。
  • Nginx与uWSGI:
    • Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3代理服务器。
    • uWSGI是一个实现了WSGI协议的Web服务器,它通常与Nginx配合使用。
    • 配置Nginx涉及编辑其配置文件(通常是nginx.conf),设置代理传递到uWSGI,而uWSGI需要配置来运行Python应用程序。
  • Gunicorn:
    • Gunicorn是一个用Python编写的WSGI HTTP服务器,通常用于运行生产中的Web应用程序。
    • 它被设计成易于配置和部署,通常与Nginx配合使用,Nginx作为反向代理服务器。
    • Gunicorn的配置通常通过命令行参数或配置文件完成。
  • Django内置服务器:
    • Django是一个高级Python Web框架,它内置了一个轻量级的开发服务器。
    • 这个服务器不适合生产环境,因为它设计为在开发过程中提供快速反馈。
    • 启动Django内置服务器通常很简单,只需运行python manage.py runserver命令。
  • Flask内置服务器:
    • Flask是一个轻量级的Web应用框架,它也包含一个简单的内置服务器。
    • 与Django一样,这个服务器仅适用于开发环境。
    • 运行Flask应用程序通常涉及到运行应用程序的Python脚本。
      对于生产环境,建议使用Apache、Nginx和uWSGI或Gunicorn这样的成熟服务器,因为它们提供了更好的性能、安全性和稳定性。开发环境中,Django和Flask的内置服务器就足够了,因为它们易于使用且可以快速启动。
      在配置任何Web服务器时,都需要考虑以下几个方面:
  • 安全设置,如使用SSL/TLS加密。
  • 性能调优,如负载均衡和缓存策略。
  • 稳定性,如设置适当的进程和线程数。
  • 日志记录,以便于监控和故障排查。

请根据您的具体需求和运行环境选择合适的Web服务器和配置方式。

CGI程序示例

首先,确保你的Web服务器(如Apache)已经配置好了CGI支持,并且知道CGI脚本的存放位置。
创建一个名为hello.py的文件,并输入以下内容:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-import cgitb
cgitb.enable()  # This line enables CGI error reportingprint("Content-Type: text/html")  # HTTP header to specify content type
print()  # Blank line required, end of headersprint("<html>")
print("<head>")
print("<title>Hello, World!</title>")
print("</head>")
print("<body>")
print("<h1>Hello, World!</h1>")
print("</body>")
print("</html>")

确保文件的第一行指明了Python解释器的路径,这通常是通过#!/usr/bin/env python3来实现的。cgitb模块用于在浏览器中显示错误信息,这在调试时非常有用。
将hello.py文件保存到你的Web服务器的CGI-bin目录下,或者任何其他配置为运行CGI脚本的目录。
确保hello.py文件有执行权限,你可以通过运行以下命令来赋予执行权限:

chmod +x hello.py

现在,如果你的Web服务器配置正确,你可以在浏览器中访问CGI脚本的URL(例如,http://yourserver.com/cgi-bin/hello.py)来运行这个脚本。你应该会看到一条消息“Hello, World!”显示在浏览器中。
请注意,CGI脚本的性能通常不是很高,对于高流量的网站,可能需要考虑其他更高效的解决方案,如WSGI服务器(如uWSGI或Gunicorn)或者使用异步框架(如aiohttp)。此外,现代Web开发通常使用框架(如Django或Flask),这些框架内置了更好的HTTP处理机制,而不是直接使用CGI。

CGI环境变量

CGI(Common Gateway Interface)环境变量是服务器传递给CGI脚本的信息集合,它们包含了有关请求、服务器和客户端的详细信息。以下是一些常见的CGI环境变量:

  • CONTENT_TYPE:请求主体的MIME类型,例如application/x-www-form-urlencoded。
  • CONTENT_LENGTH:请求主体的长度(以字节为单位)。
  • HTTP_:包含客户端发送的HTTP请求头信息,其中代表具体的头名称,例如HTTP_USER_AGENT、HTTP_REFERER。
  • QUERY_STRING:URL中的查询字符串(问号?之后的部分)。
  • REMOTE_ADDR:客户端的IP地址。
  • REMOTE_HOST:客户端的完整主机名(如果服务器配置了名称解析)。
  • REQUEST_METHOD:HTTP请求方法(如GET、POST等)。
  • SCRIPT_NAME:CGI脚本的URL路径。
  • SERVER_NAME:服务器的域名。
  • SERVER_PORT:服务器正在监听的端口号。
  • SERVER_PROTOCOL:客户端使用的协议版本(如HTTP/1.0或HTTP/1.1)。
  • SERVER_SOFTWARE:服务器软件的名称和版本。
  • PATH_INFO:URL中的额外路径信息,跟在CGI脚本名之后。
  • PATH_TRANSLATED:PATH_INFO经过路径映射转换后的结果。
  • AUTH_TYPE:身份验证的类型(如果使用了身份验证)。
  • REMOTE_USER:经过身份验证的用户名(如果使用了身份验证)。

这些环境变量为CGI脚本提供了执行其任务所需的信息。例如,一个CGI脚本可能会检查REQUEST_METHOD来确定如何处理输入数据,或者使用CONTENT_TYPE来解析上传的文件。
CGI脚本可以通过查询环境变量来获取这些信息。在Python中,可以使用os.environ字典来访问这些环境变量,例如:

import osrequest_method = os.environ.get('REQUEST_METHOD')
content_type = os.environ.get('CONTENT_TYPE')

了解和使用这些环境变量对于编写能够正确响应Web请求的CGI脚本至关重要。

GET和POST方法

在Web开发中,GET和POST方法是HTTP协议定义的两种基本请求方法,用于客户端和服务器之间的数据传输。在Python中,CGI脚本通常处理这两种方法的请求。以下是GET和POST方法的简要说明以及如何在Python中处理它们:

GET方法

GET方法通常用于请求服务器上的数据。当使用GET方法时,请求的数据会附加在URL之后,以查询字符串的形式发送。例如:

GET /test.cgi?name=John&age=30 HTTP/1.1
Host: example.com

在Python中,可以通过os.environ获取查询字符串:

import osquery_string = os.environ.get('QUERY_STRING', '')

然后,你可以解析查询字符串来获取参数:

import urllib.parseparams = urllib.parse.parse_qs(query_string)
name = params.get('name', [''])[0]
age = params.get('age', [''])[0]

POST方法

POST方法通常用于向服务器发送数据,尤其是当数据量较大或者包含敏感信息时。POST请求的数据不会出现在URL中,而是包含在请求的正文中。例如,一个表单提交可能会使用POST方法。
在Python中,处理POST请求需要读取标准输入(通常是sys.stdin),因为数据会从那里读取:

import sys
import cgiform = cgi.FieldStorage()
name = form.getvalue('name', '')
age = form.getvalue('age', '')

区别

  • GET请求的数据在URL中可见,因此它不适合传输敏感信息。
  • GET请求有长度限制,而POST请求可以传输更多的数据。
  • GET请求可以被缓存、被保存在浏览器历史记录中,而POST请求通常不会被缓存。
  • GET请求应该用于幂等的操作,即多次执行同一请求不会产生不同的结果。POST请求通常用于非幂等的操作,如创建或更新资源。

注意事项

  • 在处理用户输入时,应始终对数据进行验证和清理,以防止注入攻击和其他安全风险。
  • 使用CGI时,服务器可能会限制POST请求的正文大小,这需要在服务器配置中进行调整。

在实际应用中,CGI脚本的使用已经逐渐被更现代的Web框架和服务器端技术所取代,如WSGI、Django、Flask等,这些技术提供了更高效和安全的处理HTTP请求的方法。

使用POST方法传递数据

使用POST方法传递数据通常涉及创建一个HTML表单,用户填写表单并提交,然后服务器上的脚本处理提交的数据。以下是使用POST方法传递数据的基本步骤:

1. 创建HTML表单

创建一个包含标签的HTML页面,设置method属性为"POST",并指定action属性为处理数据的脚本的URL。

<form action="your_script.cgi" method="POST"><label for="name">Name:</label><input type="text" name="name" id="name"><label for="age">Age:</label><input type="text" name="age" id="age"><input type="submit" value="Submit">
</form>

2. 编写CGI脚本

在服务器上编写一个CGI脚本来处理POST请求。这个脚本将读取POST过来的数据并做出相应的处理。

#!/usr/bin/env python3
import cgi
import cgitb
cgitb.enable()  # This line enables CGI error reportingform = cgi.FieldStorage()name = form.getvalue('name', '')
age = form.getvalue('age', '')print("Content-Type: text/html")  # HTTP header to specify content type
print()  # Blank line required, end of headersprint("<html>")
print("<head>")
print("<title>POST Result</title>")
print("</head>")
print("<body>")
print("<p>Name: {}</p>".format(name))
print("<p>Age: {}</p>".format(age))
print("</body>")
print("</html>")

3. 配置服务器

确保你的Web服务器(如Apache)已经配置好了CGI支持,并且知道CGI脚本的存放位置。

4. 提交表单

用户在浏览器中填写表单并点击提交按钮后,表单数据将以POST请求的方式发送到服务器。

5. 服务器处理请求

服务器接收到POST请求后,会执行CGI脚本。脚本从cgi.FieldStorage()对象中获取表单数据,并生成响应。

注意事项

  • 在实际部署时,确保CGI脚本的权限设置正确,以便Web服务器可以执行它。
  • 对于生产环境,CGI可能不是最佳的选择,因为它的性能和安全性问题。可以考虑使用更现代的Web框架,如Django或Flask。
  • 处理用户输入时,始终要验证和清理数据,以防止SQL注入、跨站脚本(XSS)等安全风险。

通过CGI程序传递checkbox数据

在HTML表单中,复选框(checkbox)允许用户从多个选项中选择一个或多个值。当表单通过CGI程序提交时,复选框的数据将以名称-值对的形式发送。如果复选框没有被选中,则不会发送任何数据。
以下是如何在HTML表单中创建复选框以及如何在CGI程序中接收这些数据的示例。

创建HTML表单

<form action="your_script.cgi" method="POST"><input type="checkbox" name="option1" value="Value 1"> Option 1<input type="checkbox" name="option2" value="Value 2"> Option 2<input type="checkbox" name="option3" value="Value 3"> Option 3<input type="submit" value="Submit">
</form>

编写CGI脚本

在Python中,你可以使用cgi.FieldStorage()类来解析表单数据。对于复选框,你需要检查每个复选框的名称是否存在于FieldStorage对象中。

#!/usr/bin/env python3
import cgi
import cgitb
cgitb.enable()  # This line enables CGI error reportingform = cgi.FieldStorage()# 检查复选框是否被选中
option1 = form.getvalue('option1')
option2 = form.getvalue('option2')
option3 = form.getvalue('option3')print("Content-Type: text/html")  # HTTP header to specify content type
print()  # Blank line required, end of headersprint("<html>")
print("<head>")
print("<title>Checkbox Result</title>")
print("</head>")
print("<body>")
print("<p>Option 1: {}</p>".format(option1 if option1 else 'Not selected'))
print("<p>Option 2: {}</p>".format(option2 if option2 else 'Not selected'))
print("<p>Option 3: {}</p>".format(option3 if option3 else 'Not selected'))
print("</body>")
print("</html>")

我们使用form.getvalue(‘optionX’)来获取每个复选框的值,其中’optionX’是复选框的名称。如果复选框没有被选中,getvalue()将返回None,我们通过条件表达式来处理这种情况。

注意事项

  • 如果多个同名复选框被选中,它们将以列表的形式出现在FieldStorage对象中。例如,如果有多个option1复选框被选中,你需要使用form.getlist(‘option1’)来获取它们的值列表。
  • 在处理表单数据时,始终要验证和清理数据,以防止注入攻击和其他安全风险。
  • 对于生产环境,CGI可能不是最佳的选择,因为它的性能和安全性问题。可以考虑使用更现代的Web框架,如Django或Flask。

通过CGI程序传递Radio数据

通过CGI程序传递单选按钮(radio button)数据与传递复选框数据类似。单选按钮允许用户从一组选项中选择一个值。在HTML表单中,所有具有相同名称的单选按钮都属于同一个组。
以下是如何在HTML表单中创建单选按钮以及如何在CGI程序中接收这些数据的示例。

创建HTML表单

<form action="your_script.cgi" method="POST"><input type="radio" name="choice" value="Option A"> Option A<input type="radio" name="choice" value="Option B"> Option B<input type="radio" name="choice" value="Option C"> Option C<input type="submit" value="Submit">
</form>

在这个表单中,所有单选按钮都具有相同的名称"choice",但它们有不同的value属性。

编写CGI脚本

在Python中,你可以使用cgi.FieldStorage()类来解析表单数据。由于单选按钮属于同一个组,你只需要检查它们的名称即可获取选中的值。

#!/usr/bin/env python3
import cgi
import cgitb
cgitb.enable()  # This line enables CGI error reportingform = cgi.FieldStorage()# 获取选中的单选按钮的值
choice = form.getvalue('choice')print("Content-Type: text/html")  # HTTP header to specify content type
print()  # Blank line required, end of headersprint("<html>")
print("<head>")
print("<title>Radio Button Result</title>")
print("</head>")
print("<body>")
print("<p>Chosen Option: {}</p>".format(choice))
print("</body>")
print("</html>")

我们使用form.getvalue(‘choice’)来获取选中单选按钮的值。如果单选按钮被选中,getvalue()将返回选中项的value属性值。

注意事项

  • 如果单选按钮被选中,它们的值将以字符串的形式返回。
  • 在处理表单数据时,始终要验证和清理数据,以防止注入攻击和其他安全风险。
  • 对于生产环境,CGI可能不是最佳的选择,因为它的性能和安全性问题。可以考虑使用更现代的Web框架,如Django或Flask。

通过CGI程序传递 Textarea 数据

在HTML中,元素用于创建多行文本输入框,允许用户输入较长的文本。当用户通过表单提交数据时,中的文本会被发送到服务器。在CGI程序中处理数据的方法与处理其他表单元素(如单选按钮、复选框或输入框)类似。
以下是如何在HTML表单中创建元素,以及如何在CGI程序中接收和处理这些数据的示例。

创建HTML表单

<form action="your_script.cgi" method="POST"><label for="description">Description:</label><textarea id="description" name="description" rows="4" cols="50">Enter your description here.</textarea><input type="submit" value="Submit">
</form>

编写CGI脚本

在Python中,你可以使用cgi.FieldStorage()类来解析表单数据。然后,你可以使用getvalue()方法来获取元素的值。

#!/usr/bin/env python3
import cgi
import cgitb
cgitb.enable()  # This line enables CGI error reportingform = cgi.FieldStorage()# 获取<textarea>元素的值
description = form.getvalue('description', '')print("Content-Type: text/html")  # HTTP header to specify content type
print()  # Blank line required, end of headersprint("<html>")
print("<head>")
print("<title>Textarea Result</title>")
print("</head>")
print("<body>")
print("<p>Description: {}</p>".format(description))
print("</body>")
print("</html>")

我们使用form.getvalue(‘description’)来获取元素的值。如果元素没有被填写,getvalue()将返回一个空字符串。

注意事项

  • 元素的值作为字符串发送,因此CGI脚本应该将它们作为字符串处理。
  • 在处理用户输入时,应始终验证和清理数据,以防止注入攻击和其他安全风险。
  • 对于生产环境,CGI可能不是最佳选择,因为它的性能和安全性问题。可以考虑使用更现代的Web框架,如Django或Flask。

通过CGI程序传递下拉数据

通过CGI程序传递下拉菜单(dropdown menu)数据与传递其他表单元素(如单选按钮、复选框或文本域)类似。在HTML中,下拉菜单由元素实现,用户可以从提供的选项中选择一个值。当表单通过CGI程序提交时,下拉菜单的数据将以名称-值对的形式发送。
以下是如何在HTML表单中创建下拉菜单以及如何在CGI程序中接收这些数据的示例。

创建HTML表单

<form action="your_script.cgi" method="POST"><label for="select_option">Choose an option:</label><select id="select_option" name="select_option"><option value="Option A">Option A</option><option value="Option B">Option B</option><option value="Option C">Option C</option></select><input type="submit" value="Submit">
</form>

元素的name属性被设置为"select_option",这意味着当表单被提交时,所选选项的value属性值将被发送到名为select_option的CGI变量。

编写CGI脚本

在Python中,你可以使用cgi.FieldStorage()类来解析表单数据。然后,你可以使用getvalue()方法来获取下拉菜单的值。

#!/usr/bin/env python3
import cgi
import cgitb
cgitb.enable()  # This line enables CGI error reportingform = cgi.FieldStorage()# 获取下拉菜单的值
select_option = form.getvalue('select_option')print("Content-Type: text/html")  # HTTP header to specify content type
print()  # Blank line required, end of headersprint("<html>")
print("<head>")
print("<title>Dropdown Result</title>")
print("</head>")
print("<body>")
print("<p>Selected Option: {}</p>".format(select_option))
print("</body>")
print("</html>")

我们使用form.getvalue(‘select_option’)来获取下拉菜单的值。如果下拉菜单被选中,getvalue()将返回选中项的value属性值。

注意事项

  • 如果下拉菜单中的某个选项被选中,它的value属性值将被发送到服务器。
  • 在处理表单数据时,始终要验证和清理数据,以防止注入攻击和其他安全风险。
  • 对于生产环境,CGI可能不是最佳选择,因为它的性能和安全性问题。可以考虑使用更现代的Web框架,如Django或Flask。

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

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

相关文章

二维码门楼牌管理系统技术服务:门牌编设规则详解

文章目录 前言一、门牌编设规则解读二、区间编号与分段编号策略三、多出入口建筑物的门牌编设 前言 随着城市化的快速推进&#xff0c;门楼牌管理成为城市管理中不可或缺的一环。二维码门楼牌管理系统的引入&#xff0c;不仅提升了管理的效率&#xff0c;也为市民提供了更为便…

波奇学Liunx:信号的产生,保存,处理

信号的产生&#xff0c;信号的保存&#xff0c;信号的处理 在操作系统中进程接受到信号会保存&#xff0c;产生 进程必须识别和能够处理信号&#xff0c;处理信号是进程的内置功能 进程收到信号时不一定会立即执行&#xff0c;所以进程必然有一套识别&#xff0c;保存&#xff…

(1)预处理

我们需要的文件结构如上 main.cpp add.h add.cpp add.h 这里使用riscv的工具链编译为.i文件&#xff0c;需要使用-E&#xff0c;就是只进行预处理&#xff0c;我们可以得到两个.i文件即main.i和add.i main.i 这里看到main.i里头文件全部替换&#xff0c;然后多了三万多行 所以…

4G/5G执法记录仪、智能安全帽走国标GB28181接入海康、宇视等大平台,也可走平台与平台对接,以下级平台级联到上级大平台

AIoT万物智联&#xff0c;智能安全帽生产厂家&#xff0c;执法记录仪生产厂家&#xff0c;智能安全帽、智能头盔、头盔记录仪、执法记录仪、智能视频分析/边缘计算AI盒子、车载DVR/NVR、布控球、智能眼镜、智能手电、无人机4G补传系统等统一接入大型融合通信可视指挥调度平台VM…

Vue3和ElementPlus封装table组件

最近学习vue3.2并自己在写一个项目&#xff0c;然后发现好几个页面都是列表页&#xff0c;重复写table和column也是觉得累&#xff0c;学习的项目列表页不算多&#xff0c;要是公司项目就不一样了&#xff0c;所以就想着自己封装一个table组件&#xff0c;免去大量重复工作和co…

滑动窗口

题目 思路 对于一个数组区间的最值&#xff0c;可以开辟一个队列记录&#xff08;当然这里不能叫队列只是和队列相似&#xff0c;习惯性叫法)。 每个区间的最值等于队首元素。扫描数组时&#xff0c;如果该元素大于队尾元素&#xff08;取最大值时&#xff09;将该队尾元素出队…

DM数据库学习之路(二十)DM8基于主备集群技术的两地三中心集群部署及测试(全网最详细)

DM两地三中心介绍 摘要 金融行业对数据的可靠性和连续性有着极其严格的要求,任何数据丢失或服务中断都可能导致严重的经济损失。针对这一问题,基于达梦主备集群技术的两地三中心解决方案能够切实有效解决业务数据的可靠性和连续性需求。该方案通过构建两个数据中心和一个灾备…

解密Lawnchair:打造个性化极致的Android桌面体验

解密Lawnchair&#xff1a;打造个性化极致的Android桌面体验 1. 简介 Lawnchair是一款知名的Android桌面定制工具&#xff0c;旨在为用户提供个性化极致的桌面体验。作为一个开源项目&#xff0c;Lawnchair融合了简洁、灵活和强大的特点&#xff0c;让用户能够自由定制其Andro…

Python | Conda安装包报错:PackagesNotFoundError

Conda在下载安装包时报错&#xff1a; PackagesNotFoundError: The following packages are not available from current channels:- XXXXXX&#xff08;包名&#xff09;有如下两种解决方法&#xff1a; 方法一&#xff1a;将conda-forge添加到搜索路径上 在命令行运行下方指令…

深入理解C语言:开发属于你的三子棋小游戏

三子棋 1. 前言2. 准备工作3. 使用二维数组存储下棋的数据4. 初始化棋盘为全空格5. 打印棋盘6. 玩家下棋7. 电脑下棋8. 判断输赢9. 效果展示10. 完整代码 1. 前言 大家好&#xff0c;我是努力学习游泳的鱼&#xff0c;今天我们会用C语言实现三子棋。所谓三子棋&#xff0c;就是…

Android 开发环境搭建的步骤

本文将为您详细讲解 Android 开发环境搭建的步骤。搭建 Android 开发环境需要准备一些软件和工具&#xff0c;以下是一些基础步骤&#xff1a; 1. 安装 Java Development Kit (JDK) 首先&#xff0c;您需要安装 Java Development Kit (JDK)。JDK 是 Android 开发的基础&#xf…

【Android 内存优化】怎么理解Android PLT hook?

文章目录 前言什么是hook?PLT hook作用基本原理PLT hook 总体步骤 代码案例分析方案预研面临的问题怎么做&#xff1f;ELFELF 文件头SHT&#xff08;section header table&#xff09; 链接视图&#xff08;Linking View&#xff09;和执行视图&#xff08;Execution View&…

YOLO-World 简单无需标注无需训练直接可以使用的检测模型

参考: https://github.com/AILab-CVC/YOLO-World YOLO-World 常规的label基本不用训练,直接传入图片,然后写入文本label提示既可 案例demo: 1)官方提供 https://huggingface.co/spaces/stevengrove/YOLO-World https://huggingface.co/spaces/SkalskiP/YOLO-World 检测…

基于信息间隙决策理论的碳捕集电厂优化调度程序代码!

适用平台&#xff1a;MatlabYalmipCplex 程序在建立电厂与碳捕集装置协同调度模型的基础上&#xff0c;引入信息间隙决策理论(information gap decision theory, IGDT)以同时满足系统的鲁棒性和经济性要求&#xff0c;通过风险追求和风险规避&#xff12;种决策角度得到不同的…

真不愧是华为出来的,真的太厉害了。。。

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 实习去了博彦科技&#xff08;外包&#xff09;&#xff0c;做的就是螺丝钉的活&#xff0c;后面…

华为---MSTP(一)---MSTP生成树协议

目录 1. MSTP技术产生背景 2. STP/RSTP的缺陷 ​编辑 2.1 无法均衡流量负载 2.2 数据使用次优路径 3. MSTP生成树协议 3.1 MSTP相关概念 3.2 MSTP树生成的形成过程 4. MSTP报文 1. MSTP技术产生背景 RSTP在STP基础上进行了改进&#xff0c;实现了网络拓扑快速收敛。但…

SpringBoot+Maven项目打包

项目的主POM文件里面添加maven打包插件 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.2</version><configuration><sour…

推荐一款新的自动化测试框架:DrissionPage

今天给大家推荐一款基于Python的网页自动化工具&#xff1a;DrissionPage。这款工具既能控制浏览器&#xff0c;也能收发数据包&#xff0c;甚至能把两者合而为一&#xff0c;简单来说&#xff1a;集合了WEB浏览器自动化的便利性和 requests 的高效率优点。 一、DrissionPage框…

【C++庖丁解牛】默认成员函数

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 前言1. 构造函数1.1 …

职场高薪 |「中高级测试」面试题

【软件测试面试突击班】2024吃透软件测试面试最全八股文攻略教程&#xff0c;一周学完让你面试通过率提高90%&#xff01;&#xff08;自动化测试&#xff09; 一.基础题 1.测试用例你一般是怎么设计的&#xff0c;怎么可以提高覆盖率&#xff1f; 有没有形成自己的 一套方法论…