PythonWeb开发基础(二)WSGI概述和APP端开发

简介: 🌼WSGI概述和APP端开发

🌼WSGI概述和APP端开发

8b71db8a2d5049d39cb0db224842575d.png

上图是python中的一种协议,图中的操作顺序是从上往下(我第一次仔细看这种图,之前真不知道)。


WSGI解决了Server和app之间的协议问题。在WSGI中,Server主要是理解HTTP,而请求中的数据应该如何处理不是Server能够决定的,应该由app的编程者来决定如何处理。


任何Web框架,都是客户端有一个请求,就应该得到一个响应。至于响应是被套了多少层最后传过来的,并不重要。响应应该包含响应头和正文两部分,


响应头:应该由app自己发送。Server在调用app的时候,会提供一个方法,比如叫做start_response,然后app调用这个由Server提供的方法来发送响应头。

正文:还是由Server发送

至于为什么要设计成响应头由app发送,我现在还不知道耶。

WSGI服务——wsgiref

wsgiref是python中实现的一个参考库,并不用于商业开发,而是供你自己玩玩(学习使用),你可以在python的相关文档中找到关于它的介绍。

接下来是实操尝试,我们将以本机为服务器,建立一个WSGI服务,并在浏览器中访问它,对它发送http请求。

程序代码

from wsgiref.simple_server import make_server
def simple_app(environ:dict, start_response):
    # setup_testing_defaults(environ)
    print('len:', len(environ))
    for k, v in environ.items():
        print(k, v)
    print('-'*30)
    status = '200 OK'
    headers = [('Content-type', 'text/plain; charset=utf-8')]
    start_response(status, headers)
    ret = [("%s: %s\n" % (key, value)).encode("utf-8")
           for key, value in environ.items()]
    ret = ['Good good study, day day up!\n\n'.encode('utf-8')] + ret
    return ret  # 报文的正文部分,即网页内容
with make_server('0.0.0.0', 9000, simple_app) as httpd:
    print("Serving on port 9000...")
    try:
        httpd.serve_forever()
    except Exception as e:
        print(e)
    except KeyboardInterrupt:
        print('stop')
        httpd.server_close()

我们首先在python编辑器中写下这段代码,然后运行它。此时,我们的电脑本机就是一个持续运行的WSGI服务,随时准备接收来自客户端(浏览器)的http请求,并产生响应。

运行后,在python终端将显示:

Serving on port 9000...

然后我们在浏览器上输入地址:

http://127.0.0.1:9000/

在浏览器上显示为:

image.png

同时在python后台也会将environ打印出来:

image.png

environ

  • 是包含 Http 请求信息的 dict 对象
  • 常见的名称及含义
名称 含义
REQUEST_METHOD 请求方法,GET、POST 等
PATH_INFO URL 中的路径部分
QUERY_STRING 查询字符串
SERVER_NAME, SERVER_PORT 服务器名、端口
HTTP_HOST 地址和端口
SERVER_PROTOCOL 协议
HTTP_USER_AGENT UserAgent 信息

WSGI APP应用程序端

make_server('0.0.0.0', 9000, simple_app)

中的simple_app就是所谓的应用程序,需要满足三个条件:

  • 应用程序应该是一个可调用的对象
  • 这个可调用的对象应该接收两个参数
  • environstart_response
  • 必须返回一个可迭代对象

应用程序可以是函数实现,也可以是类。如果使用类实现有两种方式:

# 类实现 - 1
class Application:
    def _init_(self, environ, start_response):
        ...
    def _iter_(self):
        yield res_str
# 类实现 - 2
class Application:
    def _call_(self, environ, start_response):
        ...
        return [res_str]

Bug记录

我一开始以为是时代变迁,版本不一样所以我出bug了。后面继续看教程发现老师也出了这个bug,还是我心急了一点,没继续往下看就开始自己捣鼓了。

bug: not enough values to unpack

报错:ValueError: not enough values to unpack (expected 2, got 1)

复现代码:

d = {'a':1, 'b':2, 'c':3}
for k, v in d:
    print(k, v)  

修改:

d = {'a':1, 'b':2, 'c':3}
for k, v in d.items():
    print(k, v) 

