Python进阶06-Web服务器

news2024/11/15 17:04:03

零、文章目录

Python进阶06-Web服务器

1、HTTP协议

  • HTTP协议相关请参考HTTP协议详解
  • 网络相关内容请参考计算机网络详解
(1)HTTP协议
  • HTTP 协议的全称是(HyperText Transfer Protocol),翻译过来就是超文本传输协议。
  • 超文本是超级文本的缩写,是指超越文本限制或者超链接,比如:图片、音乐、视频、超链接等等都属于超文本。
  • HTTP 协议的制作者是蒂姆·伯纳斯-李,1991年设计出来的,HTTP 协议设计之前目的是传输网页数据的,现在允许传输任意类型的数据。
  • 传输 HTTP 协议格式的数据是基于 TCP 传输协议的,发送数据之前需要先建立连接。
(2)HTTP协议的作用
  • HTTP规定了浏览器和 Web 服务器通信数据的格式,也就是说浏览器和web服务器通信需要使用http协议。
(3)浏览器访问Web服务器的过程

image-20240825214236728

2、URL

(1)URL概念
  • URL的英文全拼是(Uniform Resoure Locator),表达的意思是统一资源定位符。
  • 通俗理解就是网络资源地址,也就是我们常说的网址。
(2)URL组成
  • URL的样子:https://news.163.com/18/1122/10/E178J2O4000189FH.html
  • URL的组成部分:
    • ① 协议部分: https://、http://、ftp://
    • ② 域名部分: news.163.com => 转换为IP地址(有了IP地址就能找到这个计算机了)
    • ③ 资源路径部分: /18/1122/10/E178J2O4000189FH.html
(3)域名与URL扩展
  • 域名:域名就是IP地址的别名,它是用点进行分割使用英文字母和数字组成的名字,使用域名目的就是方便的记住某台主机IP地址。
  • URL的扩展:https://news.163.com/hello.html?page=1&count=10
    • 查询参数部分: ?page=1&count=10
    • 参数说明:? 后面的 page 表示第一个参数,后面的参数都使用 & 进行连接

3、查看HTTP协议的通信过程

(1)谷歌浏览器开发者工具的使用
  • 首先需要安装Google Chrome浏览器
    • Windows和Linux平台按F12调出开发者工具
    • mac OS选择 视图 -> 开发者 -> 开发者工具或者直接使用 alt+command+i
    • 多平台通用:网页右击选择检查。

image-20240826141715564

  • 开发者工具的标签选项说明:
    • 元素(Elements):用于查看或修改HTML标签
    • 控制台(Console):执行js代码
    • 源代码(Sources):查看静态资源文件,断点调试JS代码
    • 网络(Network):查看http协议的通信过程
(2)查看HTTP协议的通信过程(请求)

image-20240826141918453

(3)查看HTTP协议的通信过程(响应)

image-20240826142005909

4、HTTP请求报文

(1)HTTP请求报文介绍
  • HTTP最常见的请求报文有两种:
    • GET 方式的请求报文:获取web服务器数据
    • POST 方式的请求报文:向web服务器提交数据
(2)HTTP GET 请求报文格式

image-20240826144550447

---- 请求行 ----
GET / HTTP/1.1  # GET请求方式 请求资源路径 HTTP协议版本

---- 请求头 -----
Host: www.itcast.cn  # 服务器的主机地址和端口号,默认是80
Connection: keep-alive # 和服务端保持长连接
Upgrade-Insecure-Requests: 1 # 让浏览器升级不安全请求,使用https请求
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36  # 用户代理,也就是客户端的名称
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 # 可接受的数据类型
Accept-Encoding: gzip, deflate # 可接受的压缩格式
Accept-Language: zh-CN,zh;q=0.9 #可接受的语言
Cookie: pgv_pvi=1246921728; # 登录用户的身份标识

---- 空行 ----
(3)HTTP GET 请求报文说明
  • 在HTTP请求中,每个选项结束后,其后面都要添加一个标签\r\n(代表一行的结束)。

  • 在Windows系统中,换行符使用\n来实现。但是在Linux以及Unix系统中,换行符需要使用\r\n来实现。

GET / HTTP/1.1\r\n
Host: www.itcast.cn\r\n  
Connection: keep-alive\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
Cookie: pgv_pvi=1246921728; \r\n
\r\n  (请求头信息后面还有一个单独的’\r\n’不能省略)
(4)HTTP POST 请求报文格式

