13.python中web框架概念的引入。

简介:

一、什么是web框架?

框架,就是一个为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演。

对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。

   最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。

如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。

      正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口,让我们专心用Python编写Web业务。

这个接口就是WSGI:Web Server Gateway Interface。


二、关于WSGI接口。

基本使用示范:

例1:

#!/usr/bin/python2.7

# -*- coding:utf-8 -*-

import wsgiref.simple_server

def app(env,start_response):

    print env  #这个变量可以接收服务端和客户端的一些相关信息。

    print start_response

    start_response('200 ok',[('Content-Type','text/html')]) #设置响应头

    return ['<h1>hello!!</h1>']

httpd = wsgiref.simple_server.make_server('127.0.0.1',8888,app)

print "http port on 8888!!!"

httpd.serve_forever()



print environ['PATH_INFO'] #获取域名后的网站路径信息。

    path=environ['PATH_INFO']

    start_response('200 OK', [('Content-Type', 'text/html')])

    f1=open("index1.html","rb")

    data1=f1.read()

    f2=open("index2.html","rb")

    data2=f2.read()

    if path=="/yuan": #根据域名后面的路径来判断,返回哪些不同的页面。

        return [data1]

    elif path=="/alex":

        return [data2]

    else:

        return ["<h1>404</h1>".encode('utf8')]

前面我们定义的app函数并没有任何可以解析http协议的部分,也就是说底层代码不需要我们自己编写,

我们只负责在更高层次上考虑如何响应请求就可以了。


我们自定义的app()函数必须由WSGI服务器来调用。有很多符合WSGI规范的服务器,我们可以挑选一个来用。


app()函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:

  1. 第一个参数为一个包含所有HTTP请求信息的dict对象。

  2. 另外一个参数接收的则是一个函数体,这个函数体用于发送响应头。

在前面定义的app函数中调用start_response('200 OK', [('Content-Type', 'text/html')])

此时会发送一个http响应头部,注意Header只能发送一次,也就是只能调用一次start_response()函数。


start_response()函数接收两个参数,

一个是HTTP响应码,一个是一组list表示的HTTP Header,每个Header用一个包含两个str的tuple表示。

通常情况下,都应该把Content-Type头发送给浏览器。其他很多常用的HTTP Header也应该发送。

然后,函数的返回值'<h1>Hello, web!</h1>'将作为HTTP响应的Body发送给浏览器。

有了WSGI,我们关心的就是如何从environ这个dict对象拿到HTTP请求信息,然后构造HTML,

通过start_response()发送Header,最后返回Body。




例2:

from wsgiref.simple_server import make_server

def f1():

    f1=open("index1.html","rb")

    data1=f1.read()

    return [data1]

def f2():

    f2=open("index2.html","rb")

    data2=f2.read()

    return [data2]

def app(environ, start_response):

    print(environ['PATH_INFO'])

    path=environ['PATH_INFO']

    start_response('200 OK', [('Content-Type', 'text/html')])

    if path=="/p1":

        return f1()

    elif path=="/p2":

        return f2()

    else:

        return ["<h1>404</h1>".encode("utf8")]

httpd = make_server('', 8502, application)

print 'Serving HTTP on port 8084...'

# 开始监听HTTP请求:

httpd.serve_forever()


例3:

from wsgiref.simple_server import make_server

def f1(req):

    print(req)

    print(req["QUERY_STRING"])

    f1=open("index1.html","rb")

    data1=f1.read()

    return [data1]

def f2(req):

    f2=open("index2.html","rb")

    data2=f2.read()

    return [data2]

import time

def f3(req):        #模版以及数据库

    f3=open("index3.html","rb")

    data3=f3.read()

    times=time.strftime("%Y-%m-%d %X", time.localtime())

    data3=str(data3,"utf8").replace("!time!",str(times))

    return [data3.encode("utf8")]

def routers():

    urlpatterns = (

        ('/p1',f1),

        ('/p2',f2),

        ("/cur_time",f3)

    )

    return urlpatterns

