02 Python进阶:CGI编程

什么是CGI

CGI是通用网关接口(Common Gateway Interface)的缩写,它是一种标准协议,用于Web服务器执行外部程序或脚本与Web浏览器进行交互。通过CGI,Web服务器能够动态生成网页内容,处理用户提交的表单数据,并与数据库或其他外部资源进行交互。

基本上,当用户在网页上与Web表单进行交互时,表单数据将被发送到服务器并由CGI程序进行处理。CGI程序可以是任何编程语言编写的脚本(如Perl、Python、PHP、C++等),它接收来自Web服务器的数据,进行逻辑处理,生成新的页面内容,然后将其发送回给用户的浏览器展示。

在简单的例子中,CGI程序可以处理用户输入的数据,比如搜索关键词,然后从数据库中检索相应的结果,最后将结果呈现给用户。这使得网站可以根据用户的请求动态地生成内容,实现高度个性化和互动性。

需要注意的是,虽然CGI在过去广泛使用,但由于性能和安全性方面的考虑,现代的Web开发倾向于使用更先进的技术,如服务器端脚本语言(例如Node.js、Ruby on Rails)、API和框架(如Django、Flask)来取代传统的CGI程序。
在这里插入图片描述

Web服务器支持及配置

在你进行CGI编程前,确保您的Web服务器支持CGI及已经配置了CGI的处理程序。

Apache 支持CGI 配置:

设置好CGI目录:

ScriptAlias /cgi-bin/ /var/www/cgi-bin/

所有的HTTP服务器执行CGI程序都保存在一个预先配置的目录。这个目录被称为CGI目录,并按照惯例,它被命名为/var/www/cgi-bin目录。

CGI文件的扩展名为.cgi,python也可以使用.py扩展名。

默认情况下,Linux服务器配置运行的cgi-bin目录中为/var/www。

如果你想指定其他运行CGI脚本的目录,可以修改httpd.conf配置文件,如下所示:

<Directory "/var/www/cgi-bin">AllowOverride NoneOptions +ExecCGIOrder allow,denyAllow from all
</Directory>

在 AddHandler 中添加 .py 后缀,这样我们就可以访问 .py 结尾的 python 脚本文件:

AddHandler cgi-script .cgi .pl .py

第一个CGI程序

以下是一个简单的 Python CGI 程序的例子,它将接收用户输入,并返回一个包含输入内容的网页。在这个例子中,我们假设用户通过表单提交了一个名为 “name” 的字段。

#!/usr/bin/python
print("Content-type: text/html\n")  # 输出 HTTP 头部print("<html><head><title>CGI Example</title></head><body>")
print("<h1>CGI Example</h1>")
print("<p>Hello, ")import cgi
form = cgi.FieldStorage()  # 获取提交的表单数据
if "name" in form:print(form["name"].value)  # 打印用户输入的名字
else: print("Anonymous")  # 如果没有输入名字,默认为匿名用户
print("</p>")
print("</body></html>")

在这个例子中,我们首先输出 HTTP 头部,然后打印一个简单的 HTML 页面。接着,我们使用 Python 的 cgi 模块来获取用户提交的表单数据,并根据用户输入的名字进行相应的处理。

要让这个 Python CGI 程序生效,需要确保 Web 服务器已经启用了对 Python CGI 程序的支持。在 Apache 服务器中,你需要将这个 Python 文件放置在适当的 CGI 目录(一般为 /usr/lib/cgi-bin/ 目录),并且需要配置 Web 服务器以便它能够执行 Python 脚本。

请注意,上面的示例代码比较简单,并且忽略了安全性和错误处理方面的考虑。在实际开发中,你需要对用户输入进行验证和过滤,以确保安全性。

HTTP头部

HTTP头部(HTTP header)是在发送 HTTP 请求或响应时,用于传输额外信息的部分。它由若干行组成,每行包含一个字段和它的值,字段与值之间用冒号分隔。HTTP 头部通常包含以下几种类型的信息:

  1. 通用头部(General Headers):这些头部可以出现在请求和响应两种消息中,但与消息内容无关,通常包括 Cache-Control、Connection、Date 等。

  2. 请求头部(Request Headers):出现在客户端发送的 HTTP 请求中,用于描述客户端要求的资源或者客户端自身的信息,通常包括 Host、User-Agent、Accept 等。

  3. 响应头部(Response Headers):出现在服务器响应中,用于描述服务器返回的资源信息,通常包括 Server、Content-Type、Content-Length 等。

  4. 实体头部(Entity Headers):这些头部描述了实体主体部分内容,出现在请求或响应的消息体中,通常包括 Content-Length、Content-Type 等。