image-20240826145251484

---- 请求行 ----
POST /xmweb?host=mail.itcast.cn&_t=1542884567319 HTTP/1.1 # POST请求方式 请求资源路径 HTTP协议版本
---- 请求头 ----
Host: mail.itcast.cn # 服务器的主机地址和端口号,默认是80
Connection: keep-alive # 和服务端保持长连接
Content-Type: application/x-www-form-urlencoded  # 告诉服务端请求的数据类型
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 # 客户端的名称
---- 空行 ----
---- 请求体 ----
username=hello&pass=hello # 请求参数
(5)HTTP POST 请求报文说明
  • 每项数据之间使用\r\n进行结束

5、HTTP 响应报文

(1)HTTP响应报文组成

image-20240826161521046

(2)响应报文格式

image-20240826162033277

--- 响应行/状态行 ---
HTTP/1.1 200 OK # HTTP  协议版本 状态码 状态描述

--- 响应头 ---
Server: Tengine # 服务器名称
Content-Type: text/html; charset=UTF-8 # 内容类型
Transfer-Encoding: chunked # 发送给客户端内容不确定内容长度,发送结束的标记是0\r\n, Content-Length表示服务端确定发送给客户端的内容大小,但是二者只能用其一。
Connection: keep-alive # 和客户端保持长连接
Date: Fri, 23 Nov 2018 02:01:05 GMT # 服务端的响应时间
--- 空行 ---

--- 响应体 ---
<!DOCTYPE html><html lang=“en”> …</html> # 响应给客户端的数据
(3)响应报文说明
  • 每项数据之间使用:\r\n
(4)HTTP响应状态码
  • HTTP 状态码是用于表示web服务器响应状态的3位数字代码。
状态码说明
200请求成功
301重定向
400错误的请求,请求地址或者参数有误
404请求资源在服务器上不存在
500服务器内部源代码出现错误

6、搭建Python静态Web服务器

(1)静态Web服务器是什么
  • 可以为发出请求的浏览器提供静态文档(HTML+CSS)的程序。
  • 平时我们浏览百度新闻数据的时候,每天的新闻数据都会发生变化,那访问的这个页面就是动态的,而我们开发的是静态的,页面的数据不会发生变化。
(2)搭建静态Web服务器
  • 通过执行如下命令创建一个最简单的 HTTP 服务器:

    python -m http.server
    
  • 服务器默认监听端口是 8000,支持自定义端口号:

    python -m http.server 9000
    
  • 服务器默认绑定到所有接口,可以通过 -b/–bind 指定地址,如本地主机:

    python -m http.server --bind 127.0.0.1
    
  • 服务器默认工作目录为当前目录,可通过 -d/--directory 参数指定工作目录:

    python -m http.server --directory /tmp/
    
  • 此外,可以通过传递参数 --cgi 启用 CGI 请求处理程序:

    python -m http.server --cgi
    
  • http.server 也支持在代码中调用,导入对应的类和函数即可。

    from http.server import SimpleHTTPRequestHandler
    from http.server import CGIHTTPRequestHandler
    from http.server import ThreadingHTTPServer
    from functools import partial
    import contextlib
    import sys
    import os
    
    
    class DualStackServer(ThreadingHTTPServer):
        def server_bind(self):
            # suppress exception when protocol is IPv4
            with contextlib.suppress(Exception):
                self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
            return super().server_bind()
    
    
    def run(server_class=DualStackServer,
            handler_class=SimpleHTTPRequestHandler,
            port=8000,
            bind='127.0.0.1',
            cgi=False,
            directory=os.getcwd()):
        """Run an HTTP server on port 8000 (or the port argument).
    
        Args:
            server_class (_type_, optional): Class of server. Defaults to DualStackServer.
            handler_class (_type_, optional): Class of handler. Defaults to SimpleHTTPRequestHandler.
            port (int, optional): Specify alternate port. Defaults to 8000.
            bind (str, optional): Specify alternate bind address. Defaults to '127.0.0.1'.
            cgi (bool, optional): Run as CGI Server. Defaults to False.
            directory (_type_, optional): Specify alternative directory. Defaults to os.getcwd().
        """
    
        if cgi:
            handler_class = partial(CGIHTTPRequestHandler, directory=directory)
        else:
            handler_class = partial(SimpleHTTPRequestHandler, directory=directory)
    
        with server_class((bind, port), handler_class) as httpd:
            print(
                f"Serving HTTP on {bind} port {port} "
                f"(http://{bind}:{port}/) ..."
            )
            try:
                httpd.serve_forever()
            except KeyboardInterrupt:
                print("\nKeyboard interrupt received, exiting.")
                sys.exit(0)
    
    
    if __name__ == '__main__':
        run(port=8000, bind='127.0.0.1')
    
  • http.server 也支持在代码中调用,导入对应的类和函数即可。