def application(environ, start_response):

    print(environ['PATH_INFO'])

    path=environ['PATH_INFO']

    start_response('200 OK', [('Content-Type', 'text/html')])

    urlpatterns = routers()

    func = None

    for item in urlpatterns:

        if item[0] == path:

            func = item[1]

            break

    if func:

        return func(environ)

    else:

        return ["<h1>404</h1>".encode("utf8")]

httpd = make_server('', 8518, application)

print('Serving HTTP on port 8084...')

# 开始监听HTTP请求:

httpd.serve_forever()



三、关于web框架的MVC与MTV模式。

MVC模式:

所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层;他们之间以一种插件似的,松耦合的方式连接在一起。

M则是“模型”,模型则是应用程序的核心(比如:数据库中的表)


V代表“视图”,这里面所说的“视图”,个人理解为业务逻辑,也可以理解为是应用程序中处理数据显示的部分。(通常,“视图”是根据“模型”中的数据创建出来的。)

视图就是由HTML元素组成的界面,在新式的Web应用程序中,HTML依旧在视图中扮演着重要的角色,但一些新的技术已层出不穷,它们包括Adobe Flash和像XHTML,XML/XSL,WML等一些标识语言和Web services.


!!!注意!!MVC中的“视图”和MTV中的“视图”不是同一概念!!!MTV中的视图指的是业务逻辑,负责业务逻辑,并在适当的时候调用Model和Template,MVC中的“视图”则是指html文档!!



C代表“控制器”,“控制器”用来处理和用户的交互。(通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。)

wKiom1k-ixTgIyGdAACCQD6BZq8888.jpg-wh_50


模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。例如它可能用像EJBs和ColdFusion Components这样的构件对象来处理数据库,被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。


MTV模式:

django中所使用的是MTV模式。

MTV模式本质上与MVC模式没有什么差别,也是各组件之间为了保持松耦合关系,只是定义上有些许不同,Django的MTV分别代表。

M:Model(模型):负责业务对象与数据库的对象(ORM)

T: Template(模版):负责如何把页面展示给用户。

V:View(视图):负责业务逻辑,并在适当的时候调用Model和Template

此外,Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template。


wKioL1k-kGjT2SKxAAGPx0wRyh4896.png







      本文转自苏浩智 51CTO博客,原文链接:http://blog.51cto.com/suhaozhi/1934697,如需转载请自行联系原作者


相关文章
|
2月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
318 0
|
2月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
258 0
|
2月前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
411 0
|
2月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
165 0
|
5月前
|
机器学习/深度学习 算法 量子技术
GQNN框架:让Python开发者轻松构建量子神经网络
为降低量子神经网络的研发门槛并提升其实用性,本文介绍一个名为GQNN(Generalized Quantum Neural Network)的Python开发框架。
119 4
GQNN框架:让Python开发者轻松构建量子神经网络
|
5月前
|
JSON 监控 BI
拼多多批量下单工具,拼多多买家批量下单软件,低价下单python框架分享
使用Selenium实现自动化操作流程多线程订单处理提升效率
|
5月前
|
机器人 数据安全/隐私保护 Python
企业微信自动回复软件,企业微信自动回复机器人,python框架分享
企业微信机器人包含完整的消息处理流程,支持文本消息自动回复、事件处理、消息加密解密等功能
|
2月前
|
开发框架 前端开发 Go
【GoGin】(0)基于Go的WEB开发框架,GO Gin是什么?怎么启动?本文给你答案
Gin:Go语言编写的Web框架,以更好的性能实现类似Martini框架的APInet/http、Beego:开源的高性能Go语言Web框架、Iris:最快的Go语言Web框架,完备的MVC支持。
361 1
|
3月前
|
机器学习/深度学习 算法 PyTorch
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
【Pytorch框架搭建神经网络】基于DQN算法、优先级采样的DQN算法、DQN + 人工势场的避障控制研究(Python代码实现)
|
3月前
|
机器学习/深度学习 算法 PyTorch
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
152 0

热门文章

最新文章

推荐镜像

更多