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

打印 上一主题 下一主题

主题 967|帖子 967|积分 2901

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
什么是Web服务器

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


平常我们欣赏百度消息数据的时候,天天的消息数据都会发生变革,那访问的这个页面就是动态的,而我们开发的是静态的,天天访问我们自己的静态web服务器,页面的数据不会发生变革

Web服务器的工作原理



  • 用户在终端发出访问请求
  • 通过tcp协议建立链接
  • 生成http报文发送到静态Web服务器中
  • 服务器剖析报文, 并把用户申请的资源打包成http报文发送给用户 
  • 应答体中携带的数据发送到欣赏器欣赏器颠末渲染产生详细页面
 Python搭建浅易的Web服务器

1. 搭建服务器端的基本步骤: 导入socket包, 创建套接字对象, 设置端口复用, 绑定IP和端口号, 设置监听, 担当客户端的数据
  
  1. import socket
  2. # 创建套接字对象
  3. web_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  4. # 设置端口复用
  5. web_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
  6. # 绑定IP和端口
  7. web_server.bind(('',8001))
  8. # 设置监听
  9. web_server.listen(128)
  10. # 接受客户端HTTP报文
  11. while True:
  12.     new_socket, ip_post = web_server.accept()
  13.     recv_data = new_socket.recv(1024)
复制代码
 打印出用户端请求的HTTP报文, 我们可以看到下面的几个部分:

  • 请求行: 请求方法GET, 请求的界面, 使用的协议
  • 请求头: 客户端的详细信息
  • 空行: 空行

为了获取用户详细的请求界面, 对HTTP请求报文做出处置处罚, 通过切割切片可以获得用户详细的资源 
  
  1.     if recv_data:
  2.         recv_data = recv_data.decode('utf-8')
  3.         request_list = recv_data.split(' ',maxsplit=2)
  4.         url = request_list[1][1:]
复制代码
 然后就根据用户请求的资源打包成HTTP相应报文发送给用户即可
留意: 发送的数据要组成HTTP报文的形式, 相应行, 相应头, 空行, 相应体都却以不可
如果服务器没有用户请求的资源, 返回找不到资源给用户, 这里需要留意相应行的状态差别
  
  1.         try:
  2.             with open(url, 'rb') as f:
  3.                 data = f.read()
  4.         except: # 报错没有找到
  5.             # 响应行
  6.             http_line = 'Http/1.1 404 Not Found\r\n'
  7.             # 响应头
  8.             http_header = 'Server:PythonWeb\r\nContent_type = text/html;charset=utf-8 \r\n'
  9.             # 空行
  10.             http_body = "sorry, can't find the resource..."
  11.             response = (http_line+http_header+'\r\n'+http_body).encode('utf-8')
  12.             new_socket.send(response)
  13.         else:  # 没报错, 找到文件
  14.             http_line = 'Http/1.1 200 OK\r\n'
  15.             http_header = 'Server:PythonWeb\r\n'
  16.             response = (http_line + http_header + '\r\n').encode('utf-8') + data
  17.             new_socket.send(response)
  18.         finally:
  19.             new_socket.close()
复制代码
终极的代码如下: 
  
  1. 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:
  2.         recv_data = recv_data.decode('utf-8')
  3.         request_list = recv_data.split(' ',maxsplit=2)
  4.         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, 用户请求的资源的地址
  1. from fastapi import FastAPI
  2. from fastapi import Response
  3. import uvicorn
  4. app = FastAPI()
  5. @app.get('/China_Daily_Website.html')
  6. def China_Daily_Website():
  7.     with open('China_Daily_Website.html','rb') as f:
  8.         data = f.read()
  9.     return Response(content=data, media_type='text/html')
  10. @app.get('/TED.html')
  11. def TED():
  12.     with open('TED.html','rb') as f:
  13.         data = f.read()
  14.     return Response(content=data, media_type='text/html')
复制代码
3.在uvicorn中运行, 第一个参数是FastAPI框架, 第二个参数的绑定的IP地址, 第三个是绑定的端口号
  1. uvicorn.run(app, host='192.168.68.112',port=8000)
复制代码
运行代码, 正常访问界面

 因为我没有下载网页的图片, 以是没有显示出来, 如果你有网页的全部资源, 是可以正常显示的
完整代码 
  1. from fastapi import FastAPI
  2. from fastapi import Response
  3. import uvicorn
  4. app = FastAPI()
  5. @app.get('/China_Daily_Website.html')
  6. def China_Daily_Website():
  7.     with open('China_Daily_Website.html','rb') as f:
  8.         data = f.read()
  9.     return Response(content=data, media_type='text/html')
  10. @app.get('/TED.html')
  11. def TED():
  12.     with open('TED.html','rb') as f:
  13.         data = f.read()
  14.     return Response(content=data, media_type='text/html')uvicorn.run(app, host='192.168.68.112',port=8000)
复制代码
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

前进之路

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表