(3)返回固定页面数据
  • 编写一个TCP服务端程序
  • 获取浏览器发送的HTTP请求报文数据
  • 读取固定页面数据,把页面数据组装成HTTP响应报文数据发送给浏览器。
  • HTTP响应报文数据发送完成以后,关闭服务于客户端的套接字。
'''
实现步骤:
编写一个TCP服务端程序(七步走)
获取浏览器发送的HTTP请求报文数据
读取固定页面数据,把页面数据组装成HTTP响应报文数据发送给浏览器。
HTTP响应报文数据发送完成以后,关闭服务于客户端的套接字。
'''
import socket

if __name__ == '__main__':
    # 第一步:创建套接字对象
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 第二步:绑定IP和端口
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    tcp_server_socket.bind(('', 8000))
    # 第三步:设置监听
    tcp_server_socket.listen(128)
    # 第四步:接收客户端连接
    while True:
        new_socket, ip_port = tcp_server_socket.accept()
        # 第五步:接收接收客户端发送过来的数据
        content = new_socket.recv(4096).decode('utf-8')
        print(content)
        # 第六步:返回数据给浏览器客户端
        with open('html/index.html', 'rb') as f:
            file_data = f.read()
        # 关键点:我们需要把以上数据拼接为HTTP响应报文(响应行、响应头、空行、响应体)
        response_line = 'HTTP/1.1 200 OK\r\n'
        response_header = 'Server:PWB/1.1\r\nContent-Type:text/html; charset=utf-8\r\n'
        # 空行 => \r\n
        response_body = file_data
        # 组装HTTP响应数据
        response_data = (response_line + response_header + '\r\n').encode('utf-8') + response_body
        new_socket.send(response_data)
        # 关闭套接字对象
        new_socket.close()
(4)返回指定页面数据
  • 获取用户请求资源的路径
  • 根据请求资源的路径,读取指定文件的数据
  • 组装指定文件数据的响应报文,发送给浏览器
  • 判断请求的文件在服务端不存在,组装404状态的响应报文,发送给浏览器
'''
基本Web服务器:
编写一个TCP服务端程序(七步走)
获取浏览器发送的HTTP请求报文数据
读取固定页面数据,把页面数据组装成HTTP响应报文数据发送给浏览器。
HTTP响应报文数据发送完成以后,关闭服务于客户端的套接字。
要想返回指定页面:
获取用户请求资源的路径
根据请求资源的路径,读取指定文件的数据
组装指定文件数据的响应报文,发送给浏览器
'''
import socket

if __name__ == '__main__':
    # 第一步:创建套接字对象
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 第二步:绑定IP和端口,设置端口复用
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    tcp_server_socket.bind(('', 9000))
    # 第三步:设置监听
    tcp_server_socket.listen(128)
    # 第四步:接收客户端连接
    while True:
        new_socket, ip_port = tcp_server_socket.accept()
        # 第五步:接收客户端传递过来的数据
        client_request_data = new_socket.recv(4096)
        # 判断(易错点)=> 新版的很多浏览器都带了一个自动刷新功能(每隔一段时间不操作,浏览器会自动刷新1次)=> 发送了一个空数据包过来
        if client_request_data:
            # 如果浏览器发送过来了数据,则我们对HTTP请求数据进行解析
            client_request_data = client_request_data.decode('utf-8')
            # print(client_request_data)
            # 获取用户请求的资源页面
            request_data = client_request_data.split(' ', maxsplit=2)
            request_path = request_data[1]  # /index.html
            # 解决域名直接访问首页问题
            if request_path == '/':  # 代表用户期望访问首页
                request_path = '/index.html'
            # 第六步:返回数据给浏览器客户端
            try:
                with open('html' + request_path, 'rb') as f:  # html/index.html
                    file_data = f.read()
            except:
                # 如果以上文件不存在,则返回404,返回错误信息
                response_line = 'HTTP/1.1 404 Not Found\r\n'
                response_header = 'Server:PWB/1.1\r\nContent-Type:text/html; charset=utf-8\r\n'
                response_body = '很抱歉,您要访问的页面不存在!'
                response_data = (response_line + response_header + '\r\n' + response_body).encode('utf-8')
                new_socket.send(response_data)
            else:
                # 拼接HTTP响应报文 => 响应行、响应头、空行、响应体
                response_line = 'HTTP/1.1 200 OK\r\n'
                response_header = 'Server:PWB/1.1\r\n'
                # 空行\r\n
                response_body = file_data
                response_data = (response_line + response_header + '\r\n').encode('utf-8') + response_body
                new_socket.send(response_data)
            finally:
                # 第七步:关闭新产生的套接字对象
                new_socket.close()
