zoukankan      html  css  js  c++  java
  • python_原始_web框架

    创:10_4_2017

    修:

    什么是web框架?

           -- 本质上是socket,用户请求来,业务逻辑处理,返回处理结果

           -- 包含socket或者不包含socket的框架

    什么是wsgi?

           -- web框架网关接口,Django、flask没有自带socket,  tronado框架自带socket

           -- python中有 wsgiref模块自带socket服务,在python3使用该模块会有问题

    如何写一个简单的web框架?

           -- 导入 wsgi模块

           -- 定义主逻辑处理函数,主函数中获得请求url和定义回复请求逻辑

           -- 判断URL,然后把符合要求的URL分给对应的处理函数

           -- 在主函数中返回 对应函数处理结果

           -- 在mian函数中实例服务对象并启动web服务

    #!/usr/bin/python2
    # -*- coding:utf-8 -*-
    from wsgiref.simple_server import make_server
    
    def home():
        return 'home'
    
    def index():
        return 'index'
    
    def RunServer(environ, start_response):
        start_response('200 ok', [('Content-Type', 'text/html')])
        print environ['PATH_INFO']
        url = environ['PATH_INFO']
    
        if url == '/home':
            return home()
        elif url == '/index':
            return index()
    
    if __name__ == '__main__':
        httpd = make_server('', 9999, RunServer)
        httpd.serve_forever()
    
    # URL每次都要判断,当URL有太多的时候,就出来很多重复代码
    # 如果再加入数据库操作,就显得有点杂乱,逻辑结构混乱,如何解决?
    # 不妨先把URL和对应函数进行归类

      上面的服务有问题,哪些问题?URL和处理函数放在了一起,有点乱

    #!/usr/bin/python2
    # -*- coding:utf-8 -*-
    from wsgiref.simple_server import make_server       # 导入wsgi模块
    
    def home():
        with open('home.html', 'r') as f:               # 打开文件,读进来
            data = f.read()
        return data                                     # home逻辑处理
    
    def index():
        return 'welcome to index'                       # index逻辑处理
    
    URLS = {                                            # url和函数之间通过字典建立映射关系
        '/home': home,
        '/index': index,
    }
    
    def RunServer(environ, start_response):             # 对请求url处理与匹配
        start_response('200 ok', [('Content-Type', 'text/html')])
        url = environ['PATH_INFO']
    
        if url in URLS.keys():                          # 判断url是否在URLS中
            func = URLS[url]                            # 在就调用处理函数
            return func()                               # 返回处理结果
        else:
            return '404'                                # 不在返回错误404
    
    if __name__ == '__main__':
        httpd = make_server('', 9999, RunServer)
        httpd.serve_forever()
    
    # 虽然实现了不对主逻辑函数修改,只需要修改URL字典,就可以解决匹配问题
    # 逻辑结构不混乱,但是处理函数和URL过多的话,全写在一个页面,不太容易维护与阅读,如何实现?
    # 不妨把各自功能写在一个.py文件中,然后通过各自导入不就实现了分类,逻辑清晰?
    # 不妨把url写在一个url.py文件中,处理函数写在ccontrollers中,返回的html写在view目录中,不就解决这个问题了? 

      

    先建立yizhihua目录,保存目录下__init__.py文件,在yizhihua目录下面建立如下文件

      - urls.py  写入

    from yizhihua import controllers
    
    URLS = {                                            # url和函数之间通过字典建立映射关系
        '/home': controllers.home,
        '/index': controllers.index,
    }
    

      - start.py  写入  -启动程序入口

    #!/usr/bin/python2
    # -*- coding:utf-8 -*-
    from wsgiref.simple_server import make_server       # 导入wsgi模块
    from yizhihua import urls                           # 导入urls模块
    
    
    def RunServer(environ, start_response):             # 对请求url处理与匹配
        start_response('200 ok', [('Content-Type', 'text/html')])
        url = environ['PATH_INFO']
    
        if url in urls.URLS.keys():                     # 判断url是否在URLS中
            func = urls.URLS[url]                       # 在就调用处理函数
            return func()                               # 返回处理结果
        else:
            return '404'                                # 不在返回错误404
    
    if __name__ == '__main__':
        httpd = make_server('', 9999, RunServer)
        httpd.serve_forever()
    

      - controllers.py  写入  - 逻辑处理函数

    from jinja2 import Template
    import os
    
    def home():
        with open(os.path.join('views', 'home.html'), 'r',) as f:        # 打开文件,读进来
            result = f.read()
        template = Template(result)                      # 实例渲染对象
        data = template.render({'user_list':['18', 'beauty', 'hehe'], 'name':'yizhua'})  # 渲染模版
        return data.encode('utf-8')                      # 字符转码
    
    def index():
        with open(os.path.join('views', 'index.html'), 'r') as f:      # 打开文件,读进来
            data = f.read()
        return data                                                   # index逻辑处理
    
    # os.path.join() 把两个字符拼成路径
    

       - view目录 ,在此目录下保存html文件,模版文件

        - home.html  写入

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>home</title>
     6 </head>
     7 <body>
     8     <h1>{{name}}</h1>
     9     <ul>
    10         {% for item in user_list %}
    11         <li>{{ item }}</li>
    12         {% endfor %}
    13     </ul>
    14 </body>
    15 </html>

        - index.html  写入

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>index页面</title>
     6 </head>
     7 <body>
     8     <h1>index</h1>
     9 </body>
    10 </html>

      - models.py  暂时不写入, 主要用于写数据表结构,和数据库交互

      然后启动start模块,访问 http://127.0.0.1:9999/home 或 http://127.0.0.1:9999/index 获得返回的页面

    框架中有哪些模块?

           -- models             数据库相关操作

           -- views              模版html文件

           -- controllers        业务逻辑

           其实是把代码进行逻辑分类,通过其中各自相互导入,实现整体性,上面是mvc框架

           -- models             数据库相关处理

           -- views                业务逻辑

           -- Tempates         模版html文件

           这个就是MTV框架,本质上和MVC一样,只是名字不一样

    如何实现动态向模版中传入参数?

           -- 替换一个值       自定义{{item}}  ,然后通过字符替换data.replace({{item}}, ‘替换值’)

           -- 循环替换

           模版语言有哪些模块?

                  jinja2模块,模版语言

                  -- pip install jinja2

                  - 导入 from jinja2 import Template

                  - 把读进来的结果传给template       template = Template(读进来的结果)

                  - 把结果渲染        data = template.render({字段1 :值1,列表 2 :列表值 2})   字典形式

                         替换值: 在模版中把 {{ 字段1 }} 的位置替换成值1

                         循环:{% for item in 列表2 %}

              {{ item }}

              {% endfor %}   在模版中循环每次把列表值2放入{{ item }}的位置

         - 一般写在html中,然后在逻辑函数

          --渲染完成之后,后面要转码 .decode(‘utf-8’)

             

  • 相关阅读:
    C#与SAP进行数据交互
    自动加减工单结存算法实现
    RDLC报表打印一维码
    调用存储过程通用类
    监听网络状态
    压缩及解压缩文件
    用Go造轮子-管理集群中的配置文件
    2015年总结
    浅析Go语言的Interface机制
    2014年总结
  • 原文地址:https://www.cnblogs.com/2bjiujiu/p/6690331.html
Copyright © 2011-2022 走看看