下面是一个 HTTP 头部的范例,展示了一些常见的字段:

HTTP/1.1 200 OK
Date: Tue, 24 Aug 2021 06:00:00 GMT
Server: Apache/2.4.6 (CentOS)
Content-Type: text/html; charset=UTF-8
Content-Length: 1234

在这个例子中,第一行是响应状态行;其后的几行是响应头部,包括 Date、Server、Content-Type 和 Content-Length 字段。
在这里插入图片描述

HTTP 头部在客户端和服务器之间传递额外的信息,它们对于确定如何处理请求或响应非常重要,并在 Web 通讯过程中发挥着关键的作用。

CGI环境变量

在这里插入图片描述
以下是一个简单的CGI脚本输出CGI的环境变量:

实例
#!/usr/bin/python3

import os

print (“Content-type: text/html”)
print ()
print (“<meta charset=“utf-8”>”)
print (“环境变量
”)
print (“

  • ”)
    for key in os.environ.keys():
    print (“
  • %30s : %s
  • ” % (key,os.environ[key]))
    print (“
”)

GET和POST方法

GET 和 POST 方法是 HTTP 协议中用于客户端与服务器进行信息交换的两种基本请求方法。

  1. GET 方法:GET 方法用于向服务器请求特定资源,通常用于获取数据。当客户端使用 GET 方法发送请求时,请求中的数据会被附在 URL 后面,以查询字符串的形式发送,例如:http://www.example.com/path/to/resource?param1=value1&param2=value2。由于数据附在 URL 后面,因此 GET 请求的数据长度有限制,并且会被保存在浏览器的历史记录和 Web 服务器的日志文件中。

  2. POST 方法:POST 方法通常用于向服务器提交数据,尤其是那些可能包含敏感信息的数据。与 GET 方法不同,POST 请求中的数据不会附在 URL 后面,而是作为请求的正文发送到服务器。因此,POST 请求对发送的数据长度没有限制,并且 POST 请求的数据不会被保存在浏览器历史记录或 Web 服务器日志文件中。

总的来说,GET 方法适合用于从服务器获取资源或数据,而 POST 方法适合用于向服务器提交数据。在实际应用中,需要根据具体的情况选择合适的请求方法。GET 请求通常用于读取数据,而 POST 请求通常用于修改数据或执行涉及状态改变的操作。

需要注意的是,不应该将敏感信息放在 GET 请求的 URL 中,因为这些信息可能会被保存在浏览器历史记录或 Web 服务器日志文件中,并且容易被第三方获取,而 POST 请求的数据传输相对更安全一些。

简单的表单实例:GET方法

下面是一个使用 GET 方法的简单 HTML 表单示例,它将用户输入的数据作为查询字符串附加在 URL 后面,并通过 GET 请求发送给服务器。假设用户输入的数据将用于搜索:

<!DOCTYPE html>
<html>
<head><title>GET 方法表单示例</title>
</head>
<body><h2>使用 GET 方法提交表单</h2><form action="search.php" method="get"><label for="searchQuery">搜索内容:</label><input type="text" id="searchQuery" name="q"><input type="submit" value="搜索"></form>
</body>
</html>

在这个例子中,用户可以在文本框中输入搜索内容,然后点击提交按钮。当用户提交表单时,浏览器会将用户输入的内容作为查询字符串附加在 URL 后面,类似于这样:

http://www.example.com/search.php?q=user_input

其中 search.php 是表单的提交目标页面,?q=user_input 是使用 GET 方法提交的查询字符串,其中 q 是表单字段的名称,user_input 是用户输入的内容。

在服务器端,可以通过对查询字符串进行解析来获取用户输入的数据,从而执行相关操作。例如,使用 PHP 可以通过 $_GET['q'] 来获取用户提交的搜索内容。

使用POST方法传递数据

下面是一个使用POST方法传递数据的表单示例。假设这个表单用于用户注册:

