zoukankan      html  css  js  c++  java
  • Django框架简介,wsgiref 与 jinja2 模块

    框架简介

    • 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 功能
    
    作 者:郭楷丰
    声援博主:如果您觉得文章对您有帮助,可以点击文章右下角 推荐一下。您的鼓励是博主的最大动力!
    自 勉:生活,需要追求;梦想,需要坚持;生命,需要珍惜;但人生的路上,更需要坚强。带着感恩的心启程,学会爱,爱父母,爱自己,爱朋友,爱他人。
  • 相关阅读:
    【C#4.0图解教程】笔记(第19章~第25章)
    【C#4.0图解教程】笔记(第9章~第18章)
    【C#4.0图解教程】笔记(第1章~第8章)
    平衡二叉树(AVL Tree)
    整数中1出现的次数(从1到n整数中1出现的次数)
    java实现回溯算法
    输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
    怎么用Markdown在github上写书,并用pages展示
    二叉搜索树与双向链表
    复杂链表的复制
  • 原文地址:https://www.cnblogs.com/guokaifeng/p/11007359.html
Copyright © 2011-2022 走看看