三周精通FastAPI:41 部署:FastAPI版本和HTTPS概念

news2024/11/14 14:40:16

官方文档:https://fastapi.tiangolo.com/zh/deployment/versions/

关于 FastAPI 版本¶

FastAPI 已在许多应用程序和系统的生产环境中使用。 并且测试覆盖率保持在100%。 但其开发进度仍在快速推进。

经常添加新功能,定期修复错误,并且代码仍在持续改进。

这就是为什么当前版本仍然是0.x.x,这反映出每个版本都可能有Breaking changes。 这遵循语义版本控制的约定。

你现在就可以使用 FastAPI 创建生产环境应用程序(你可能已经这样做了一段时间),你只需确保使用的版本可以与其余代码正确配合即可。

固定你的 fastapi 版本¶

你应该做的第一件事是将你正在使用的 FastAPI 版本“固定”到你知道适用于你的应用程序的特定最新版本。

例如,假设你在应用程序中使用版本0.45.0

如果你使用requirements.txt文件,你可以使用以下命令指定版本:

fastapi==0.45.0 

这意味着你将使用版本0.45.0

或者你也可以将其固定为:

fastapi>=0.45.0,<0.46.0 

这意味着你将使用0.45.0或更高版本,但低于0.46.0,例如,版本0.45.2仍会被接受。

如果你使用任何其他工具来管理你的安装,例如 Poetry、Pipenv 或其他工具,它们都有一种定义包的特定版本的方法。

可用版本¶

你可以在发行说明中查看可用版本(例如查看当前最新版本)。

关于版本¶

遵循语义版本控制约定,任何低于1.0.0的版本都可能会添加 breaking changes。

FastAPI 还遵循这样的约定:任何PATCH版本更改都是为了bug修复和non-breaking changes。

Tip

"PATCH"是最后一个数字,例如,在0.2.3中,PATCH版本是3

因此,你应该能够固定到如下版本:

fastapi>=0.45.0,<0.46.0 

"MINOR"版本中会添加breaking changes和新功能。

Tip

"MINOR"是中间的数字,例如,在0.2.3中,MINOR版本是2

升级FastAPI版本¶

你应该为你的应用程序添加测试。

使用 FastAPI 编写测试非常简单(感谢 Starlette),请参考文档:测试

添加测试后,你可以将 FastAPI 版本升级到更新版本,并通过运行测试来确保所有代码都能正常工作。

如果一切正常,或者在进行必要的更改之后,并且所有测试都通过了,那么你可以将fastapi固定到新的版本。

关于Starlette¶

你不应该固定starlette的版本。

不同版本的 FastAPI 将使用特定的较新版本的 Starlette。

因此,FastAPI 自己可以使用正确的 Starlette 版本。

关于 Pydantic¶

Pydantic 包含针对 FastAPI 的测试及其自己的测试,因此 Pydantic 的新版本(1.0.0以上)始终与 FastAPI 兼容。

你可以将 Pydantic 固定到适合你的1.0.0以上和2.0.0以下的任何版本。

例如:

pydantic>=1.2.0,<2.0.0 

关于 HTTPS¶

人们很容易认为 HTTPS 仅仅是“启用”或“未启用”的东西。

但实际情况比这复杂得多。

提示

如果你很赶时间或不在乎,请继续阅读下一部分,下一部分会提供一个step-by-step的教程,告诉你怎么使用不同技术来把一切都配置好。

要从用户的视角了解 HTTPS 的基础知识,请查看 How HTTPS works - How HTTPS works。

现在,从开发人员的视角,在了解 HTTPS 时需要记住以下几点:

  • 要使用 HTTPS,服务器需要拥有由第三方生成的"证书(certificate)"
    • 这些证书实际上是从第三方获取的,而不是“生成”的。
  • 证书有生命周期
    • 它们会过期
    • 然后它们需要更新再次从第三方获取
  • 连接的加密发生在 TCP 层
    • 这是 HTTP 协议下面的一层
    • 因此,证书和加密处理是在 HTTP之前完成的。
  • TCP 不知道域名。 仅仅知道 IP 地址。
    • 有关所请求的 特定域名 的信息位于 HTTP 数据中。
  • HTTPS 证书“证明”某个域名,但协议和加密发生在 TCP 层,在知道正在处理哪个域名之前
  • 默认情况下,这意味着你每个 IP 地址只能拥有一个 HTTPS 证书
    • 无论你的服务器有多大,或者服务器上的每个应用程序有多小。
    • 不过,对此有一个解决方案
  • TLS 协议(在 HTTP 之下的TCP 层处理加密的协议)有一个扩展,称为 SNI
    • SNI 扩展允许一台服务器(具有 单个 IP 地址)拥有 多个 HTTPS 证书 并提供 多个 HTTPS 域名/应用程序
    • 为此,服务器上会有单独的一个组件(程序)侦听公共 IP 地址,这个组件必须拥有服务器中的所有 HTTPS 证书
  • 获得安全连接后,通信协议仍然是HTTP
    • 内容是 加密过的,即使它们是通过 HTTP 协议 发送的。

