Django框架简介,wsgiref 与 jinja2 模块

  • 2019 年 10 月 8 日
  • 筆記

目录

框架简介

  • Django是一个web开发框架,用来开发web应用,本质就是, web框架+socket服务端
  • MVC框架和MTV框架
MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:  模(Model)、视图(View)和控制器(Controller),具有耦合性低、重用性高、生命周期成本低等优点。    Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性。  Django框架的不同之处在于它拆分的三部分为:Model(模型)、Template(模板)和View(视图),也就是MTV框架。
  • M:model模型 和数据库打交道
  • V:view 视图 HTML
  • C:controller 控制器 调度 传递指令
  • Django的MTV模式
Model(模型):负责业务对象与数据库的对象(ORM)           Template(模版):负责如何把页面展示给用户           View(视图):负责业务逻辑,并在适当的时候调用Model和Template    此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,  view再调用相应的Model和Template
  • M:model模型 OMR
  • T:tempalte 模板 HTML
  • V:view 视图 函数 业务逻辑
  • WSGI(Web Server Gateway Interface 规范)
服务器程序就需要为不同的框架提供不同的支持。这样混乱的局面无论对于服务器还是框架,都是不好的。  对服务器来说,需要支持各种不同框架,对框架来说,只有支持它的服务器才能被开发出的应用使用。    这时候,标准化就变得尤为重要。我们可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,  那么他们就可以配合使用。一旦标准确定,双方各自实现。这样,服务器可以支持更多支持标准的框架,  框架也可以使用更多支持标准的服务器。    WSGI(Web Server Gateway Interface)就是一种规范,它定义了使用Python编写的web应用程序  与web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。    常用的WSGI服务器有uWSGI、Gunicorn。而Python标准库提供的独立WSGI服务器叫wsgiref,  Django开发环境用的就是这个模块来做服务器

wsgiref模块

  • Python标准库提供的独立WSGI服务器叫wsgiref (主要要用开发测试使用,效率较低)
  • 上线服务器一般使用uWSGI
#wsgiref模块来替换我们自己写的web框架的socket server部分:        """      根据URL中不同的路径返回不同的内容--函数进阶版      返回HTML页面      让网页动态起来      wsgiref模块版      """        from wsgiref.simple_server import make_server          # 将返回不同的内容部分封装成函数      def index(url):          # 读取index.html页面的内容          with open("index.html", "r", encoding="utf8") as f:              s = f.read()          # 返回字节数据          return bytes(s, encoding="utf8")          def home(url):          with open("home.html", "r", encoding="utf8") as f:              s = f.read()          return bytes(s, encoding="utf8")          def timer(url):          import time          with open("time.html", "r", encoding="utf8") as f:              s = f.read()              s = s.replace('@@time@@', time.strftime("%Y-%m-%d %H:%M:%S"))          return bytes(s, encoding="utf8")          # 定义一个url和实际要执行的函数的对应关系      list1 = [          ("/index/", index),          ("/home/", home),          ("/time/", timer),      ]          def run_server(environ, start_response):          start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ])  # 设置HTTP响应的状态码和头信息          url = environ['PATH_INFO']  # 取到用户输入的url          func = None          for i in list1:              if i[0] == url:                  func = i[1]                  break          if func:              response = func(url)          else:              response = b"404 not found!"          return [response, ]          if __name__ == '__main__':          httpd = make_server('127.0.0.1', 8090, run_server)          httpd.serve_forever()  
  • html代码
