位置: 编程技术 - 正文

使用Python来编写HTTP服务器的超级指南(python编写步骤)

编辑:rootadmin

推荐整理分享使用Python来编写HTTP服务器的超级指南(python编写步骤),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:用python语言编写,如何用python编写程序,如何用python编写,用python编写的程序有哪些,如何用python编写,用python语言编写,用python编写的程序有哪些,用python语言编写,内容如对您有帮助,希望把文章链接给更多的朋友!

首先,到底什么是网络服务器?

简而言之,它是在物理服务器上搭建的一个网络连接服务器(networking server),永久地等待客户端发送请求。当服务器收到请求之后,它会生成响应并将 其返回至客户端。客户端与服务器之间的通信,是以HTTP协议进行的。客户端可以是浏览器,也可以是任何支持HTTP协议的软件。

那么,网络服务器的简单实现形式会是怎样的呢?下面是我对此的理解。示例代码使用Python语言实现,不过即使你不懂Python语言,你应该也可以从代码和下面的 解释中理解相关的概念:

将上面的代码保存为webserver1.py,或者直接从我的[Github仓库]( lob/master/part1/webserver1.py)下载,然后通过命令行运行该文件:

接下来,在浏览器的地址栏输入这个链接 然后按下回车键,你就会看见神奇的一幕。在浏览器中,应该会出现“ Hello, World!”这句话:

是不是很神奇?接下来,我们来分析背后的实现原理。

首先,我们来看你所输入的网络地址。它的名字叫URL(Uniform Resource Locator,统一资源定位符),其基本结构如下:

通过URL,你告诉了浏览器它所需要发现并连接的网络服务器地址,以及获取服务器上的页面路径。不过在浏览器发送HTTP请求之前,它首先要与目标网络服务器建立TC P连接。然后,浏览器再通过TCP连接发送HTTP请求至服务器,并等待服务器返回HTTP响应。当浏览器收到响应的时候,就会在页面上显示响应的内容,而在上面的例 子中,浏览器显示的就是“Hello, World!”这句话。

那么,在客户端发送请求、服务器返回响应之前,二者究竟是如何建立起TCP连接的呢?要建立起TCP连接,服务器和客户端都使用了所谓的套接字(socket)。接下 来,我们不直接使用浏览器,而是在命令行使用telnet手动模拟浏览器。

在运行网络服务器的同一台电脑商,通过命令行开启一次telnet会话,将需要连接的主机设置为localhost,主机的连接端口设置为,然后 按回车键:

完成这些操作之后,你其实已经与本地运行的网络服务器建立了TCP连接,随时可以发送和接收HTTP信息。在下面这张图片里,展示的是服务器接受新TCP连接所需要完 成的标准流程。

在上面那个telnet会话中,我们输入GET /hello HTTP/1.1,然后按下回车:

你成功地手动模拟了浏览器!你手动发送了一条HTTP请求,然后收到了HTTP响应。下面这幅图展示的是HTTP请求的基本结构:

HTTP请求行包括了HTTP方法(这里使用的是GET方法,因为我们希望从服务器获取内容),服务器页面路径(/hello)以及HTTP协议的版本。

为了尽量简化,我们目前实现的网络服务器并不会解析上面的请求,你完全可以输入一些没有任何意义的代码,也一样可以收到"Hello, World!"响应。

在你输入请求代码并按下回车键之后,客户端就将该请求发送至服务器了,服务器则会解析你发送的请求,并返回相应的HTTP响应。

下面这张图显示的是服务器返回至客户端的HTTP响应详情:

我们来分析一下。响应中包含了状态行HTTP/1.1 OK,之后是必须的空行,然后是HTTP响应的正文。

响应的状态行HTTP/1.1 OK中,包含了HTTP版本、HTTP状态码以及与状态码相对应的原因短语(Reason Phrase)。浏览器收到响应之后,会显示响应的正文,这就是为什么你会在浏览器中看到“Hello, World!”这句话。

这就是网络服务器基本的工作原理了。简单回顾一下:网络服务器首先创建一个侦听套接字(listening socket),并开启一个永续循环接收新连接;客户端启 动一个与服务器的TCP连接,成功建立连接之后,向服务器发送HTTP请求,之后服务器返回HTTP响应。要建立TCP连接,客户端和服务器都使用了套接字。

现在,你已经拥有了一个基本可用的简易网络服务器,你可以使用浏览器或其他HTTP客户端进行测试。正如上文所展示的,通过telnet命令并手动输入HTTP请 求,你自己也可以成为一个HTTP客户端。

下面大家思考一下:如何在不对服务器代码作任何修改的情况下,通过该服务器运行Djando应用、Flask应用和Pyramid应用,同时满足这些不同网络 框架的要求?以前,你选择的Python网络框架将会限制所能够使用的网络服务器,反之亦然。如果框架和服务器在设计时就是可以相互匹配的,那你就不会面临这个问题:

