创: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服务

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

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

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

  

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

  - urls.py  写入

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

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

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

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

  1. from jinja2 import Template
  2. import os
  3.  
  4. def home():
  5. with open(os.path.join('views', 'home.html'), 'r',) as f: # 打开文件,读进来
  6. result = f.read()
  7. template = Template(result)                      # 实例渲染对象
  8. data = template.render({'user_list':['18', 'beauty', 'hehe'], 'name':'yizhua'})  # 渲染模版
  9. return data.encode('utf-8')                      # 字符转码
  10.  
  11. def index():
  12. with open(os.path.join('views', 'index.html'), 'r') as f: # 打开文件,读进来
  13. data = f.read()
  14. return data # index逻辑处理
  15.  
  16. # 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’)

python_原始_web框架的更多相关文章

  1. python_接口自动化测试框架

    本文总结分享介绍接口测试框架开发,环境使用python3+selenium3+unittest+ddt+requests测试框架及ddt数据驱动,采用Excel管理测试用例等集成测试数据功能,以及使用 ...

  2. Django _web框架本质

    Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. socket服务端 import  ...

  3. 大数据计算框架Hadoop, Spark和MPI

    转自:https://www.cnblogs.com/reed/p/7730338.html 今天做题,其中一道是 请简要描述一下Hadoop, Spark, MPI三种计算框架的特点以及分别适用于什 ...

  4. [ 转载 ] Python Web 框架:Django、Flask 与 Tornado 的性能对比

    本文的数据涉及到我面试时遇到过的问题,大概一次 http 请求到收到响应需要多少时间.这个问题在实际工作中与框架有比较大的关系,因此特别就框架的性能做了一次分析. 这里使用 2016 年 6 月 9 ...

  5. <关于并发框架>Java原生线程池原理及Guava与之的补充

    原创博客,转载请联系博主! 转眼快两个月没有更新自己的博客了. 一来感觉自己要学的东西还是太多,与其花几个小时写下经验分享倒不如多看几点技术书. 二来放眼网上已经有很多成熟的中文文章介绍这些用法,自己 ...

  6. 基于IDEA采用springboot+Mybatis搭建ssm框架简单demo项目的搭建配置流程

    一.通过对比可以原始SSM搭建流程,spring boot省去了大量的配置,极大提高了开发者的效率.原始SSM框架搭建流程见博客: https://www.cnblogs.com/No2-explor ...

  7. 客户端热更新框架之UI热更框架设计(下)

    上一篇笔者介绍了关于什么是热更新,为什么需要热更新的技术文章.本篇就专门针对UI框架的热更新功能实现部分展开讨论,讨论的重点是热更新如何与UI框架进行结合? 现在笔者把设计“UI热更新框架”的整体设计 ...

  8. 【2018】Python面试题【web框架】

    1.谈谈你对http协议的认识. HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使 ...

  9. Python三大主流框架的对比

    相信做Python这一块的程序员都有听说这三个框架,就像神一样的存在,每一个框架的介绍我就不写出来了,感兴趣可以自己百度了解了解!下面我就说正事 Django:Python 界最全能的 web 开发框 ...

随机推荐

  1. 20155304田宜楠 2006-2007-2 《Java程序设计》第二周学习总结

    20155304田宜楠 2006-2007-2 <Java程序设计>第二周学习总结 教材学习内容总结 一.类型与变量 1.类型 整数: 可细分为为short整数(占2字节),int整数(占 ...

  2. oracle expdp和impdp常用命令选项

    一.expdp导出数据库 1.按用户导出 expdp scott/tiger@orcl DIRECTORY=oracle_dmp dumpfile=bak.dmp schemas=scott vers ...

  3. Maximum Depth of Binary Tree leetcode

    Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...

  4. TuSDK 简易使用方法 持有图片对象方式

    TuSDK 为涂图照相应用的SDK,打包后文件大小约为5M,缺点为包比较大,且图片清晰度较差一些,优点为直接可以引用滤镜贴纸,方便易用.   使用方法如下:    1.AppDelegate.m 中加 ...

  5. linux版powershell安装教程(.net core版)

    powershell 传教士 原创文章 始于2016-12-20,2017-03-15改.文章版本目前博客园为最新版. 允许转载,但必须保留名字和出处,否则追究法律责任 问:powershell二进制 ...

  6. dreamweaver中的 map怎么调用?_制作热点图像区域

    我们浏览网页时,经常看到一些图片上会出现特别的超链接,即在一张图片上有多个局部区域和不同的网页链接,比如地图链接. 这就是映射图像(Image Map),它是指一幅根据链接对象不同而被人为划分为若干指 ...

  7. Cesium原理篇:3D Tiles(3)个人总结

    个人结论:目前,在演示层面,3D Tiles问题不大,但项目应用上就不够成熟了,所以问问自己,你是想吃瓜呢还是想吃螃蟹? 好的方面 数据规范 我非常喜欢glTF的整体设计,概括有四点:第一,数据块(B ...

  8. bing翻译API调用方法

    概述 前一段时间,遇到一个需求,需要对文章进行翻译,由于客户公司员工有国内的人员,也有国外的人员,为了照顾国外的同事,客户提出,当用户在手机端发布帖子,需要同时把帖子的内容翻译成英文,方便用户阅读.于 ...

  9. HTML阶段总结

    自学有两个多星期了,这段时间主要在学习HTML基础知识,万事开头难,刚开始根本没法上手,云里雾里的,没有清晰的思路和详细的学习计划.问了一些盆友,找了一些资料,找到了适合自己的学习方法,渐渐的进入了轨 ...

  10. CSS左侧固定宽 右侧自适应(兼容所有浏览器)

    左侧固定宽,右侧自适应屏幕宽: 左右两列,等高布局: 左右两列要求有最小高度,例如:200px;(当内容超出200时,会自动以等高的方式增高) 要求不用JS或CSS行为实现: 仔细分析试题要求,要达到 ...