相关文章
|
7天前
|
Web App开发 缓存 编解码
FFmpeg开发笔记(三十八)APP如何访问SRS推流的RTMP直播地址
《FFmpeg开发实战》书中介绍了轻量级流媒体服务器MediaMTX,适合测试RTSP/RTMP协议,但不适用于复杂直播场景。SRS是一款强大的开源流媒体服务器,支持多种协议,起初为RTMP,现扩展至HLS、SRT等。在FFmpeg 6.1之前,推送给SRS的HEVC流不受支持。要播放RTMP流,Android应用可使用ExoPlayer,需在`build.gradle`导入ExoPlayer及RTMP扩展,并根据URL类型创建MediaSource。若SRS播放黑屏,需在配置文件中开启`gop_cache`以缓存关键帧。
33 2
FFmpeg开发笔记(三十八)APP如何访问SRS推流的RTMP直播地址
|
12天前
|
Android开发 Kotlin
kotlin开发安卓app,如何让布局自适应系统传统导航和全面屏导航
使用`navigationBarsPadding()`修饰符实现界面自适应,自动处理底部导航栏的内边距,再加上`.padding(bottom = 10.dp)`设定内容与屏幕底部的距离,以完成全面的布局适配。示例代码采用Kotlin。
57 15
|
10天前
|
JSON API 数据格式
App Inventor 2 天气预报App开发 - 第三方API接入的通用方法
通过调用第三方天气api,填入必要的参数,通过Web客户端请求url。返回json格式的数据结果,使用AppInventor2解析json结果,显示到App上即可。
55 5
|
7天前
|
数据挖掘
美容院代理分销APP开发:拓展客户群体,增加收益利润
在当今数字化时代,手机APP已经成为人们生活中不可或缺的一部分。对于美容院来说,开发一款代理分销APP具有极高的价值。此APP不仅可以提升业务效率,还可以扩大客户群体,增加收益。
|
12天前
|
存储 API Android开发
kotlin开发安卓app,使用webivew 触发 onShowFileChooser, 但只能触发一次,第二次无法触发,是怎么回事。 如何解决
在Android WebView开发中,`onShowFileChooser`方法用于开启文件选择。当用户只能选择一次文件可能是因为未正确处理选择回调。解决此问题需确保:1) 实现`WebChromeClient`并覆写`onShowFileChooser`;2) 用户选择文件后调用`ValueCallback.onReceiveValue`传递URI;3) 传递结果后将`ValueCallback`设为`null`以允许再次选择。下面是一个Kotlin示例,展示如何处理文件选择和结果回调。别忘了在Android 6.0+动态请求存储权限,以及在Android 10+处理分区存储。
|
14天前
|
存储 移动开发 Android开发
使用kotlin Jetpack Compose框架开发安卓app, webview中h5如何访问手机存储上传文件
在Kotlin和Jetpack Compose中,集成WebView以支持HTML5页面访问手机存储及上传音频文件涉及关键步骤:1) 添加`READ_EXTERNAL_STORAGE`和`WRITE_EXTERNAL_STORAGE`权限,考虑Android 11的分区存储;2) 配置WebView允许JavaScript和文件访问,启用`javaScriptEnabled`、`allowFileAccess`等设置;3) HTML5页面使用`<input type="file">`让用户选择文件,利用File API;
|
12天前
|
小程序 安全 数据挖掘
陪玩语聊APP小程序定制开发模块功能
随着电竞行业的规范化,游戏陪玩软件兴起,提供专业陪玩服务。核心功能包括:多样化注册登录、用户资料展示、智能匹配筛选陪玩、语音互动(多人/私聊)、订单交易管理、陪玩入驻审核、数据分析、客服系统及社交功能。旨在融合游戏、语音聊天与社交,构建综合娱乐平台。
|
18天前
|
运维 Android开发 开发者
你知道APP是怎么开发的吗?
【7月更文挑战第9天】你知道APP是怎么开发的吗?
|
11天前
|
JSON 人工智能 API
App Inventor 2 人脸识别App开发 - 第三方API接入的通用方法
**App 效果图**:展示人脸识别功能,可识别性别和年龄。 **工作原理**:调用第三方人脸识别API,上传图片并接收返回的JSON数据,AppInventor2解析结果显示。
29 0
|
22天前
|
JSON 小程序 数据格式
uni-app 使用vscode开发uni-app
uni-app 使用vscode开发uni-app
59 0

热门文章

最新文章