(5)案例-商城项目
'''
HTTP之Web服务器开发 => TCP七步走
'''
import socket

if __name__ == '__main__':
    # 第一步:创建套接字对象
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 第二步:绑定IP与端口
    tcp_server_socket.bind(('', 8080))
    # 第三步:设置监听
    tcp_server_socket.listen(128)
    # 第四步:接收客户端连接请求
    while True:
        new_socket, ip_port = tcp_server_socket.accept()
        # 第五步:接收客户端发送过来的数据
        client_request_data = new_socket.recv(4096)
        if client_request_data:
            request_data = client_request_data.decode('utf-8')
            # 针对字符串进行切割,获取请求路径
            request_path = request_data.split(' ', maxsplit=2)[1]
            # 如果用户向直接访问首页,不输入资源路径
            if request_path == '/':
                request_path = '/index.html'
            # 判断文件是否存在,存在返回200,不存在就返回404
            try:
                with open('shoping'+request_path, 'rb') as f:
                    file_data = f.read()
            except:
                response_line = 'HTTP/1.1 404 Not Found\r\n'
                response_header = 'Server:PWB2.0\r\nContent-type:text/html; charset=utf-8'
                response_body = '很抱歉,您要访问的商城页面不存在!'
                response_data = (response_line + response_header + '\r\n' + response_body).encode('utf-8')
                new_socket.send(response_data)
            else:
                response_line = 'HTTP/1.1 200 OK\r\n'
                response_header = 'Server:PWB2.0\r\n'
                response_body = file_data
                response_data = (response_line + response_header + '\r\n').encode('utf-8') + response_body
                new_socket.send(response_data)
            finally:
                new_socket.close()
(6)静态Web服务器多线程版本
  • 目前的Web服务器,不能支持多用户同时访问,只能一个一个的处理客户端的请求,可以使用多线程开发多任务版的web服务器同时处理多个客户端的请求,比进程更加节省内存资源。
  • 多任务版静态web服务器实现步骤
    • 当客户端和服务端建立连接成功,创建子线程,使用子线程专门处理客户端的请求,防止主线程阻塞。
    • 把创建的子线程设置成为守护主线程,防止主线程无法退出。
import socket
import threading

def son(get_sock):
    # 接收数据  数据一定要接收
    ret = get_sock.recv(4096)

    # 完善:判断用户是否离开
    if len(ret) == 0:
        print('用户下线')
        get_sock.close()
        return

    # 解析请求报文,得到请求资源中的资源路径
    ret_road = ret.decode().split('\r\n')[0].split(' ')[1]
    # 判断当/时候返回主页面
    if ret_road == '/':
        ret_road = '/index.html'

    try:
        # 响应报文和发送

        # 读取网页资源  rb读取时候本身为二进制,所以在发送数据那块不用再进行编码转换
        file = open('./html' + ret_road, 'rb')
        body_data = file.read()
        file.close()

        # with open写法
        # with open('./html/index.html','rb')as file:
        #     body_data = file.read()
    except Exception as e:
        # 如果以上文件不存在,则返回404,返回错误信息
        response_line = 'HTTP/1.1 404 Not Found\r\n'
        response_header = 'Server:PWB/1.1\r\nContent-Type:text/html; charset=utf-8\r\n'
        response_body = '很抱歉,您要访问的页面不存在!'
        response_data = (response_line + response_header + '\r\n' + response_body).encode('utf-8')
        get_sock.send(response_data)
    else:
        response_line = 'HTTP/1.1 200 OK\r\n'
        response_header = 'Server:PWB2.0\r\n'
        response_body = body_data
        response_data = (response_line + response_header + '\r\n').encode('utf-8') + response_body
        get_sock.send(response_data)
    finally:
        # 关闭
        get_sock.close()