<!DOCTYPE html>
<html>
<head><title>使用POST方法提交表单</title>
</head>
<body><h2>用户注册</h2><form action="register.php" method="post"><label for="username">用户名:</label><input type="text" id="username" name="username"><br><br><label for="password">密码:</label><input type="password" id="password" name="password"><br><br><label for="email">邮箱:</label><input type="email" id="email" name="email"><br><br><input type="submit" value="注册"></form>
</body>
</html>

在这个例子中,用户可以填写用户名、密码和邮箱地址,然后点击“注册”按钮。当用户提交表单时,表单数据将作为请求的正文以POST方法发送到服务器端的register.php页面。

在服务器端的register.php页面,您可以通过解析POST请求来获取用户输入的用户名、密码和邮箱,并进行相应的处理。例如,使用PHP可以通过$_POST['username']$_POST['password']$_POST['email']来获取这些数据。

通过POST方法提交数据可以保护用户输入的隐私信息,因为表单数据不会直接显示在URL中,而是作为请求的一部分发送到服务器端。POST方法通常用于向服务器提交敏感信息或执行对服务器状态产生影响的操作。

通过CGI程序传递checkbox数据

通过 CGI 程序传递复选框(checkbox)数据的基本步骤如下:

  1. 创建包含复选框的 HTML 表单,让用户进行选择。
  2. 使用 CGI 程序处理用户提交的表单数据,并从中提取复选框的数值。
  3. 对于选中的复选框,CGI 程序可以将其值收集起来并进行处理。

以下是一个简单的例子:

HTML 表单代码 form.html

<!DOCTYPE html>
<html>
<head><title>通过CGI程序传递checkbox数据</title>
</head>
<body><h2>复选框示例</h2><form action="process_form.cgi" method="post"><input type="checkbox" name="fruit" value="apple"> 苹果<br><input type="checkbox" name="fruit" value="banana"> 香蕉<br><input type="checkbox" name="fruit" value="orange"> 橙子<br><input type="submit" value="提交"></form>
</body>
</html>

CGI 程序 process_form.cgi (使用 Python 作为示例):

#!/usr/bin/env python
import cgiform = cgi.FieldStorage()print("Content-Type: text/html\n")print("<html><body>")
print("<h2>已选择的水果:</h2>")
if "fruit" in form:if isinstance(form["fruit"], list):  # 如果有多个勾选项for value in form.getlist("fruit"):print("<p>{}</p>".format(value))else:  # 只有一个勾选项print("<p>{}</p>".format(form["fruit"].value))
else:print("<p>未选择任何水果</p>")
print("</body></html>")

在这个例子中,用户可以勾选苹果、香蕉和橙子,并提交表单。process_form.cgi CGI 程序将从表单中提取勾选的水果,然后生成一个简单的 HTML 页面来显示用户选择的水果。

通过CGI程序传递 Textarea 数据

通过 CGI 程序传递 Textarea 数据的基本步骤如下:

  1. 创建包含 Textarea 元素的 HTML 表单,让用户输入文本信息。
  2. 使用 CGI 程序处理用户提交的表单数据,并提取 Textarea 中的文本内容。
  3. 对于提取的文本内容,CGI 程序可以对其进行处理或显示。

以下是一个简单的例子:

HTML 表单代码 form.html

<!DOCTYPE html>
<html>
<head><title>通过CGI程序传递Textarea数据</title>
</head>
<body><h2>Textarea示例</h2><form action="process_form.cgi" method="post"><label for="message">请输入您的留言:</label><br><textarea id="message" name="message" rows="4" cols="50"></textarea><br><br><input type="submit" value="提交"></form>
</body>
</html>

CGI 程序 process_form.cgi (使用 Python 作为示例):

#!/usr/bin/env python
import cgiform = cgi.FieldStorage()print("Content-Type: text/html\n")print("<html><body>")
if "message" in form:message = form["message"].valueprint("<h2>您输入的留言是:</h2>")print("<p>{}</p>".format(message))
else:print("<h2>您未输入任何留言</h2>")
print("</body></html>")

在这个例子中,用户可以在 Textarea 中输入留言内容,然后提交表单。process_form.cgi CGI 程序将提取用户输入的留言内容,并生成一个简单的 HTML 页面来显示用户输入的留言。

通过CGI程序传递下拉数据