<!--index页面  一个文件放一段代码,我这里写在一起了-->  <!DOCTYPE html>  <html lang="en">  <head>      <meta charset="UTF-8">      <meta http-equiv="x-ua-compatible" content="IE=edge">      <meta name="viewport" content="width=device-width, initial-scale=1">      <title>index</title>  </head>  <body>  <div>这是index页面</div>  </body>  </html>    <!--home页面   一个文件放一段代码,我这里写在一起了-->  <!DOCTYPE html>  <html lang="en">  <head>      <meta charset="UTF-8">      <meta http-equiv="x-ua-compatible" content="IE=edge">      <meta name="viewport" content="width=device-width, initial-scale=1">      <title>home</title>  </head>  <body>  <div>这是home页面</div>  </body>  </html>    <!--time页面   一个文件放一段代码,我这里写在一起了-->  <!DOCTYPE html>  <html lang="en">  <head>      <meta charset="UTF-8">      <title>time</title>  </head>  <body>      <div>@@time@@</div>  </body>  </html>
  • 执行结果

jinja2 模块

#上面的代码实现了一个简单的动态,我完全可以从数据库中查询数据,然后去替换我html中的对应内容,  然后再发送给浏览器完成渲染。 这个过程就相当于HTML模板渲染数据。 本质上就是HTML内容中利用  一些特殊的符号来替换要展示的数据。 我这里用的特殊符号是我定义的,其实模板渲染有个现成的工具: jinja2    #命令行安装jinja2模块        pip install jinja2      # 使用jinja2渲染index2.html文件: 代码  from wsgiref.simple_server import make_server  from jinja2 import Template    def index(url):      # 读取HTML文件内容      with open("index2.html", "r", encoding="utf8") as f:          data = f.read()          template = Template(data)   # 生成模板文件          ret = template.render({'name': '钢蛋', 'hobby_list': ['抽烟', '喝酒', '上网']})   # 把数据填充到模板中      return bytes(ret, encoding="utf8")      def home(url):      with open("home.html", "r", encoding="utf8") as f:          s = f.read()      return bytes(s, encoding="utf8")      # 定义一个url和实际要执行的函数的对应关系  list1 = [      ("/index/", index),      ("/home/", home),  ]      def run_server(environ, start_response):      start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ])  # 设置HTTP响应的状态码和头信息      url = environ['PATH_INFO']  # 取到用户输入的url      func = None      for i in list1:          if i[0] == url:              func = i[1]              break      if func:          response = func(url)      else:          response = b"404 not found!"      return [response, ]      if __name__ == '__main__':      httpd = make_server('127.0.0.1', 8090, run_server)      httpd.serve_forever() 
<!DOCTYPE html>  <html lang="zh-CN">  <head>    <meta charset="UTF-8">    <meta http-equiv="x-ua-compatible" content="IE=edge">    <meta name="viewport" content="width=device-width, initial-scale=1">    <title>Title</title>  </head>  <body>      <h1>姓名:{{name}}</h1>            <!--规定写法{{}}-->      <h1>爱好:</h1>      <ul>          {% for hobby in hobby_list %}  <!--规定写法{% %}交给python识别-->          <li>{{hobby}}</li>          {% endfor %}                 <!--规定写法{% endfor %}交给python识别 结束循环-->      </ul>  </body>  </html>
  • 执行结果
  • 使用数据库中查询数据,来填充页面
#使用pymysql连接数据库:  conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="xxx", db="xxx", charset="utf8")  cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  cursor.execute("select name, age, department_id from userinfo")  user_list = cursor.fetchall()  cursor.close()  conn.close()    #创建一个测试的user表:  CREATE TABLE user(    id int auto_increment PRIMARY KEY,    name CHAR(10) NOT NULL,    hobby CHAR(20) NOT NULL  )engine=innodb DEFAULT charset=UTF8;    #模板的原理就是字符串替换,我们只要在HTML页面中遵循jinja2的语法规则写上,  其内部就会按照指定的语法进行相应的替换,从而达到动态的返回内容。
  • 简单了解一下python web框架
  • web 框架实现的功能
# django框架,tornado(异步非阻塞的轻量级框架),flask框架    django框架实现的功能  上图的 2,3 功能    tornado框架实现的功能 上图的 1,2,3 功能    flask框架实现的功能   上图的 2 功能

作 者:郭楷丰