def main():
    web_sock = socket.socket()
    web_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
    web_sock.bind(('',9999))
    web_sock.listen(128)
    while True:
        #接收一个新的连接请求
        get_sock, get_adress = web_sock.accept()
        # print('用户%s 进入' % str(get_adress))
        thd = threading.Thread(target=son, args=(get_sock,))
        #设置守护主线程
        thd.setDaemon(True)
        thd.start()

if __name__ == '__main__':
    main()
(7)静态Web服务器面向对象版本
  • ① 把提供服务的Web服务器抽象成一个类(HTTPWebServer)
  • ② 提供Web服务器的初始化方法,在初始化方法里面创建socket对象
  • ③ 提供一个开启Web服务器的方法,让Web服务器处理客户端请求操作。
import socket
import threading

class HTTPWebServer(object):
    def __init__(self):
        web_sock = socket.socket()
        web_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        web_sock.bind(('', 9999))
        web_sock.listen(128)
        self.web_sock = web_sock

    def start(self):
        while True:
            # 接收一个新的连接请求
            get_sock, get_adress = self.web_sock.accept()
            print('用户%s 进入' % str(get_adress))
            thd = threading.Thread(target=self.son, args=(get_sock,))
            # 设置守护主线程
            thd.setDaemon(True)
            thd.start()

    @staticmethod
    def son(get_sock):
        # 接收数据  数据一定要接收
        ret = get_sock.recv(4096)

        # 完善:判断用户是否离开
        if len(ret) == 0:
            print('用户下线')
            get_sock.close()
            return

        # 解析请求报文,得到请求资源中的资源路径
        ret_road = ret.decode().split('\r\n')[0].split(' ')[1]
        # 判断当/时候返回主页面
        if ret_road == '/':
            ret_road = '/index.html'

        try:
            # 响应报文和发送

            # 读取网页资源  rb读取时候本身为二进制,所以在发送数据那块不用再进行编码转换
            file = open('./html' + ret_road, 'rb')
            body_data = file.read()
            file.close()

            # with open写法
            # with open('./html/index.html','rb')as file:
            #     body_data = file.read()
        except Exception as e:
            # 如果以上文件不存在,则返回404,返回错误信息
            response_line = 'HTTP/1.1 404 Not Found\r\n'
            response_header = 'Server:PWB/1.1\r\nContent-Type:text/html; charset=utf-8\r\n'
            response_body = '很抱歉,您要访问的页面不存在!'
            response_data = (response_line + response_header + '\r\n' + response_body).encode('utf-8')
            get_sock.send(response_data)
        else:
            response_line = 'HTTP/1.1 200 OK\r\n'
            response_header = 'Server:PWB2.0\r\n'
            response_body = body_data
            response_data = (response_line + response_header + '\r\n').encode('utf-8') + response_body
            get_sock.send(response_data)
        finally:
            # 关闭
            get_sock.close()

def main():
    option = HTTPWebServer()
    option.start()

if __name__ == '__main__':
    main()

7、FastAPI框架

(1)FastAPI是什么
  • FastAPI是一个现代的,快速(高性能)python web框架. 基于标准的python类型提示,使用python3.6+构建API的Web框架。

  • 简单讲FastAPI就是把做web开发所需的相关代码全部简化, 我们不需要自己实现各种复杂的代码, 例如多任务,路由装饰器等等. 只需要调用FastAPI提供给我们的函数, 一调用就可以实现之前需要很多复杂代码才能实现的功能。

    • image-20240827145116262
  • FastAPI的特点
    • 性能快:高性能,可以和NodeJSGo相提并论
    • 快速开发:开发功能速度提高约200%至300%
    • 更少的Bug
    • Fewer bugs: 减少40%开发人员容易引发的错误
    • 直观:完美的编辑支持
    • 简单: 易于使用和学习,减少阅读文档的时间
    • 代码简洁:很大程度上减少代码重复。每个参数可以声明多个功能,减少bug的发生
    • 标准化:基于并完全兼容API的开发标准:OpenAPI(以前称为Swagger)和JSON Schema
  • 搭建环境
    • python环境:Python 3.6+
