当前位置: 首页 > article >正文

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服务的开发
  • 下期内容
    • 自定义多个路由匹配不同的方法,响应页面内容

http://www.kler.cn/a/389991.html

相关文章:

  • 同三维T610UDP-4K60 4K60 DP或HDMI或手机信号采集卡
  • 【2024最新】基于springboot+vue的闲一品交易平台lw+ppt
  • 使用 Sparkle 实现 macOS 应用自定义更新弹窗
  • group_concat配置影响程序出bug
  • Debezium系列之:发件箱事件路由器
  • 运行WHTools批量启动游戏房间工具提示要安装.Net Framework3.5解决
  • ES7 查询超过10000条 返回条数错误
  • 基本MFC类框架的俄罗斯方块游戏
  • 【动态规划】斐波那契数列模型总结
  • 四焦距聚焦型光场计算成像系统的设计
  • 我的博客网站为什么又回归Blazor了
  • 【jenkins】jenkins使用pipeline配置django项目
  • 服务器同步时间脚本
  • 【LeetCode】【算法】21. 合并两个有序链表
  • C++《stack与queue》
  • 水库大坝安全监测预警方法
  • 应用于新能源汽车NCV4275CDT50RKG车规级LDO线性电压调节器芯片
  • 在 Java 中使用脚本语言
  • 100种算法【Python版】第58篇——滤波算法之卡尔曼滤波
  • SpringBoot(十三)SpringBoot配置webSocket
  • 深度解读UI设计:从概念到实践一站式知晓
  • 从0开始机器学习--Day16--神经网络作业
  • uni-app文章列表制作⑧
  • 经典网络模型
  • 双指针(二)双指针到底是怎么个事
  • 图书管理系统(Java实现)