通过 CGI 程序传递下拉框(select)数据的基本步骤如下:

  1. 创建包含下拉框的 HTML 表单,让用户进行选择。
  2. 使用 CGI 程序处理用户提交的表单数据,并提取下拉框中选定的值。
  3. 对于选定的值,CGI 程序可以收集并处理它们。

以下是一个简单的例子:

HTML 表单代码 form.html

<!DOCTYPE html>
<html>
<head><title>通过CGI程序传递下拉数据</title>
</head>
<body><h2>下拉框示例</h2><form action="process_form.cgi" method="post"><label for="color">请选择您喜欢的颜色:</label><select id="color" name="color"><option value="red">红色</option><option value="blue">蓝色</option><option value="green">绿色</option></select><br><br><input type="submit" value="提交"></form>
</body>
</html>

CGI 程序 process_form.cgi (使用 Python 作为示例):

#!/usr/bin/env python
import cgiform = cgi.FieldStorage()print("Content-Type: text/html\n")print("<html><body>")
if "color" in form:selected_color = form["color"].valueprint("<h2>您选定的颜色是:</h2>")print("<p>{}</p>".format(selected_color))
else:print("<h2>您未选定任何颜色</h2>")
print("</body></html>")

在这个例子中,用户可以在下拉框中选择喜欢的颜色,然后提交表单。process_form.cgi CGI 程序将提取用户选择的颜色,并生成一个简单的 HTML 页面来显示用户选择的颜色。

CGI中使用Cookie

在 CGI 中使用 Cookie 可以通过设置响应头来创建和发送 Cookie 给客户端,同时也可以通过请求头从客户端接收和读取 Cookie 的值。下面是一个简单的示例来说明如何在 CGI 中使用 Cookie:

  1. 创建包含设置 Cookie 的 CGI 程序 set_cookie.cgi
#!/usr/bin/env python
print("Set-Cookie: user_id=12345; Expires=Wed, 09 Jun 2023 10:18:14 GMT")
print("Content-Type: text/html\n")print("<html><body>")
print("<h2>Cookie 已设置</h2>")
print("</body></html>")

在这里,Set-Cookie 头部用于设置名为 user_id 的 Cookie,并将其值设置为 12345,并且设置了过期时间。

  1. 创建包含读取 Cookie 的 CGI 程序 read_cookie.cgi
#!/usr/bin/env python
import osprint("Content-Type: text/html")
print()print("<html><body>")
if "HTTP_COOKIE" in os.environ:cookie_string = os.environ.get("HTTP_COOKIE")cookies = cookie_string.split('; ')for cookie in cookies:name, value = cookie.split('=')print("<p>Cookie 名称:{},值:{}</p>".format(name, value))print("</body></html>")

这个 CGI 程序可以从请求头中读取客户端传递的 Cookie,将其解析并显示出来。

请确保将以上两个 CGI 程序保存为 .cgi 文件,并在支持 CGI 的服务器上运行。第一个程序用于设置 Cookie,第二个程序用于读取和显示 Cookie 的值。根据实际需求和场景,你可以相应地设置和读取更多的 Cookie。

Cookie设置

在 CGI 中使用 Cookie 可以通过设置响应头来创建和发送 Cookie 给客户端,同时也可以通过请求头从客户端接收和读取 Cookie 的值。下面是一个简单的示例来说明如何在 CGI 中使用 Cookie:

  1. 创建包含设置 Cookie 的 CGI 程序 set_cookie.cgi
#!/usr/bin/env python
print("Set-Cookie: user_id=12345; Expires=Wed, 09 Jun 2023 10:18:14 GMT")
print("Content-Type: text/html\n")print("<html><body>")
print("<h2>Cookie 已设置</h2>")
print("</body></html>")

在这里,Set-Cookie 头部用于设置名为 user_id 的 Cookie,并将其值设置为 12345,并且设置了过期时间。

  1. 创建包含读取 Cookie 的 CGI 程序 read_cookie.cgi
#!/usr/bin/env python
import osprint("Content-Type: text/html")
print()print("<html><body>")
if "HTTP_COOKIE" in os.environ:cookie_string = os.environ.get("HTTP_COOKIE")cookies = cookie_string.split('; ')for cookie in cookies:name, value = cookie.split('=')print("<p>Cookie 名称:{},值:{}</p>".format(name, value))print("</body></html>")

