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’)

时间: 2024-10-05 07:22:10

python_原始_web框架的相关文章

python_接口自动化测试框架

本文总结介绍接口测试框架开发,采用unittest测试框架结合excel的ddt数据驱动,集成测试数据功能,以及使用HTMLTestRunner来生成测试报告,目前有开源的poman.Jmeter等接口测试工具,为什么还要开发接口测试框架呢?因接口测试工具也有存在几点不足. 测试数据不可控制.比如接口返回数据不可控,就无法自动断言接口返回的数据,不能断定是接口程序引起,还是测试数据变化引起的错误,所以需要做一些初始化测试数据.接口工具没有具备初始化测试数据功能,无法做到真正的接口测试自动化. 无

web框架以及MVC、MTV

h3 { background-color: palegreen } 本篇内容概要 ----原始web框架 ----自定义web框架 ----mvc和mtv 一.web框架的本质 对于所有的web应用,本质上其实就是一个socket服务端,用户的浏览器就是一个socket客户端 简单的说就是,socket传入数据,之后后面是业务逻辑处理程序 画得不好,理解就好 二.引入WSGI 由于web框架包括两部分 1.socket 2.逻辑处理 有些框架只有逻辑处理,没有socket,如flask.bot

改造 Cydia Substrate 框架用于函数内代码的HOOK

上一次分析了Cydia Substrate so hook 框架的实现,实际使用中,发现这样的框架并不能满足我的一些需求,比如我要知道一个函数内部某处代码的运行时的寄存器值,用原始的框架就无法做到. 想实现的功能是只要指定一个地址,就可以打印该处代码执行时的寄存器环境.HOOK的地址以及线程的TID,同时支持多个地址的添加. 先实现一个通用的消息打印函数  void printAllReg(int Reg_R0,int Reg_R1,int Reg_R2,int Reg_R3,int Stack

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

1.谈谈你对http协议的认识. HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使网络传输减少.它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等. HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型.HTTP是一个无状态的协议.端口号为80 2.谈谈你对websocket协议的认识. WebSo

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

上一篇笔者介绍了关于什么是热更新,为什么需要热更新的技术文章.本篇就专门针对UI框架的热更新功能实现部分展开讨论,讨论的重点是热更新如何与UI框架进行结合? 现在笔者把设计“UI热更新框架”的整体设计与构建过程表述如下,最后附带源码工程的下载链接,供广大学员参考研究.如果大家有什么不明白的地方,欢迎大家在评论区进行讨论.   1:首先基于笔者以前设计的SUIFW 框架,做进一步功能完善.   完善UI框架对于复杂窗体的直接转向功能.为了小伙伴们能够更好的理解本技术,文章末尾特提供了下载链接供大家

物联网战场上各大厂商的布局

综述 物联网这个号称下一个千亿市场的生态系统虽然因为安全.行业标准的问题迟迟难以真正落地,却阻挡不了各大芯片厂商抢占先机的步伐.Machina Research 的数据称,到2020 年,全球预计将会有250 亿部终端联网,其中超过一半都是非手机类终端.无论对于高通这类的芯片厂商,还是海尔.TP-Link.思科等产业链厂商,智能手机已经渐渐成为过去式,物联网才是承载未来的关键. ARM架构.intel X86架构.IBM 新近开放的OpenPower平台都在这场赛跑中角逐争先,半导体业者已相继展

CI加载流程小结

无聊,决定水一把. CI(CodeIgniter)是我最早接触的一个框架,到现在也只是用了其中一点零碎的方法.一直想对其流程做个小结,却总是因各种各样的“理由”挨着.看见别人图表齐上阵,没那耐心,就从代码说起吧,权当做个笔记,纪念一下. 看在线的用户手册,也知道,将CI下载下来(最新版本2.2.1),解压到机子上,比如www目录,可改个根目录名(原名CodeIgniter-2.2-stable太长),初步目录文件如下,当然这在是windows下面.    访问下,如localhost/ci/in

Pro ASP.NET Core MVC 第6版 第一章

第一章 ASP.NET Core MVC 的前世今生 ASP.NET Core MVC 是一个微软公司开发的Web应用程序开发框架,它结合了MVC架构的高效性和简洁性,敏捷开发的思想和技术,和.NET 平台的最好的部分.在本章,我们将学习为什么微软创建ASP.NET Core MVC, 看看他和他的前辈的比较以及和其他类似框架的比较,最后,大概讲一下ASP.NET core MVC里面有什么新东西,还有本书中包括哪些内容. 了解ASP.NET Core MVC的历史 最开始的ASP.NET 诞生

多线程原理分析

转(http://www.cnblogs.com/guguli/p/5198894.html) Java对象实例的锁一共有四种状态:无锁,偏向锁,轻量锁和重量锁.原始脱离框架的并发应用大部分都需要手动完成加锁释放,最直接的就是使用synchronized和volatile关键字对某个对象或者代码块加锁从而限制每次访问的次数,从对象之间的竞争也可以实现到对象之间的协作.但是这样手动实现出来的应用不仅耗费时间而且性能表现往往又有待提升.顺带一提,之前写过一篇文章介绍我基于Qt和Linux实现的一个多