通常的做法是在服务器上运行一个程序/HTTP 服务器管理所有 HTTPS 部分:接收加密的 HTTPS 请求, 将 解密的 HTTP 请求 发送到在同一服务器中运行的实际 HTTP 应用程序(在本例中为 FastAPI 应用程序),从应用程序中获取 HTTP 响应, 使用适当的 HTTPS 证书对其进行加密并使用 HTTPS 将其发送回客户端。 此服务器通常被称为 TLS 终止代理(TLS Termination Proxy)

你可以用作 TLS 终止代理的一些选项包括:

  • Traefik(也可以处理证书更新)
  • Caddy(也可以处理证书更新)
  • Nginx
  • HAProxy

Let's Encrypt¶

在 Let's Encrypt 之前,这些 HTTPS 证书 由受信任的第三方出售。

过去,获得这些证书的过程非常繁琐,需要大量的文书工作,而且证书非常昂贵。

但随后 Let's Encrypt 创建了。

它是 Linux 基金会的一个项目。 它以自动方式免费提供 HTTPS 证书。 这些证书可以使用所有符合标准的安全加密,并且有效期很短(大约 3 个月),因此安全性实际上更好,因为它们的生命周期缩短了。

域可以被安全地验证并自动生成证书。 这还允许自动更新这些证书。

我们的想法是自动获取和更新这些证书,以便你可以永远免费拥有安全的 HTTPS

面向开发人员的 HTTPS¶

这里有一个 HTTPS API 看起来是什么样的示例,我们会分步说明,并且主要关注对开发人员重要的部分。

域名¶

第一步我们要先获取一些域名(Domain Name)。 然后可以在 DNS 服务器(可能是你的同一家云服务商提供的)中配置它。

你可能拥有一个云服务器(虚拟机)或类似的东西,并且它会有一个固定 公共IP地址

在 DNS 服务器中,你可以配置一条记录(“A 记录”)以将 你的域名 指向你服务器的公共 IP 地址

这个操作一般只需要在最开始执行一次。

Tip

域名这部分发生在 HTTPS 之前,由于这一切都依赖于域名和 IP 地址,所以先在这里提一下。

DNS¶

现在让我们关注真正的 HTTPS 部分。

首先,浏览器将通过 DNS 服务器 查询域名的IP 是什么,在本例中为 someapp.example.com

DNS 服务器会告诉浏览器使用某个特定的 IP 地址。 这将是你在 DNS 服务器中为你的服务器配置的公共 IP 地址。

TLS 握手开始¶

然后,浏览器将在端口 443(HTTPS 端口)上与该 IP 地址进行通信。

通信的第一部分只是建立客户端和服务器之间的连接并决定它们将使用的加密密钥等。

客户端和服务器之间建立 TLS 连接的过程称为 TLS 握手

带有 SNI 扩展的 TLS¶

服务器中只有一个进程可以侦听特定 IP 地址的特定 端口。 可能有其他进程在同一 IP 地址的其他端口上侦听,但每个 IP 地址和端口组合只有一个进程。

TLS (HTTPS) 默认使用端口443。 这就是我们需要的端口。

由于只有一个进程可以监听此端口,因此监听端口的进程将是 TLS 终止代理

TLS 终止代理可以访问一个或多个 TLS 证书(HTTPS 证书)。

使用上面讨论的 SNI 扩展,TLS 终止代理将检查应该用于此连接的可用 TLS (HTTPS) 证书,并使用与客户端期望的域名相匹配的证书。

在这种情况下,它将使用someapp.example.com的证书。