这个 CGI 程序可以从请求头中读取客户端传递的 Cookie,将其解析并显示出来。

请确保将以上两个 CGI 程序保存为 .cgi 文件,并在支持 CGI 的服务器上运行。第一个程序用于设置 Cookie,第二个程序用于读取和显示 Cookie 的值。根据实际需求和场景,你可以相应地设置和读取更多的 Cookie。

检索Cookie信息

在 CGI 中,你可以通过读取客户端请求中的请求头来获取 Cookie 信息。以下是一个用 Python 编写的示例程序,演示了如何在 CGI 中检索和解析客户端传递的 Cookie 信息:

#!/usr/bin/env python
import osprint("Content-Type: text/html")
print()print("<html><body>")
if "HTTP_COOKIE" in os.environ:cookie_string = os.environ.get("HTTP_COOKIE")cookies = cookie_string.split('; ')print("<h2>检索到的Cookie信息:</h2>")for cookie in cookies:name, value = cookie.strip().split('=')print("<p>{}: {}</p>".format(name, value))else:print("<h2>没有找到Cookie信息</h2>")print("</body></html>")

在这个示例中,我们从 os.environ 中获取了名为 HTTP_COOKIE 的请求头部分,并使用它来提取传递的 Cookie 信息。然后将其解析并显示在 HTML 页面上。

请确保将以上代码保存为 .cgi 文件,并在支持 CGI 的服务器上运行。当客户端向该 CGI 程序发出请求时,它会解析并显示客户端发送的所有 Cookie 信息。

文件上传实例

在 Web 开发中,文件上传是一个常见的需求。你可以使用 HTML 表单和后端 CGI 来实现文件上传。以下是一个简单的示例,在这个示例中,我们将展示如何使用 HTML 表单和 Python CGI 来进行文件上传。

首先,让我们创建一个 HTML 表单来允许用户上传文件:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>文件上传示例</title>
</head>
<body><h2>文件上传示例</h2><form action="upload_file.cgi" method="post" enctype="multipart/form-data"><input type="file" name="file" /><input type="submit" value="上传" /></form>
</body>
</html>

接下来,创建名为 upload_file.cgi 的 CGI 脚本来处理文件上传:

#!/usr/bin/env python
import cgi
import osform = cgi.FieldStorage()if "file" in form:fileitem = form["file"]if fileitem.file:# 指定文件保存路径filepath = '/path/to/save/' + os.path.basename(fileitem.filename)# 保存文件with open(filepath, 'wb') as f:f.write(fileitem.file.read())print("Content-Type: text/html\n")print("<html><body>")print("<h2>文件上传成功!</h2>")print("<p>文件保存路径:{}</p>".format(filepath))print("</body></html>")else:print("Content-Type: text/html\n")print("<html><body>")print("<h2>没有选择要上传的文件!</h2>")print("</body></html>")
else:print("Content-Type: text/html\n")print("<html><body>")print("<h2>没有找到文件字段!</h2>")print("</body></html>")

确保将 upload_file.cgi 中的 /path/to/save/ 替换为服务器上实际用于保存文件的目录路径。

以上代码将允许用户通过 HTML 表单上传文件,并将文件保存到服务器指定的路径中。请注意,对于文件上传功能,需要添加适当的安全措施来验证上传的文件类型、大小以及处理可能存在的安全风险。

文件下载对话框

要在Web页面上实现文件下载对话框,你可以通过HTML超链接和HTTP头部信息来实现。以下是一个简单的示例:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>文件下载示例</title>
</head>
<body><h2>文件下载示例</h2><a href="download_file.cgi?filename=file.txt">点击这里下载文件</a>
</body>
</html>

在上面的示例中,我们创建了一个包含超链接的HTML页面,当用户点击超链接时,它将调用名为 download_file.cgi 的CGI脚本,并传递了要下载的文件名作为参数。

下面是 download_file.cgi 的代码示例,它将发送HTTP头部信息告诉浏览器响应内容是一个文件,并指定该文件的名称:

#!/usr/bin/env pythonprint("Content-Type: application/octet-stream")
print("Content-Disposition: attachment; filename=file.txt")
print()
with open('/path/to/your/file/file.txt', 'rb') as f:print(f.read())

