[Web服务器] 简易静态Web服务器的搭建

news2024/11/27 6:39:55

什么是Web服务器

可以为发出请求的浏览器提供静态文档的程序

平时我们浏览百度新闻数据的时候,每天的新闻数据都会发生变化,那访问的这个页面就是动态的,而我们开发的是静态的,每天访问我们自己的静态web服务器,页面的数据不会发生变化

Web服务器的工作原理

  1. 用户在终端发出访问请求
  2. 通过tcp协议建立链接
  3. 生成http报文发送到静态Web服务器中
  4. 服务器解析报文, 并把用户申请的资源打包成http报文发送给用户 
  5. 应答体中携带的数据发送到浏览器浏览器经过渲染产生具体页面

 Python搭建简易的Web服务器

1. 搭建服务器端的基本步骤: 导入socket包, 创建套接字对象, 设置端口复用, 绑定IP和端口号, 设置监听, 接受客户端的数据

import socket
# 创建套接字对象
web_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口复用
web_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定IP和端口
web_server.bind(('',8001))
# 设置监听
web_server.listen(128)
# 接受客户端HTTP报文
while True:
    new_socket, ip_post = web_server.accept()

    recv_data = new_socket.recv(1024)

 打印出用户端请求的HTTP报文, 我们可以看到下面的几个部分:

  1. 请求行: 请求方法GET, 请求的界面, 使用的协议
  2. 请求头: 客户端的具体信息
  3. 空行: 空行

为了获取用户具体的请求界面, 对HTTP请求报文做出处理, 通过切割切片可以获得用户具体的资源 

    if recv_data:
        recv_data = recv_data.decode('utf-8')
        request_list = recv_data.split(' ',maxsplit=2)
        url = request_list[1][1:]

 然后就根据用户请求的资源打包成HTTP响应报文发送给用户即可

注意: 发送的数据要组成HTTP报文的形式, 响应行, 响应头, 空行, 响应体都却以不可

如果服务器没有用户请求的资源, 返回找不到资源给用户, 这里需要注意响应行的状态不同

        try:
            with open(url, 'rb') as f:
                data = f.read()

        except: # 报错没有找到
            # 响应行
            http_line = 'Http/1.1 404 Not Found\r\n'
            # 响应头
            http_header = 'Server:PythonWeb\r\nContent_type = text/html;charset=utf-8 \r\n'
            # 空行

            http_body = "sorry, can't find the resource..."
            response = (http_line+http_header+'\r\n'+http_body).encode('utf-8')
            new_socket.send(response)

        else:  # 没报错, 找到文件
            http_line = 'Http/1.1 200 OK\r\n'
            http_header = 'Server:PythonWeb\r\n'
            response = (http_line + http_header + '\r\n').encode('utf-8') + data
            new_socket.send(response)
        finally:
            new_socket.close()

最终的代码如下: 

import socket
# 创建套接字对象
web_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口复用
web_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定IP和端口
web_server.bind(('',8001))
# 设置监听
web_server.listen(128)

while True:
    new_socket, ip_post = web_server.accept()

    recv_data = new_socket.recv(1024)

    if recv_data:
        recv_data = recv_data.decode('utf-8')
        request_list = recv_data.split(' ',maxsplit=2)
        url = request_list[1][1:]
        print(url)

        # 返回http报文
        try:
            with open(url, 'rb') as f:
                data = f.read()

        except: # 报错没有找到
            # 响应行
            http_line = 'Http/1.0 404 NotFound\r\n'
            # 响应头
            http_header = 'Server:PythonWeb\r\nContent_type = text/html;charset=utf-8 \r\n'
            # 空行

            http_body = "sorry, can't find the resource..."
            response = (http_line+http_header+'\r\n'+http_body).encode('utf-8')
            new_socket.send(response)

        else:  # 没报错, 找到文件
            http_line = 'Http/1.0 200 OK\r\n'
            http_header = 'Server:PythonWeb\r\n'
            response = (http_line + http_header + '\r\n').encode('utf-8') + data
            new_socket.send(response)
        finally:
            new_socket.close()

尝试访问服务器的内容, 发现可以正常访问 

FastAPI 

FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 并基于标准的 Python 类型提示。

关键特性:

  • 快速:可与 NodeJS 和 Go 并肩的极高性能(归功于 Starlette 和 Pydantic)最快的 Python web 框架之一。

  • 高效编码:提高功能开发速度约 200% 至 300%。*

  • 更少 bug:减少约 40% 的人为(开发者)导致错误。
  • 智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。
  • 简单:设计的易于使用和学习,阅读文档的时间更短。
  • 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。
  • 健壮:生产可用级别的代码。还有自动生成的交互式文档。
  • 标准化:基于(并完全兼容)API 的相关开放标准:openapi (以前被称为 Swagger) 和 JSON Schema . 