(2)PIP详解
  • PIP(Python Package Installer):是一个Python的包管理工具,它允许用户安装和管理Python库。以下是一些关于PIP的基本概念和使用方法:

  • 安装PIP:如果你使用的是Python 2.7.9+ 或 Python 3.4+,那么PIP已经内置在Python中。否则,你可能需要单独安装它。

  • 基本命令

    • pip install package_name:安装一个包。

    • pip uninstall package_name:卸载一个包。

    • pip list:列出已安装的包。

    • pip show package_name:显示包的详细信息。

    • pip search keyword:搜索包。

  • 版本控制

    • pip install package_name==version:安装特定版本的包。

    • pip install package_name>=version:安装版本大于或等于指定版本的包。

  • 依赖管理:当你安装一个包时,PIP会自动处理依赖关系,安装所有必需的包。

  • 虚拟环境:使用虚拟环境(如venv或virtualenv)可以创建隔离的Python环境,每个环境可以有自己的一套包和Python版本,互不影响。

  • 缓存:PIP会缓存下载的包,以加快未来的安装过程。可以通过pip cache命令管理缓存。

  • 配置文件:PIP使用配置文件(pip.conf或pip.ini),可以设置默认的源、代理等。

  • 常用镜像源:

    • 豆瓣(douban): https://pypi.douban.com/simple/
    • 阿里云(aliyun): https://mirrors.aliyun.com/pypi/simple/
    • 中国科技大学(ustc): https://pypi.mirrors.ustc.edu.cn/simple/
    • 清华大学(Tsinghua): https://pypi.tuna.tsinghua.edu.cn/simple/
  • 源(Repository):可以通过修改配置文件或使用命令行参数-i来指定使用不同的源,例如使用PyPI(默认)或阿里云镜像。

  • 升级PIP:使用pip install --upgrade pip来升级PIP本身。

  • 安全:使用pip install --trusted-host或配置文件中的[global]部分来信任特定的源,以避免安全警告。

  • 脚本:可以使用pip install package_name==version --target=/path/to/dir将包安装到指定目录。

(3)FastAPI安装
  • 安装方式1:

    • 安装fastapi

      • pip install fastapi -i https://mirrors.aliyun.com/pypi/simple/
        
    • 如果用于生产,那么你还需要一个ASGI服务器,如Uvicorn或Hypercorn

      • pip install uvicorn -i https://mirrors.aliyun.com/pypi/simple/
        
  • 安装方式2 :

    • 选择File->Settings

    image-20240827145635420

    • 选择Project:code->Project Interpreter -> 搜索需要安装的包 -> install package按钮 -> 等待安装完成

image-20240827145735892

image-20240827151457556

(4)FastAPI的基本使用
  • 导入模块
  • 创建FastAPI框架对象
  • 通过@app路由装饰器收发数据
  • 运行服务器
# 导入FastAPI模块
from fastapi import FastAPI
# 导入响应报文Response模块
from fastapi import Response
# 导入服务器uvicorn模块
import uvicorn

# 创建FastAPI框架对象
app = FastAPI()


# 通过@app路由装饰器收发数据
# @app.get(参数) : 按照get方式接受请求数据
# 请求资源的 url 路径
@app.get("/index.html")
def main():
    with open("./html/index.html") as f:
        data = f.read()
    # return 返回响应数据
    # Response(content=data, media_type="text/html"
    # 参数1: 响应数据
    # 参数2: 数据格式
    return Response(content=data, media_type="text/html")


# 运行服务器
# 参数1: 框架对象
# 参数2: IP地址
# 参数3: 端口号
uvicorn.run(app, host="127.0.0.1", port=8000)
(5)FastAPI访问多网页
  • 通过路由装饰器,实现访问不同页面返回对应页面
# 导入FastAPI模块
from fastapi import FastAPI
# 导入响应报文Response模块
from fastapi import Response
# 导入服务器uvicorn模块
import uvicorn

# 创建FastAPI框架对象
app = FastAPI()

# 通过@app路由装饰器收发数据
# @app.get(参数) : 按照get方式接受请求数据
# 请求资源的 url 路径
@app.get("/index1.html")
def main():
    with open("./html/index1.html") as f:
        data = f.read()
    # return 返回响应数据
    # Response(content=data, media_type="text/html"
    # 参数1: 响应数据
    # 参数2: 数据格式
    return Response(content=data, media_type="text/html")