在上面的示例中,download_file.cgi CGI脚本发送了HTTP头部信息告诉浏览器响应内容是一个文件(MIME类型为application/octet-stream),并且通过 Content-Disposition 头部指定了使用附件方式下载,并指定了文件名为 file.txt。接着,在空行后输出了文件的内容。

请注意,你需要将 /path/to/your/file/file.txt 替换为实际文件的路径。

这样,当用户点击链接时,浏览器会显示文件下载对话框,提示用户下载文件。

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

在这里插入图片描述

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

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

相关文章

33-5 XXE漏洞 - xxe外部实体注入相关工具

1)xxe.sh || OOB XXE tool:一个方便的网站,可以输入您的域名并生成OOB XXE PoC。适用于盲注Out-of-band攻击。(主要) 2)staaldraad/xxeserv :简化FTP服务器的设置,以通过FTP接收OOB XXE攻击 以下是 ./xxeserv 命令的使用说明: Usage of ./xxeserv:-o string记录日志…

js的Proxy和Reflect

目录 Proxy对象的基本操作常见捕获器getset函数相关拦截器 ReflectReflect与基本语法的区别Reflect常见方法 Proxy和Reflect 在 ES6之前&#xff0c;如果我们对对象进行 新增或者删除属性时&#xff0c;仅靠原有的 Object.defineProperty是无法 监听的&#xff0c;基于此&a…

QT4-QT5-VS2019-编译无法打开文件 QtCore/qchar.h

1.系统环境变量 添加QTDIR 添加PATH 2.项目配置 2.1vc目录&#xff1a;包含目录库目录 2.2C/C 常规&#xff1a;附加包含目录QT5的头文件必须在附加包含目录里配置。 2.3链接器&#xff1a;附加库目录 2.4QTProject Settings

镜舟科技荣获第十三届中国智能制造高峰论坛两项大奖

2024年3月29日&#xff0c;由e-works数字化企业网和湖北省中小企业服务中心联合主办&#xff0c;中国中小企业发展促进中心指导的“第十三届中国智能制造高峰论坛暨第二十一届中国智能制造岁末盘点颁奖典礼”在北京圆满落幕。本次论坛汇聚了国内外智能制造领域的专家学者、企业…

有效的职场沟通及其重要性

欢迎来到职场沟通的世界&#xff0c;在这里&#xff0c;每一个词都至关重要&#xff0c;沉默则能传达出无尽的信息。一个有效沟通能力不仅仅是在线办公套件中的可选配件&#xff0c;而是一项绝对必需的能力。今天我们与您分享有效的职场沟通及其重要性。有效的职场沟通可以增强…

Redis高可用及持久化

文章目录 一、Redis高可用1、Redis高可用概述2、Redis高可用策略 二、Redis持久化1、Redis持久化的功能2、Redis持久化的两种方式2.1 RDB持久化2.2 AOF持久化&#xff08;append only file&#xff09; 3、RDB持久化3.1 触发条件3.1.1 手动触发3.1.2 自动触发3.1.2.1 配置方式3…

桶排序---

1、算法概念 桶排序&#xff1a;一种非比较的排序算法。桶排序采用了一些分类和分治的思想&#xff0c;把元素的值域分成若干段&#xff0c;每一段对应一个桶。在排序的时候&#xff0c;首先把每一个元素放到其对应的桶中&#xff0c;再对每一个桶中的元素分别排序&#xff0c…

EF数据持久化(三层架构,公司查,改)

效果图 Model设置具体流程在下面链接中 https://blog.csdn.net/Mr_wangzu/article/details/136805824?spm1001.2014.3001.5501 DAL using System; using System.Collections.Generic; using System.Linq; using System.Web; using WebApplication2.Models; namespace WebAppli…

结构体,联合体,枚举( 2 )

目录 2.联合体 2.1联合体类型的声明 2.2联合体的特点 2.3联合体的内存大小 3.枚举 3.1枚举类型的声明 3.2枚举类型的优点 3.3枚举类型的使用 2.联合体 联合体&#xff08;Union&#xff09;是另一种复合数据类型&#xff0c;它允许我们在同一内存位置存储不同的数据类型…

UE4_动画基础_ 瞄准偏移1D(Aim Offset Blend Space 1D)