客户端已经信任生成该 TLS 证书的实体(在本例中为 Let's Encrypt,但我们稍后会看到),因此它可以验证该证书是否有效。

然后,通过使用证书,客户端和 TLS 终止代理 决定如何加密 TCP 通信 的其余部分。 这就完成了 TLS 握手 部分。

此后,客户端和服务器就拥有了加密的 TCP 连接,这就是 TLS 提供的功能。 然后他们可以使用该连接来启动实际的 HTTP 通信

这就是 HTTPS,它只是 安全 TLS 连接 内的普通 HTTP,而不是纯粹的(未加密的)TCP 连接。

Tip

请注意,通信加密发生在 TCP 层,而不是 HTTP 层。

HTTPS 请求¶

现在客户端和服务器(特别是浏览器和 TLS 终止代理)具有 加密的 TCP 连接,它们可以开始 HTTP 通信

接下来,客户端发送一个 HTTPS 请求。 这其实只是一个通过 TLS 加密连接的 HTTP 请求。

解密请求¶

TLS 终止代理将使用协商好的加密算法解密请求,并将(解密的)HTTP 请求传输到运行应用程序的进程(例如运行 FastAPI 应用的 Uvicorn 进程)。

HTTP 响应¶

应用程序将处理请求并向 TLS 终止代理发送(未加密)HTTP 响应

HTTPS 响应¶

然后,TLS 终止代理将使用之前协商的加密算法(以someapp.example.com的证书开头)对响应进行加密,并将其发送回浏览器。

接下来,浏览器将验证响应是否有效和是否使用了正确的加密密钥等。然后它会解密响应并处理它。

客户端(浏览器)将知道响应来自正确的服务器,因为它使用了他们之前使用 HTTPS 证书 协商出的加密算法。

多个应用程序¶

在同一台(或多台)服务器中,可能存在多个应用程序,例如其他 API 程序或数据库。

只有一个进程可以处理特定的 IP 和端口(在我们的示例中为 TLS 终止代理),但其他应用程序/进程也可以在服务器上运行,只要它们不尝试使用相同的 公共 IP 和端口的组合

这样,TLS 终止代理就可以为多个应用程序处理多个域名的 HTTPS 和证书,然后在每种情况下将请求传输到正确的应用程序。

证书更新¶

在未来的某个时候,每个证书都会过期(大约在获得证书后 3 个月)。

然后,会有另一个程序(在某些情况下是另一个程序,在某些情况下可能是同一个 TLS 终止代理)与 Let's Encrypt 通信并更新证书。

TLS 证书 与域名相关联,而不是与 IP 地址相关联。

因此,要更新证书,更新程序需要向权威机构(Let's Encrypt)证明它确实“拥有”并控制该域名

有多种方法可以做到这一点。 一些流行的方式是:

  • 修改一些DNS记录
    • 为此,续订程序需要支持 DNS 提供商的 API,因此,要看你使用的 DNS 提供商是否提供这一功能。
  • 在与域名关联的公共 IP 地址上作为服务器运行(至少在证书获取过程中)。
    • 正如我们上面所说,只有一个进程可以监听特定的 IP 和端口。
    • 这就是当同一个 TLS 终止代理还负责证书续订过程时它非常有用的原因之一。
    • 否则,你可能需要暂时停止 TLS 终止代理,启动续订程序以获取证书,然后使用 TLS 终止代理配置它们,然后重新启动 TLS 终止代理。 这并不理想,因为你的应用程序在 TLS 终止代理关闭期间将不可用。

通过拥有一个单独的系统来使用 TLS 终止代理来处理 HTTPS, 而不是直接将 TLS 证书与应用程序服务器一起使用 (例如 Uvicorn),你可以在 更新证书的过程中同时保持提供服务。

回顾¶

拥有HTTPS 非常重要,并且在大多数情况下相当关键。 作为开发人员,你围绕 HTTPS 所做的大部分努力就是理解这些概念以及它们的工作原理。

一旦你了解了面向开发人员的 HTTPS 的基础知识,你就可以轻松组合和配置不同的工具,以帮助你以简单的方式管理一切。

在接下来的一些章节中,我将向你展示几个为 FastAPI 应用程序设置 HTTPS 的具体示例。 🔒

申请Cerbot的HTTPS服务

 网站:Certbot

a project of the Electronic Frontier Foundation 。采用的是Automatic Certificate Management Environment (ACME):RFC 8555 - Automatic Certificate Management Environment (ACME)

Certbot 是一个用于自动获取和管理 Let's Encrypt 提供的免费 SSL/TLS 证书的工具。要使用 Certbot 获取有效的 HTTPS 证书,通常需要具备以下条件:

  1. 有效的域名:Let's Encrypt 需要验证您对域名的所有权,以确保证书仅颁发给合法的域名拥有者。
  2. 可访问的服务器:需要确保域名指向的服务器能够通过互联网访问,以便完成域名验证过程。

一如既往,个人习惯使用nginx作为后端,因此在Cerbot网站,选择Website为Nginx ,操作系统可以根据自己的实际情况选择,比如Ubuntu Linux和FreeBSD。

Ubuntu Linux下申请步骤

Certbot Instructions | Certbot

  1. SSH into the server

    SSH into the server running your HTTP website as a user with sudo privileges.

  2. Install system dependencies

    System dependencies may include Python 3.6+ including the venv module and Augeas for the Apache plugin.

    If you're having trouble installing cryptography, you may need to install additional dependencies. See  the cryptography project's site for more information.

    Commands to install system dependencies may look like the following, run on the commandline on the machine.

    For APT-based distributions (e.g. Debian, Ubuntu ...):

    1. sudo apt update
    2. sudo apt install python3 python3-venv libaugeas0

    For RPM-based distributions (e.g. Fedora, CentOS ...):

    sudo dnf install python3 augeas-libs

    Note that old distributions use yum instead of dnf, and that RHEL-based distributions use python3X instead of python3 (e.g. python36<).

    These packages may have slightly different names on other distributions; a search such as "augeas on " will probably yield helpful results.

  3. Remove certbot-auto and any Certbot OS packages

    If you have any Certbot packages installed using an OS package manager like aptdnf, or yum, you should remove them before installing the Certbot snap to ensure that when you run the command certbot the snap is used rather than the installation from your OS package manager. The exact command to do this depends on your OS, but common examples are sudo apt-get remove certbotsudo dnf remove certbot, or sudo yum remove certbot.

  4. Set up a Python virtual environment

    Execute the following instructions on the command line on the machine to set up a virtual environment.

    1. sudo python3 -m venv /opt/certbot/
    2. sudo /opt/certbot/bin/pip install --upgrade pip
  5. Install Certbot

    Run this command on the command line on the machine to install Certbot.

    sudo /opt/certbot/bin/pip install certbot certbot-nginx
  6. Prepare the Certbot command

    Execute the following instruction on the command line on the machine to ensure that the certbot command can be run.

    sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot
  7. Choose how you'd like to run Certbot

    Either get and install your certificates...

    Run this command to get a certificate and have Certbot edit your nginx configuration automatically to serve it, turning on HTTPS access in a single step.

    sudo certbot --nginx

    Or, just get a certificate

    If you're feeling more conservative and would like to make the changes to your nginx configuration by hand, run this command.

    sudo certbot certonly --nginx
  8. Set up automatic renewal

    We recommend running the following line, which will add a cron job to the default crontab.

    echo "0 0,12 * * * root /opt/certbot/bin/python -c 'import random; import time; time.sleep(random.random() * 3600)' && sudo certbot renew -q" | sudo tee -a /etc/crontab > /dev/null
  9. Confirm that Certbot worked

    To confirm that your site is set up properly, visit https://yourwebsite.com/ in your browser and look for the lock icon in the URL bar.

  10. [Monthly] Upgrade certbot

    It's important to occasionally update Certbot to keep it up-to-date. To do this, run the following command on the command line on the machine.

    sudo /opt/certbot/bin/pip install --upgrade certbot certbot-nginx

    If this step leads to errors, run sudo rm -rf /opt/certbot and repeat all installation instructions.

FreeBSD nginx下申请步骤

Certbot Instructions | Certbot

  1. SSH into the server

    SSH into the server running your HTTP website as a user with sudo privileges.

  2. Install Certbot

    Either install the Certbot package...

    Run this command on the command line on the machine to install the Certbot package.

    pkg install security/py-certbot-nginx

    Or, if you prefer, install Certbot from ports

    Run this command on the command line on the machine to install Certbot from ports.

    cd /usr/ports/security/py-certbot-nginx && make install clean
  3. Choose how you'd like to run Certbot

    Either get and install your certificates...

    Run this command to get a certificate and have Certbot edit your nginx configuration automatically to serve it, turning on HTTPS access in a single step.

    sudo certbot --nginx

    Or, just get a certificate

    If you're feeling more conservative and would like to make the changes to your nginx configuration by hand, run this command.

    sudo certbot certonly --nginx
  4. Test automatic renewal

    The Certbot packages on your system come with a cron job or systemd timer that will renew your certificates automatically before they expire. You will not need to run Certbot again, unless you change your configuration. You can test automatic renewal for your certificates by running this command:

    sudo certbot renew --dry-run

    The command to renew certbot is installed in one of the following locations:

    • /etc/crontab/
    • /etc/cron.*/*
    • systemctl list-timers
  5. Confirm that Certbot worked

    To confirm that your site is set up properly, visit https://yourwebsite.com/ in your browser and look for the lock icon in the URL bar.

实践

这次我们来进行申请https证书的实践。操作系统为Ubuntu22.04, web软件为nginx。 nginx尽管比uvicorn和Gunicorn要复杂一点点,但是它功能强大,它在性能优化、资源管理、安全性和可扩展性等方面带来了显著的优势,使得整个系统更加健壮和高效。因此,尤其在生产环境中,结合使用 nginx 和 uvicorn/Gunicorn 是一种常见且推荐的部署方式。

安装https证书相关软件

登录自己的服务器,执行命令安装相关软件:

首先创建python虚拟环境

安装python3软件

sudo apt update
sudo apt install python3 python3-venv libaugeas0

创建python虚拟环境

sudo python3 -m venv /opt/certbot/
sudo /opt/certbot/bin/pip install --upgrade pip

如果已经有了python的环境,那么apt install python3 python3-venv以及后面的创建虚拟环境都可以忽略 。

 删除系统自带的certbot包

sudo apt-get remove certbot

安装python环境里的certbot包

sudo /opt/certbot/bin/pip install certbot certbot-nginx

当然对于有自己python环境的情况,命令可以简化成:

pip install certbot certbot-nginx

 

将Certbot命令建立链接,链到/usr/bin目录

sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot

如果是自定义的python虚拟环境,则cerbot的路径要做相应的改变,比如:

sudo ln -s /mnt/data/work/py39/bin/certbot  /usr/bin/certbot 

申请certbot https证书 

开始申请证书,可以申请后自动进行nginx的配置:

sudo certbot --nginx

也可以只申请证书,再去手工配置nginx里的证书: 

sudo certbot certonly --nginx

因为cerbot已经ln链接到/usr/bin目录,所以cerbot指令是可以直接执行而不必输入路径。

我这里使用了只申请证书,手工配置nginx的方式:

sudo certbot certonly --nginx

执行后会询问email地址,

按照提示输入email地址,然后询问哪些域名申请https,建议所有。

直接回车就是所有域名

然后提示申请完毕

Requesting a certificate for quye.com and 4 more domains

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/quye.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/quye.com/privkey.pem
This certificate expires on 2025-02-10.
These files will be updated when the certificate renews.

NEXT STEPS:
- The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le

按照提示,去学习怎么设置自动续约,执行这条命令

SLEEPTIME=$(awk 'BEGIN{srand(); print int(rand()*(3600+1))}'); echo "0 0,12 * * * root sleep $SLEEPTIME && certbot renew -q" | sudo tee -a /etc/crontab > /dev/null

这条命令的实际效果是:每天的 00:00 和 12:00,系统将随机等待一段时间(最多 1 小时),然后在后台静默地尝试续订 Let's Encrypt 证书。

文件修改的是/etc/crontab文件:

0 0,12 * * * root sleep 2483 && certbot renew -q

原来每天一次续订还是太频繁了,可以修改成每月一次,可以手工vi修改crontab文件:

sudo vi /etc/crontab

0 0,12 1 * * root sleep 2483 && certbot renew -q

也可以执行下面命令:

SLEEPTIME=$(awk 'BEGIN{srand(); print int(rand()*(3600+1))}'); echo "0 0,12 1 * * root sleep $SLEEPTIME && certbot renew -q" | sudo tee -a /etc/crontab > /dev/null

确认服务

Confirm that Certbot worked

To confirm that your site is set up properly, visit https://yourwebsite.com/ in your browser and look for the lock icon in the URL bar.

配置nginx

在/etc/nginx/的配置文件quye.conf中添加一段配置

server {
    listen 443 ssl;
    server_name quye.com www.quye.com;

    ssl_certificate //letsencrypt/live/quye.com/fullchain.pem;
    ssl_certificate_key /etc//live/quye.com/privkey.pem;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    location / {
        root /mnt/quye;
        index index.html index.htm;
    }

    # 其他配置...
}
   

重启nginx

sudo service nginx restart

登录网站检验https

好了,现在使用登录网站:济宁市极快软件科技有限公司

可以看到现在的网站就有了https啦! 可以在浏览器查看网站证书,现在咱也是有证的人啦!

实践完成,收工!

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

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

相关文章

Pinpoint(APM)进阶--Pinot指标采集(System Metric/Inspector)

接上文 Pinpoint使用Pinot进行指标数据存储&#xff0c;Pinot流摄入需要Kafka 本文详解Kafka和Pinot的安装部署&#xff0c;以及Pinpoint的指标采集 Pinot 简介 Apache Pinot是一个实时分布式OLAP数据存储&#xff0c;专为低延迟、高吞吐量分析而构建&#xff0c;非常适合面…

ReactPress:重塑内容管理的未来

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议&#xff0c;欢迎一起共建&#xff0c;感谢Star。 ReactPress&#xff1a;重塑内容管理的未来 在当今信息爆炸的时代&#xff0c;一个高效、易用的内容管理系统&#xff0…

uniapp路由与页面跳转详解:API调用与Navigator组件实战

UniApp路由与页面跳转详解&#xff1a;API调用与Navigator组件实战 路由 uniapp页面路由为框架统一管理&#xff0c;开发者需要在page.json里面配置每个路由页面的路径及页面样式。 路由跳转 uniapp有两种页面路由跳转方式&#xff0c;调用API跳转和navigator组件跳转。 调…

35.Redis 7.0简介

2022 年 2 月初&#xff0c;Redis 7.0 迎来了首个候选发布&#xff08;RC&#xff09;版本。这款内存键值数据库迎来了“重大的性能优化”和其它功能改进&#xff0c;性能优化包括降低写入时复制内存的开销、提升内存效率&#xff0c;改进 fsync 来避免大量的磁盘写入和优化延迟…

MySQL技巧之跨服务器数据查询:基础篇-如何获取查询语句中的参数

MySQL技巧之跨服务器数据查询&#xff1a;基础篇-如何获取查询语句中的参数 上一篇已经描述&#xff1a;借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的连接名: MY_ODBC_MYSQL 以…

连续15年霸榜“双11”行业第一,九牧做对了什么?

文 | 螳螂观察&#xff08;TanglangFin&#xff09; 作者 | 余一 随着“双十一”的落幕&#xff0c;各类销售榜单再次成为热门话题。 天猫“双11”全周期589个品牌成交额破亿&#xff0c;其中苹果、海尔、美的、小米、九牧等45个品牌成交额突破10亿。 值得注意的是在绝大多…

【网页设计】HTML5 和 CSS3 提高

目标 能够说出 3~5 个 HTML5 新增布局和表单标签能够说出 CSS3 的新增特性有哪些 1. HTML5 的新特性 注&#xff1a;该部分所有内容可参考菜鸟教程菜鸟教程 - 学的不仅是技术&#xff0c;更是梦想&#xff01; (runoob.com) HTML5 的新增特性主要是针对于以前的不足&#xf…

Linux手动安装nginx

本次以安装nginx-1.12.2为例 1、首先说明一下,安装nginx之前需要安装如下素材: 2、开始安装 第一步,安装依赖yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel第二步,下载并安装nginx安装包(nginx官网:http://nginx.org/)# 下载 wget http://nginx…

基于springboot+vue实现的大型超市数据处理系统 (源码+L文+ppt)4-015

第4章 系统设计 本章主要讲述的是大型超市数据处理系统的设计开发结构&#xff0c;简单介绍了开发流程与数据库设计的原则以及数据表的关系结构图&#xff0c;并且详细的展示了数据表的内部结构信息与属性。 图4-2 大型超市数据处理系统总体结构图 4.4 数据表信息&#xff…

游戏引擎学习第七天

视频参考:https://www.bilibili.com/video/BV1QFmhYcE69 ERROR_DEVICE_NOT_CONNECTED 是一个错误代码&#xff0c;通常在调用 XInputGetState 或 XInputSetState 函数时返回&#xff0c;表示指定的设备未连接。通常会出现以下几种情况&#xff1a; 未连接控制器&#xff1a;如…

IEC60870-5-104 协议源码架构详细分析

IEC60870-5-104 协议源码架构 前言一、资源三、目录层级一二、目录层级二config/lib60870_config.hdependencies/READMEexamplesCMakeLists.txtcs101_master_balancedcs104_client_asyncmulti_client_servertls_clienttls_server说明 make这些文件的作用是否需要导入这些文件&a…

全面介绍软件安全测试分类,安全测试方法、安全防护技术、安全测试流程

一、软件系统设计开发运行安全 1、注重OpenSource组件安全检查和版本更新&#xff08;black duck&#xff09; 现在很多云、云服务器都是由开源的组件去搭成的&#xff0c;对于OpenSource组件应该去做一些安全检查和版本更新&#xff0c;尤其是版本管理&#xff0c;定期对在运…

Cent OS-7的Apache服务配置

WWW是什么&#xff1f; WWW&#xff08;World Wide Web&#xff0c;万维网&#xff09;是一个全球性的信息空间&#xff0c;其中的文档和其他资源通过URL标识&#xff0c;并通过HTTP或其他协议访问。万维网是互联网的一个重要组成部分&#xff0c;但它并不是互联网的全部。互联…

遗传算法与深度学习实战(23)——利用遗传算法优化深度学习模型

遗传算法与深度学习实战&#xff08;23&#xff09;——利用遗传算法优化深度学习模型 0. 前言1. 神经进化2. 使用遗传算法作为深度学习优化器小结系列链接 0. 前言 神经进化涵盖了所有用于改进深度学习的进化算法。更具体地说&#xff0c;神经进化用来定义应用于深度学习的特…

Kubernetes 核心组件调度器(Scheduler)

文章目录 一&#xff0c;调度约束1.Kubernetes的基本构建块和最小可调度单元pod创建过程&#xff08;工作机制&#xff0c;重点&#xff09;1.1list-watch 组件List-Watch 的优点List-Watch 的应用场景List-Watch 的挑战与优化 2.调度过程(重点)2.1调度过程&#xff1a;2.2Kube…

STM32WB55RG开发(3)----生成 BLE 程序连接手机APP

STM32WB55RG开发----3.生成 BLE 程序连接手机APP 概述硬件准备视频教学样品申请源码下载参考程序选择芯片型号配置时钟源配置时钟树RTC时钟配置RF wakeup时钟配置查看开启STM32_WPAN条件配置HSEM配置IPCC配置RTC启动RF开启蓝牙设置工程信息工程文件设置结果演示 概述 本项目旨…

[C++]内联函数和nullptr

> &#x1f343; 本系列为初阶C的内容&#xff0c;如果感兴趣&#xff0c;欢迎订阅&#x1f6a9; > &#x1f38a;个人主页:[小编的个人主页])小编的个人主页 > &#x1f380; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 > ✌️ &#x1f91e; &#x1…

微软OmniParser:一切皆文档,OCR驱动智能操作

前沿科技速递&#x1f680; 微软推出的OmniParser是一种创新的框架&#xff0c;旨在将手机和电脑屏幕视为文档&#xff0c;通过OCR技术与多模态大模型实现对用户界面的深度理解和操作。OmniParser能够高效识别和提取界面中的文本信息、位置和语义&#xff0c;助力自动化操作。 …

使用 Web Search 插件扩展 GitHub Copilot 问答

GitHub Copilot 是一个由 GitHub 和 OpenAI 合作开发的人工智能代码提示工具。它可以根据上下文提示代码&#xff0c;还可以回答各种技术相关的问题。但是 Copilot 本身不能回答非技术类型的问题。为了扩展 Copilot 的功能&#xff0c;微软发布了一个名为 Web Search 的插件&am…

Rust语言在系统编程中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Rust语言在系统编程中的应用 Rust语言在系统编程中的应用 Rust语言在系统编程中的应用 引言 Rust 概述 定义与原理 发展历程 Ru…