@app.get("/index2.html")
def main():
    with open("./html/index2.html") as f:
        data = f.read()
    # return 返回响应数据
    # Response(content=data, media_type="text/html"
    # 参数1: 响应数据
    # 参数2: 数据格式
    return Response(content=data, media_type="text/html")

# 运行服务器
# 参数1: 框架对象
# 参数2: IP地址
# 参数3: 端口号
uvicorn.run(app, host="127.0.0.1", port=8000)

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

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

相关文章

图为科技闪耀双展,AI之星智领未来

图为科技同期闪耀2024AGIC深圳(国际)通用人工智能大会与深圳国际电子展&#xff0c;晋升AI领域新星。 人工智能爆炸时代&#xff0c;每一场科技盛会的召开都预示着行业的新风向与无限可能。 作为边缘计算与人工智能领域的佼佼者&#xff0c;图为科技携带前沿技术与创新产品&a…

UI自动化测试 —— 下拉选择框弹出框滚动条操作实践!

前言 UI测试&#xff0c;也称为用户界面测试&#xff0c;是一种测试类型&#xff0c;旨在检查应用程序的界面是否工作正常&#xff0c;以及是否存在任何妨碍用户行为且不符合书面规格的BUG。UI自动化测试则是利用自动化工具来执行这些测试&#xff0c;以提高测试效率和准确性.…

【ubuntu使用笔记】使用timeshift备份ubuntu系统

使用timeshift备份ubuntu系统 安装timeshift sudo apt install timeshift建立备份点 sudo timeshift --create --comments "fist" --tags D查看备份点 sudo timeshift --list参考 三种Ubuntu系统全盘备份与恢复方法—tar、timeshift、systemback

linux访问github网速太慢 the remote end hung up unexpectedly问题

linux访问github网速太慢 the remote end hung up unexpectedly问题 pip install githttps://github.com/zhanghang1989/PyTorch-Encoding/时遇到fatal: the remote end hung up unexpectedly 原因 linux访问github网速太慢 措施&#xff1a; 确定ip&#xff1a; https://link.…

CRM 客户管理系统哪个好用?本篇盘点给你答案!

本文将盘点15款CRM客户管理系统&#xff0c;为企业选型提供参考 。 CRM 客户管理系统哪个好用&#xff1f;这是众多企业在发展过程中常常思考的问题。 CRM 客户管理系统就如同企业的得力助手&#xff0c;能把企业的客户资源管理得井井有条。对于企业来说&#xff0c;如果没有一…

【Mybatis】Mybatis-Plus 高级

1、关于插件 1.1、插件机制 MyBatis 允许你在已映射语句执⾏过程中的某⼀点进⾏拦截调⽤。默认情况下&#xff0c;MyBatis 允许使⽤插件来拦截的⽅法调⽤包括&#xff1a; Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)Par…

vTESTstudio系列12--vTESTstudio中的动态函数库介绍2

在上期的文章&#xff08;vTESTstudio系列11--vTESTstudio中的动态函数库介绍1&#xff09;中&#xff0c;我们详细介绍了osek_tp.dll的接口&#xff0c;本章开始给大家介绍如何通过osek_tp.dll的接口去发送诊断指令&#xff0c;Let‘s Go!!! 目录 1. CanTp发送数据的函数&am…

插件千兆网络变压器72PIN应用图片和设计H87202D

华强盛电子导读&#xff1a;前面199中间2643后面0038 千兆4口网络变压器是一种常用于网络通信领域的电子元件&#xff0c;它可以将高频率的信号进行隔离和滤波&#xff0c;保护网络设备免受电磁干扰&#xff0c;同时也能确保信号的稳定传输。这种网络变压器通常具有多个端口&am…

使用tyarn下载依赖出现: 无法加载文件 D:\environment_software\nvm_node\tyarn.ps1,因为在此系统上禁止运行脚本。

使用tyarn下载依赖时出现&#xff1a; 无法加载文件 D:\environment_software\nvm_node\tyarn.ps1&#xff0c;因为在此系统上禁止运行脚本。 表示window不能执行ps1文件&#xff0c;可以通过设置命令运行执行ps1文件&#xff08;PowerShell&#xff09;。输入命令查看配置&am…