瞄准偏移1D基本上可以完成角色的向左看向右看或者向上看向下看&#xff0c;像混合空间1D一样只有一个轴向可用。 操作步骤&#xff1a; 1、新建第三人称模板项目。 2、右键——动画——瞄准偏移1D 选取骨骼 双击打开 3、瞄准偏移混合的是姿势&#xff0c;我们需要创建姿势。 …

结合创新!多尺度特征融合+Transformer,参数和计算成本减半

通过多尺度特征融合&#xff0c;模型能够捕捉到不同层次的视觉细节&#xff0c;而Transformer的自注意力机制能够在这些不同层次的特征之间建立联系&#xff0c;有效地整合全局上下文信息&#xff0c;让模型能够应对多样化的视觉场景和变化。 这种结合策略充分利用了二者各自的…

库位电子标签可视化管理,让仓库更智能

一、工厂仓储的目前管理现状 目前工厂仓储管理存在诸多问题&#xff0c;如物料数量种类多&#xff0c;寻找困难且耗时&#xff1b;盘点人力成本高且速度慢&#xff1b;存储位置不清晰&#xff0c;常找不到物料&#xff0c;且多发、少发、错料现象时有发生&#xff1b;系统与库…

SSTI模板注入(jinja2)

前面学习了SSTI中的smarty类型&#xff0c;今天学习了Jinja2&#xff0c;两种类型都是flask框架的&#xff0c;但是在注入的语法上还是有不同 SSTI&#xff1a;服务器端模板注入&#xff0c;也属于一种注入类型。与sql注入类似&#xff0c;也是通过凭借进行命令的执行&#xff…

C++ 中的 vector 的模拟实现【代码纯享】

文章目录 C 中的 vector 模拟实现1. vector 的基本概念2. vector 的基本操作3. vector 的模拟实现4.代码纯享5. 总结 C 中的 vector 模拟实现 在 C 中&#xff0c;vector 是一个非常重要的容器&#xff0c;它提供了动态数组的功能。在本篇博客中&#xff0c;我们将尝试模拟实现…

函数参数缺省和内联函数【C++】

文章目录 函数参数缺省函数参数缺省的条件和要求 内联函数内联函数的工作原理内联函数的定义方法内联函数的要求解决方法&#xff1a;直接在.h中定义内联函数的函数体 内联函数再Debug模式下默认是不展开的 函数参数缺省 顾名思义&#xff1a;可以少传一个/多个参数给函数&…

防止推特Twitter账号被冻结,应该选什么代理类型IP?

在处理多个 Twitter 帐号时&#xff0c;选择合适的代理IP对于避免大规模帐户暂停至关重要。现在&#xff0c;问题出现了&#xff1a;哪种类型的代理是满足您需求的最佳选择&#xff1f;下面文章将为你具体讲解推特账号冻结原因以及重点介绍如何选择代理IP。 一、推特账号被冻结…

3个 JavaScript 字符串截取方法

在 JavaScript 中&#xff0c;可以使用 substr()、slice() 和 substring() 方法截取字符串. substring() substring() 方法返回一个字符串在开始索引到结束索引之间的一个子集&#xff0c;或从开始索引直到字符串的末尾的一个子集。语法如下&#xff1a; str.substring(inde…

通信术语:初学者入门指南(二)

1.SAR&#xff1a;Synthetic Aperture Radar合成孔径雷达&#xff0c;是一种雷达系统&#xff0c;通常用于地球或行星的遥感成像。相较于传统的实孔径雷达&#xff0c;SAR 通过在相对较长的时间内&#xff0c;对来自同一地点的多个雷达反射信号进行综合处理&#xff0c;实现了更…

【C+ +】第一个C+ + 项目的创建及namespace命名空间解释C++中的输入输出

目录 1.创建第一个c项目 1.1项目创建 1.2 .cpp源文件建立 1.3 第一个c程序hello world对比c语言hello world 2.命名空间 2.1 C关键字 2.2 命名空间---解决c语言中的命名冲突 2.2.1 namespace命名空间用法 2.2.2 &#xff1a;&#xff1a; 预作用限定符 2.2.3 命名空间的嵌套…

【嵌入式智能产品开发实战】(七)—— 政安晨:通过ARM-Linux掌握基本技能【环境准备:树莓派】

目录 Raspberry Pi OS 下载系统镜像 使用SSH客户端登陆 升级更新 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 嵌入式智能产品开发实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正…