Python Web 应用程序:WSGI 的基础知识

python:wsgiref --- WSGI 工具和参考实现 阅读详情

WSGI 的基础知识

在Django、Flask、Bottle和所有其他 Python Web 框架之下,都有 Web 服务器网关接口,简称 WSGI。WSGI 之于 Python 就像 Servlet 之于 Java 一样——一种用于 Web 服务器的通用规范,它允许不同的 Web 服务器和应用程序框架基于通用 API 进行交互。然而,与大多数事情一样,Python 版本要简单得多。

WSGI 在PEP 3333中定义,如果您在此快速介绍之后需要更多信息,我鼓励您将其作为参考阅读。

本文将从应用程序开发人员的角度向您介绍 WSGI 规范,并向您展示如何直接使用 WSGI 来创建应用程序(如果您愿意的话)。

你的第一个 WSGI 应用

这是最基本的 Python Web 应用程序:

<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-python">def <span style="color:#82aaff">app</span><span style="color:#c792ea">(</span>environ<span style="color:#c792ea">,</span> start_fn<span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
    start_fn<span style="color:#c792ea">(</span><span style="color:#c3e88d">'200 OK'</span><span style="color:#c792ea">,</span> <span style="color:#c792ea">[</span><span style="color:#c792ea">(</span><span style="color:#c3e88d">'Content-Type'</span><span style="color:#c792ea">,</span> <span style="color:#c3e88d">'text/plain'</span><span style="color:#c792ea">)</span><span style="color:#c792ea">]</span><span style="color:#c792ea">)</span>
    return <span style="color:#c792ea">[</span><span style="color:#c3e88d">"Hello World!\n"</span><span style="color:#c792ea">]</span>
</code></span></span>

而已!整个文件。将它命名为 app.py 并在任何与 WSGI 兼容的服务器上运行它,您将获得一个带有 200 状态的 Hello World 响应。您可以为此使用 gunicorn;只需通过 pip( pip install gunicorn) 安装它并使用gunicorn app:app. 此命令告诉 gunicorn 从 app 模块中的 app 变量获取 WSGI 可调用对象。

现在,你应该很兴奋。运行应用程序只需 3 行?那一定是某种记录(除了 PHP,因为 mod_php 是作弊的)。我敢打赌,你只是想知道更多。

那么 WSGI 应用程序的基本部分是什么?

  • WSGI 应用程序是 Python可调用的,例如函数、类或具有__call__方法的类实例
  • 应用程序可调用必须接受两个参数:environ,它是一个包含请求数据的 Python 字典,以及start_fn,它本身是可调用的。
  • 应用程序必须start_fn使用两个参数调用:状态代码(作为字符串)和表示为 2 元组的标头列表。
  • 应用程序返回一个包含响应正文中字节的可迭代对象,以方便的、可流式传输的块形式——在本例中,是一个仅包含"Hello, World!". (如果app是一个类,这可以在__iter__方法中完成。)

举例来说,接下来的两个例子与第一个例子是等价的:

<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-python">class <span style="color:#ffcb6b">app</span><span style="color:#c792ea">(</span><span style="color:#82aaff">object</span><span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>

    def <span style="color:#82aaff">__init__</span><span style="color:#c792ea">(</span>self<span style="color:#c792ea">,</span> environ<span style="color:#c792ea">,</span> start_fn<span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
        self<span style="color:#c792ea">.</span>environ <span style="color:#89ddff">=</span> environ
        self<span style="color:#c792ea">.</span>start_fn <span style="color:#89ddff">=</span> start_fn

    def <span style="color:#82aaff">__iter__</span><span style="color:#c792ea">(</span>self<span style="color:#c792ea">)</span><span style="color:#c792ea">:</span>
        self<span style="color:#c792ea">.</span>start_fn<span style="color:#c792ea">(</span><span styl
Python学习笔记-WSGI接口 environ:包含http所有请求的字典对象start_response:一个发送Http响应的函数,可以简单的理解为头部信息。return:返回的主体信息。Python中可以使用wsgiref模块定义WSGI接口。 阅读详情

相关推荐

Java utgard连接OPC问题记录

怎么开启是个问题, 是在引入openscada的jar包里的Sever类中修改,这就犯难了, 其实没必要, 只要在自己项目下创建与openscada中Server类相同的路径,并复制Server过去改就行了, 项目会优先使用本地类,像下面这样。奇迹发生了,0x00000005解决. 注: 我的安全补丁编码跟网上查到的并不一样, 所以最初没有删,后来全都删了就好了,这个编码规则咱也不知道.安全日志中记录用户登录行为, OPC通信需要使用Windows系统用户进行登录, 如果用户名密码错误这里会有相关记录.

wangxin1949的博客 2844

决策树简介/PPT

最近给我们组新生讲了决策树的相关知识,以下是所做的PPT,参考了网络资源。

垃圾就应该待在垃圾桶里的博客 3796

避免bank conflict的使用共享内存的矩阵转置。及其循环展开。转置前后都是行主序,中间共享内存中是列主序

为了避免bank conflict,可以使用padding的方式将数组中的每一行各自占据一个bank,这样每个线程读取不同行的数据时就不会发生bank conflict。padding的方式是在每行数据后面添加一定数量的空数据,使得每行的字节数恰好是bank的整数倍,这样就能保证每行数据各自占据一个bank。具体来说,当一个线程访问共享内存中的一个元素时,GPU会根据该元素在共享内存中的地址计算出其所在的bank,然后将该元素从该bank中读取出来。

weixin_55035144的博客 2144

基于SOCKET的***网络软件的设计与实现

二、基于SOCKET的网络软件的需求。2、概要设计:画出软件系统结构图。3、详细设计:软件的详细设计,如类图、序列图、重要的算法流程图或伪代码,等等。4、实现:软件基本功能相关的截图和关键代码。

Recursions的博客 1373

Mac上安装虚拟机搭载window系统

用Mac的都知道,很多window用的软件是Mac版本没有的。平时有的还得要求去用那些软件,有几种方式可供大家选择: 1.再买个window本; 2.装双系统; 3.装虚拟机,搭载window系统。 我比较推荐第3条,这样可以在Mac本上做到双开,一边开着mac一边开着window,还能做到同时处理文件,不至于重新启动操作系统,下边是具体实现步骤,其中有几个需要下载的,建议在网速好的时候完...

Coder_Mumu的博客 1万+

Isaac Sim 6 利用Replicator实现高效语义分割与实例分割(实践指南5.10)

本文详细介绍了如何利用Isaac Sim 6的Replicator工具高效生成语义分割和实例分割数据集。通过虚拟环境自动标注,效率提升20倍以上,特别适用于农业机器人等计算机视觉项目。文章包含环境配置、场景构建、批量标注技巧及实例分割处理等实战指南,帮助开发者快速掌握合成数据生成技术。

weixin_42526415的博客 268

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: 2022 年即将到来的 5 个网页设计趋势
下一篇: Python初学者面临的5个常见问题
程序员孔乙己
博客等级 码龄5年 1190粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值