使用FastAPI, 可以快速构建Web服务器

1. 配置FastAPI环境

在终端中输入以下命令下载相关资源包 

pip install fastapi

pip install uvicorn

2.导入如下资源包后,  使用FastAPI实例化对象app, 然后定义函数,

在函数中读取相关的资源文件, 然后返回Response对象, content参数是读取的文件数据, media_type是文件类型, html类型数据

最后使用app.get()方法装饰函数, 参数为url, 用户请求的资源的地址


from fastapi import FastAPI

from fastapi import Response

import uvicorn

app = FastAPI()

@app.get('/China_Daily_Website.html')
def China_Daily_Website():

    with open('China_Daily_Website.html','rb') as f:
        data = f.read()

    return Response(content=data, media_type='text/html')

@app.get('/TED.html')
def TED():
    with open('TED.html','rb') as f:
        data = f.read()

    return Response(content=data, media_type='text/html')

3.在uvicorn中运行, 第一个参数是FastAPI框架, 第二个参数的绑定的IP地址, 第三个是绑定的端口号

uvicorn.run(app, host='192.168.68.112',port=8000)

运行代码, 正常访问界面

 因为我没有下载网页的图片, 所以没有显示出来, 如果你有网页的全部资源, 是可以正常显示的

完整代码 


from fastapi import FastAPI

from fastapi import Response

import uvicorn

app = FastAPI()

@app.get('/China_Daily_Website.html')
def China_Daily_Website():

    with open('China_Daily_Website.html','rb') as f:
        data = f.read()

    return Response(content=data, media_type='text/html')

@app.get('/TED.html')
def TED():
    with open('TED.html','rb') as f:
        data = f.read()

    return Response(content=data, media_type='text/html')


uvicorn.run(app, host='192.168.68.112',port=8000)

 

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

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

相关文章

宠物托运网站如何搭建?5步帮你吸引70%顾客!

引言 随着人们生活水平的提高和宠物文化的普及,越来越多的宠物主人开始选择带着自己的宠物一同旅行或搬迁至新的城市。这一趋势催生了宠物托运服务行业的快速发展,而一个专业、高效的宠物托运网站则成为了连接宠物主人与托运服务提供商之间不可或缺的桥…

七夕情人节送什么礼物?四款好物分享,情侣必看!

在浪漫的七夕情人节,为心爱的人挑选一份特别的礼物是每对情侣表达爱意的重要方式。市场上琳琅满目的选择让人眼花缭乱,究竟什么样的礼物能触动TA的心弦?本篇分享将为您精选四款既实用又充满情意的好物,无论是甜蜜的开始还是长久的…

【区块链+医疗健康】医链 - 区块链医疗信息管理系统 | FISCO BCOS应用案例

根据《“十四五”规划和 2035 远景目标纲要》,我国在“十四五”时期将全面推进医疗信息化建设。工信部等部 门联合发布《关于加快推动区块链技术应用和产业发展的指导意见》,促进区块链在医疗健康等公共服务领域开 展应用,促进业务协同办理。…

1. dact-admin 中如何发布一个表并添加到导航栏

1.页面脚手架中根据自己需求选择生成的文件例如模型、控制器、翻译文件、数据库迁移文件等 访问 http://【你的域名】/admin/helpers/scaffold 例如: http://localhost:8000/admin/helpers/scaffold 2. 新建好之后来到路由文件 路径随便写,当然按照惯…

[C++] 模板进阶:特化与编译链接全解析

文章目录 非类型模板类型形参非类型模板参数代码示例 **模板的特化**为什么要有模板的特化函数模板特化使用场景与示例函数模板特化的实现细节 类模板特化全特化示例 偏特化部分优化通过进一步限制模板参数进行特化偏特化为指针类型示例:偏特化为引用类型示例&#…

红酒与午后:悠闲时光的惬意选择

阳光透过窗棂,轻轻洒在木质的茶几上,斑驳的光影交织出一幅静谧而温暖的画面。在这宁静的午后,一瓶洒派红酒(Bold & Generous)静静地摆放在那里,仿佛正等待着与你一同开启一段悠闲的品酒时光。 一、午后…

【往届均已完成EI、SCOPUS检索】第四届电气工程与计算机技术国际学术会议(ICEECT 2024,9月27-29)

第四届电气工程与计算机技术国际学术会议(ICEECT2024)将于9月27日-29日在哈尔滨举办。 会议主要围绕"电路与系统"、“电气工程材料”、“计算机视觉”、“计算机技术”等专业研究领域展开讨论。旨在为气工程、计算机技术等领域的专家学者及企业…