程序设计—智慧城市应急物资配送系统开发—车辆调度 项目源码36262

摘 要 在智慧城市建设的浪潮中&#xff0c;应急物资配送系统的车辆调度模块扮演着举足轻重的角色。该模块通过集成先进的信息技术和管理理念&#xff0c;实现了对配送地区、前置仓、车辆资源以及调度信息的全面管理和优化&#xff0c;从而确保在紧急情况下能够迅速、准确地将应…

自动生成文章的软件,提高你写文章的效率

对于每个写作人员而言&#xff0c;如果在写作中有一个工具可以协助提高工作效率&#xff0c;想必大家是都乐意接受的&#xff0c;那么今天小编就在本文中为大家分享一个好用的自动生成文章的软件&#xff0c;它可以在大家没有写作灵感时用来自动生成文章用&#xff0c;同时也可…

JVM中篇:字节码与类的加载篇-04-再谈类的加载器

笔记来源&#xff1a;尚硅谷JVM全套教程&#xff0c;百万播放&#xff0c;全网巅峰&#xff08;宋红康详解java虚拟机&#xff09; 文章目录 1. 概述1.1. 大厂面试题1.2. 类加载器的分类1.3. 类加载器的必要性1.4. 命名空间1.5. 类加载机制的基本特征1.6. 类加载器之间的关系 2…

视频结构化从入门到精通——图像算法类型介绍

视频结构化主要图像算法 1 认识“数组、矩阵和张量” 1.1 什么是维度 在图像算法中&#xff0c;“维度”这个概念非常重要&#xff0c;它描述了数据的结构和形状。在不同的上下文中&#xff0c;维度可能有不同的含义&#xff0c;但总体来说&#xff0c;它们都与数据的排列方式…

【已解决】git@github.com: Permission denied (publickey).处理git 无权限访问问题

解决思路 分析 gitgithub.com: Permission denied (publickey). fatal: Could not read from remote repository. 意译&#xff1a;权限拒绝&#xff08;公开密钥&#xff09;&#xff0c;后果&#xff1a;无法读远程仓库。 人话&#xff1a;GitHub设置里面的公钥没有配置或者…

关于武汉芯景科技有限公司的实时时钟芯片XJ8339开发指南(兼容DS1339)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、系统结构图 三、功能描述 1.时钟功能 2.闹钟功能&#xff08;两个闹钟&#xff09; 3.振荡器停止控制 4.频率输出&#xff08;1HZ、1.096KHZ、8.192KHZ、32.768KHZ&#xff09; 5.振荡器停止检测 6.闹钟中断标志 7.涓流充电…

领英(LinkedIn)无法开发会员客户?一招教你轻松解决

经常会有外贸朋友问我&#xff0c;领英会员的客户要怎么开发&#xff0c;如果不开会员的就无法添加好友&#xff0c;查看信息等等&#xff0c;经过我的反复实践&#xff0c;今天给大家分享一个超级好用的开发领英会员的方法&#xff0c;不需要开领英会员一样可以轻松开发&#…

【网络安全】服务基础第一阶段——第六节:Windows系统管理基础---- DNS部署与安全

计算机智能识别并用IP地址定位&#xff0c;例如我们想要访问一个网页&#xff0c;其实是只能使用这个网页的IP地址&#xff0c;即四位的0&#xff5e;255来访问&#xff0c;但这一串数字难以记忆&#xff0c;于是就有了DNS&#xff0c;将难以记忆的数字转化为容易记忆的域名&am…

【栈】| 力扣高频题: 基本计算器二

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️专栏&#xff1a;算法题 &#x1f397;️如何活着&#xff0c;是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/basic-calculator-ii/description/ (可点击) 本道题是栈…

Docker 镜像导出与加载:从入门到精通

在容器化技术的世界中&#xff0c;Docker 镜像的导出与加载是开发与运维人员经常会用到的技能。本文将详细介绍如何导出 Docker 镜像为本地 tar 文件&#xff0c;并如何将其重新加载为 Docker 镜像&#xff0c;并分享一些操作中的小技巧与趣味总结。 一、Docker 镜像导出的秘…

Spring Security基于token的极简示例

1 引言 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架&#xff0c;但是用起来有点复杂&#xff0c;为了便于学习理解&#xff0c;下面将用最简洁的配置和示例&#xff0c;展示整个流程。 2 代码 创建一个spring-security…