0


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

文章目录


🌼WSGI概述和APP端开发

在这里插入图片描述

图片来自:Python Web开发基础-学习中心-阿里云开发者社区 (aliyun.com)

上图是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

defsimple_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/

在浏览器上显示为:

在这里插入图片描述

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

在这里插入图片描述

environ

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

WSGI APP应用程序端

make_server('0.0.0.0',9000, simple_app)

中的

simple_app

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

  • 应用程序应该是一个可调用的对象
  • 这个可调用的对象应该接收两个参数- environstart_response
  • 必须返回一个可迭代对象- 应用程序可以是函数实现,也可以是类。如果使用类实现有两种方式:# 类实现 - 1classApplication:def_init_(self, environ, start_response):...def_iter_(self):yield res_str# 类实现 - 2classApplication: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)

标签: python 前端 网络

本文转载自: https://blog.csdn.net/m0_63238256/article/details/128877437
版权归原作者 清风莫追 所有, 如有侵权,请联系我们删除。

“PythonWeb开发基础(二)WSGI概述和APP端开发”的评论:

还没有评论