Figma汉化教程

Figma汉化教程,需要 5 步 第一步:我们打开一个Figma中文社区网站 https://www.figma.cool/cn。我们点击左上角的Figma汉化,进入Figma汉化安装的页面。 第二步:在Figma 软件汉化页面中,选择谷歌浏览器汉化,点…

Litestar GET function blocks OpenAI

题意:Litestar GET 函数阻塞 OpenAI 问题背景: When I transfer function to litestar, it suddenly stops OpenAI from returning a completion. I can print to console every declared variable except answer: 当我将函数传递给 litestar 时&#…

解析蚂蚁T21 190T 算力与能效的新突破

蚂蚁T21 190T 的参数如下: ● 产生币种:B & T & C ● 额定算力:190T ● 额定功耗:3610W ● 功耗比:19.0J/T ● 额定电压:380~415V ● 芯片参数:采用全新的5nm芯片技术&#xff08…

Linux笔记 --- Linux内核链表

Linux 内核链表 经过上一小节的分析,我们知道了传统链表的先天缺陷:没有将具体的数据从组织这些数据的逻辑结构中剥离,而Linux内核链表的思路,正是从一方面着手,追根溯源直抵病灶,彻底颠覆了传统链表&…

Linux内网环境部署thingsboard(离线部署)

先说明一下内网部署的环境,我这里是安装的thingsboard3.6.4 下面所有环境包的版本都是基于这个版本 我们需要安装jdk11,postgres数据库,这里注意下jdk必须使用rpm方式安装,要不后面安装Thingsboard会提示你没有检测到jdk. 下面我们就一步一步来 1.先下…

同城货运软件开发货运搬家系统源码基于Java开发的货运平台

一.管理端配置及操作 1.服务配置 添加:服务,给服务添加车型和车厢,以及收费金额 2.用户中心 分为普通用户 师傅用户 和推广员用户; 推广员用户的一二级分佣不为0,可给推广员设置一二级佣金 3.车厢/车型管理 给服务添加车厢 和车型,选择 服务后,只能选择该服务关联的车型和…

Tomato靶机~文件包含日志

寻找网站上传点并把 php 恶意代码文件改成 jpg 上传到网站上在本地包含引入恶意代码,当文件被引入后代码就被执行; 0x01信息收集 # 环境准备: Target IP:192.168.66.143 Attack IP:192.168.66.84 靶机目标&#xff1…

无缝协作的艺术:Codigger 视频会议(Meeting)的用户体验

在当今数字化的时代,远程协作已经成为工作和学习中不可或缺的一部分。然而,远程协作也面临着诸多挑战,如沟通不畅、信息同步不及时、协作工具的复杂性等。而 Codigger 视频会议(Meeting)作为一款创新的工具&#xff0c…

伦敦银和伦敦金的关系是怎么样的?

在贵金属投资市场中,有两个品种是经常被投资者讨论的,一个是伦敦银,而另外一个是伦敦金,他们的名字很相似,那实际上他们有何关系呢?下面我们就来简单地讨论一下。 伦敦银其实也叫国际现货白银,是…

探索3D视觉中的Transformer架构:通用Backbone与自适应采样策略 !

1 Introduction 计算机视觉中的一个基本问题是在三维空间中理解和识别场景与物体。它允许以紧凑的方式表达关系,并提供在现实世界中导航和操作的能力。3D视觉在各个领域都发挥着重要作用,包括自动驾驶、机器人技术、遥感、医疗、增强现实、设计行业等众…

【Nuxt】初识 Nuxt 和目录说明

初识 Nuxt Nuxt3 支持 Vue3 及其周边生态,提供前后端功能,支持 CSR(SPA),SSR,SSG 渲染模式的应用。 Nuxt3 特点: Vue技术栈 Nuxt3是基于Vue3Vue RouterVite等技术栈,全程Vue3Vite开发体验(Fast)。 自动导…

6大类果蔬食物百科大全ACCESS数据库

其实今天这个数据库早些时候就已经搞到了,但是鉴于它的多表结构不太喜欢就一直没有整理,然而现在仔细看起来,又觉得这种安排好处还是很好的,清晰明了。发上来看看有没有朋友喜欢,包含了水果类、蔬菜类、坚果类、肉类、…

xss漏洞(二,xss靶场搭建以及简单利用)

本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 一,环境搭建。 使用工具:PHP study,dvwa靶场。 1,GitHub上下载dvwa到PHP study的WWW文件夹内,并解压。 dvwa下载地址 …