Django启动流程01-wsgi
概述
- 我们使用django做web开发,90% 的工作内容放在以下部分
- setrting.py 配置数据库,静态资源,安装应用
- url.py 配置路由
- view.py 匹配路由的方法,同数据库的交互
- 前端相关代码的编写
- 那么我们的代码是如何跑起来,交给服务器运行的呢,我有如下几个疑问
- 路由是如何进行匹配的
- 系统是如何检测到我们编写的内容的
- 如果要对路由方法匹配做拓展,要怎么进行操作
从wsgi说起
- wsgi 定义
- web开发需要实现服务端和应用端的通信
- 应用端用python实现,常用的web框架有django,flask
- 服务端一般使用uwsgi,Gunicorn
基于wsgi开发web服务
简单的入门案例
-
下面的代码可直接运行,访问8000端口的时候返回了标题 hello,web
-
hello_web 方法就是一个标准的处理函数,接受两个参数,通过debug 看下两个参数的值
-
environ(包含了一堆系统的环境变量,此处筛选出部分信息)
{ 'PATH_INFO' = {str} '/' # 访问路径 'QUERY_STRING' = {str} '' # 查询的字符串部分 ? 后面的内容 'REMOTE_ADDR' = {str} '127.0.0.1' # 访问ip 'CONTENT_TYPE' = {str} 'text/plain' # 告诉服务器发送的数据是什么格式的 'HTTP_HOST' = {str} 'localhost:8000' # 请求服务器的域名和端口号 }
-
start_response,设置HTTP响应的Header
- 打开浏览器的调试,可以看到此处配置响应头 tuple() 形式的响应组展现在浏览器中
start_response('200 OK', [('Content-Type', 'text/html')])
-
-
完整代码
from wsgiref.simple_server import make_server def hello_web(environ,start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return [b'<h1>Hello, web!</h1>'] http_server = make_server('',8000,hello_web) http_server.serve_forever()
引入面向对象,实现复杂逻辑的路由匹配
-
make_server 中需要传入一个可调用的对象
- 通过对象可以丰富返回的内容
# server.py # 从wsgiref模块导入: import time from wsgiref.simple_server import make_server # 导入我们自己编写的application函数: class BaseWebHandler: def __init__(self): self.birth_time = time.time() def __call__(self, environ, start_response): PI = environ['PATH_INFO'] # 请求路径 print(PI) start_response('200 OK', [('Content-Type', 'text/html;charset=utf-8')]) responst_st = f'我诞生的时间为{self.birth_time}' return [responst_st.encode('utf-8')] bwh = BaseWebHandler() # 创建一个服务器,IP地址为空,端口是8000,处理函数是application: httpd = make_server('', 8000, bwh) print('Serving HTTP on port 8000...') # 开始监听HTTP请求: httpd.serve_forever()
总结
- wsgi 给python的web开发提供了规范和方便
- 基于wsgi协议可以高效,规范的进行web服务的开发
- 下期内容
- 自定义多个路由匹配不同的方法,响应页面内容