使用Python来编写HTTP服务器的超级指南(python编写步骤)

但是如果你试图将设计不相匹配的服务器与框架相结合,那么你肯定就会碰到下面这张图所展示的这个问题:

这就意味着,你基本上只能使用能够正常运行的服务器与框架组合,而不能选择你希望使用的服务器或框架。

那么,你怎样确保可以在不修改网络服务器代码或网络框架代码的前提下,使用自己选择的服务器,并且匹配多个不同的网络框架呢?为了解决这个问题,就出现了Python Web服务器网关接口(Python Web Server Gateway Interface,简称“WSGI”)。

WSGI的出现,让开发者可以将网络框架与网络服务器的选择分隔开来,不再相互限制。现在,你可以真正地将不同的网络服务器与网络开发框架进行混合搭配,选择满足自己需求的组合。例如,你可以使用Gunicorn或Nginx/uWSGI或Waitress服务器来运行Django、Flask或Pyramid应用。正是由于服务器和框架均支持WSGI,才真正得以实现二者之间的自由混合搭配。

所以,WSGI就是我在上一篇文章中所留问题的答案。你的网络服务器必须实现一个服务器端的WSGI接口,而目前所有现代Python网络框架都已经实现了框架端的WSGI接口,这样开发者不需要修改服务器的代码,就可以支持某个网络框架。

网络服务器和网络框架支持WSGI协议,不仅让应用开发者选择符合自己需求的组合,同时也有利于服务器和框架的开发者,因为他们可以将注意力集中在自己擅长的领域,而不是相互倾轧。其他编程语言也拥有类似的接口:例如Java的Servlet API和Ruby的Rack。

口说无凭,我猜你肯定在想:“无代码无真相!”既然如此,我就在这里给出一个非常简单的WSGI服务器实现:

上面的代码比第一部分的服务器实现代码要长的多,但是这些代码实际也不算太长,只有不到行,大家理解起来并不会太困难。上面这个服务器的功能也更多——它可以运行你使用自己喜欢的框架所写出来的网络应用,无论你选择Pyramid、Flask、Django或是其他支持WSGI协议的框架。

你不信?你可以自己测试一下,看看结果如何。将上述代码保存为webserver2.py,或者直接从我的Github仓库下载。如果你运行该文件时没有提供任何参数,那么程序就会报错并退出。

上述程序设计的目的,就是运行你开发的网络应用,但是你还需要满足一些它的要求。要运行服务器,你只需要安装Python即可。但是要运行使用Pyramid、Flask和Django等框架开发的网络应用,你还需要先安装这些框架。我们接下来安装这三种框架。我倾向于使用virtualenv安装。请按照下面的提示创建并激活一个虚拟环境,然后安装这三个网络框架。

接下来,你需要创建一个网络应用。我们首先创建Pyramid应用。将下面的代码保存为pyramidapp.py文件,放至webserver2.py所在的文件夹中,或者直接从我的Github仓库下载该文件:

现在,你可以通过自己开发的网络服务器来启动上面的Pyramid应用。

在运行webserver2.py时,你告诉自己的服务器去加载pyramidapp模块中的app可调用对象(callable)。你的服务器现在可以接收HTTP请求,并将请求中转至你的Pyramid应用。应用目前只能处理一个路由(route):/hello。在浏览器的地址栏输入 response headers),然后将二者传递至start_response,等待服务器保存。此外,框架/应用还将返回响应的正文。服务器将状态码、响应报头和响应正文组合成HTTP响应,并返回给客户端(这一步并不属于WSGI协议)。下面这张图直观地说明了WSGI接口的情况:

有一点要提醒大家,当你使用上述框架开发网络应用的时候,你处理的是更高层级的逻辑,并不会直接处理WSGI协议相关的要求,但是我很清楚,既然你正在看这篇文章,你一定对框架端的WSGI接口很感兴趣。所以,我们接下来在不使用Pyramid、Flask或Djando框架的前提下,自己开发一个极简的WSGI网络应用/网络框架,并使用WSGI服务器运行该应用:

将上述代码保存为wsgiapp.py文件,或者直接从我的Github仓库下载,然后利用网络服务器运行该应用:

在浏览器中输入下图中的地址,然后按回车键。结果应该是这样的:

你刚刚自己编写了一个极简的WSGI网络框架!太不可思议了。

接下来,我们重新分析服务器返回给客户端的对象。下面这张图展示的是你通过HTTP客户端调用Pyramid应用后,服务器生成的HTTP响应:

上图中的响应与你在第一篇中看到的有些类似,但是也有明显不同之处。举个例子,其中就出现了你之前没有看到过的4歌HTTP报头:Content-Type,Content-Length,Date和Server。这些事网络服务器返回的响应对象通常都会包含的报头。不过,这四个都不是必须的。报头的目的是传递有关HTTP请求/响应的额外信息。

既然你已经对WSGI接口有了更深的理解,下面这张图对响应对象的内容进行了更详细的解释,说明了每条内容是如何产生的。

到目前为止,我还没有介绍过environ字典的具体内容,但简单来说,它是一个必须包含着WSGI协议所指定的某些WSGI和CGI变量。服务器从HTTP请求中获取字典所需的值。下面这张图展示的是字典的详细内容:

网络框架通过该字典提供的信息,根据指定的路由和请求方法等参数来决定使用哪个视图(views),从哪里读取请求正文,以及如何输出错误信息。

截至目前,你已经成功创建了自己的支持WSGI协议的网络服务器,还利用不同的网络框架开发了多个网络应用。另外,你还自己开发了一个极简的网络框架。本文介绍的内容不可谓不丰富。我们接下来回顾一下WSGI网络服务器如何处理HTTP请求:

首先,服务器启动并加载网络框架/应用提供的application可调用对象 然后,服务器读取一个请求信息 然后,服务器对请求进行解析 然后,服务器使用请求数据创建一个名叫environ的字典 然后,服务器以environ字典和start_response可调用对象作为参数,调用application,并获得应用生成的响应正文。 然后,服务器根据调用application对象后返回的数据,以及start_response设置的状态码和响应标头,构建一个HTTP响应。 最后,服务器将HTTP响应返回至客户端。

标签: python编写步骤

本文链接地址:https://www.jiuchutong.com/biancheng/382369.html 转载请保留说明!

上一篇:python装饰器与递归算法详解

下一篇:使用Python的PIL模块来进行图片对比(pythonipo模型)

  • 公司首次申报个税怎么填
  • 小型微利企业所得税减免政策
  • 安全生产费实际发生必须是付款吗还是挂帐也可以
  • 培训学校可以不可以用燃气取暖炉
  • 多计提个税怎么办
  • 国有资本及权益客观增减因素
  • 企业如何加强应收账款的管理
  • 税务证丢失可以注销吗
  • 公司注销银行公户怎么注销
  • 现金支票存根如何填写
  • 原材料入库是付款凭证吗
  • 只有税控盘没有报税盘
  • 工程款先开票
  • 收到保险赔款是什么意思
  • 个人独资企业个人所得税核定征收
  • 地税逾期申报怎么处理
  • 异地预缴增值税后本地还要交吗
  • 项目部临时设施平面图
  • 房地产企业未出售的房子是否要交房产税
  • 企业合同约定调岗不接受辞退没赔偿成立吗
  • 企业如何做好税务管理工作
  • 借款给其他公司的会计分录怎么写
  • 电子税务局进项票汇总
  • 电子发票二维码怎么下载
  • 旅游业开办费
  • 个人取得的拍卖资格
  • 股权变更之后税务变更
  • 农村合作社收到奖金分录
  • 信汇凭证是转账凭证吗
  • 其他应收款借方和贷方什么意思
  • 个人银行卡转公账怎么转
  • 经营租赁中出租人发生的初始直接费用是指
  • 新会计准则下职工薪酬的变化及影响摘要
  • 其他有形动产租赁服务
  • 找不到powershell.exe文件
  • 为什么我的win10
  • 跨越红字专用发票开票流程
  • 分期服务费是啥
  • 辞退补偿入账
  • win10系统如何开启蓝牙
  • 有哪些分享方式
  • 经营性租赁与融资性租赁
  • 成本法转为权益法追溯的理解
  • 电脑上fci是什么文件
  • 银行罚息可不可以扣除
  • 一文通透从输入URL到页面渲染的全过程----高频面试
  • ChatGPT 的 10 种集成模式:从开源 AI 体验平台 ClickPrompt 中受到的启发
  • 期末结转会计分录模板
  • 所得税费用会计科目代码
  • 代缴社保零申报对个人有影响吗
  • 已经抵扣的进项税额转出会计分录
  • 非营利组织增值税怎么处理
  • 盘盈盘亏的定义
  • 汇算清缴时资产折旧怎么填
  • 预包装的标签有哪几种
  • 视同内销账务处理怎么做?
  • 付款后没有发票怎么办
  • 直接人工成本包括管理人员开的工资吗
  • 农业公司土地租赁
  • 小规模纳税人增值税账务处理
  • 用友无法填制凭证
  • 残疾人就业保障金
  • 收到支票如何去银行兑现
  • 彻底删除win8应用商店
  • linux怎么修改
  • 家庭版的海鲜大杂烩
  • 最近一段时间勒索病毒在全球集中爆发
  • win8系统怎么设置自动关机
  • win10红石版
  • 应该怎么修复
  • win8文件夹选项在哪
  • 游戏引擎有几种
  • js旋转函数
  • jquery基础知识
  • shell 时间运算
  • python怎么发送
  • 9月1日起陕西省房产契税新政
  • 广西电子税务局电话人工客服电话
  • 个人所得税税率怎么算
  • 公司租房的房产税应计入哪个科目
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设