2. web框架

web框架

Table of Contents

web框架

 

一、什么是web框架

下面是自己写一个简单的web框架的案例:《原文:http://www.cnblogs.com/yuanchenqi/articles/6083427.html》

二、MVC与MTV


一、什么是web框架

Web 应用框架,或者简单的说是“Web 框架”,是用于进行web开发的一套软件架构。例如 Flask 或这 Django 之类的。使用web框架,很多的业务逻辑外的功能不需要自己再去完善,而是使用框架已有的功能就可以。

web框架使得在进行web应用开发的时候,减少了工作量。web框架主要用于动态网络开发,动态网络主要是指现在的主要的页面,可以实现数据的交互和业务功能的完善。使用web框架进行web开发的时候,在进行数据缓存、数据库访问、数据安全校验等方面,不需要自己再重新实现,而是将业务逻辑相关的代码写入框架就可以。也就是说,通过对web框架进行主观上的“缝缝补补”,就可以实现自己进行web开发的需求了。

目前Python主流的框架有Django和Flask等。Django是一个比较重量级的框架,重量级的意思是说,Django几乎所有的功能都帮助开发者写好了,有时候如果想做一个简单的网站,并不需要太多功能,这时候使用Django的话,就比较不合适,因为在部署网站的时候会导致很多不必要的功能也部署了进来。而Flask是一个轻量级的框架,一些核心的功能实现了,但是实现的功能并没有Django那么多,这样可以进行自己的发挥,在Flask的基础上,如果想实现更多的功能,可以很方便地加入。

Java目前的主流开发框架是ssm(spring spring-mvc和mybatis)。相比之前的ssh(spring struts hibernate),ssm也是比较轻量级的框架。

web框架是用来进行web应用开发的一个软件架构。主要用于动态网络开发。开发者在基于web框架实现自己的业务逻辑。web框架实现了很多功能,为实现业务逻辑提供了一套通用方法。

 

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

那么最简单的 web 应用是什么样的呢?我们可以写一个应用,让它一直监听 80 端口(著名的 HTTP 端口,几乎所有 HTTP 都发送到这个端口上)。一旦它接收到等待的客户端发送的请求连接,然后它就会回复一些简单的 HTML。

下面是程序的代码:

# -*- coding: utf-8 -*-
import socket

HOST = 'localhost'
PORT = 808
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.bind((HOST, PORT))
socket.listen(1)
connection, address =socket.accept()
buf = connection.recv(1024)
connection.sendall("""HTTP/1.1 200 OK
Content-type: text/html;charset=utf-8 \r\n\r\n 
<html>
<body>
    <h1>测试网页</h1>
</body>
</html>""".encode('utf-8')) #和 # -*- coding: latin-1 -*- 保持一致
connection.close()

#\r\n\r\n 是模拟空行,分割请求体

注意:文件名不要命名为socket.py要不然导入的import socket是导入的你自己的文件socket.py

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

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

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

这个接口就是WSGI:Web Server Gateway Interface。(web服务器网关接口)

下面是自己写一个简单的web框架的案例:《原文:http://www.cnblogs.com/yuanchenqi/articles/6083427.html

# -*- coding: utf-8 -*-
from wsgiref.simple_server import make_server

#application()函数必须由WSGI服务器来调用。有很多符合WSGI规范的服务器,我们可以挑选一个来用。如Nginx
#Python内置了一个WSGI服务器,这个模块叫wsgiref, 实际中并不适用
#有了WSGI,我们关心的就是如何从environ这个dict对象拿到HTTP请求信息,然后构造HTML,通过start_response()发送Header,最后返回Body。
def application(environ, start_response):
    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')]


httpd = make_server('', 8080, application)

print('Serving HTTP on port 8080...')
# 开始监听HTTP请求:
httpd.serve_forever()

各个模块抽取,升级:

from wsgiref.simple_server import make_server
import time

def login(req):
    # print(req)
    # print(req["QUERY_STRING"])
    str = req['QUERY_STRING']
    if str:
        list = str.split('&')
        print(list)
        if list[0]=='user=weizu' and list[1]=='pwd=123':
            return home(req)
        else :
            return ["<h1>用户密码错误</h1>".encode("utf8")]
    else :
        f1=open("index1.html","rb")
        data1=f1.read()
        return [data1]

def home(req):

    f2=open("index2.html","rb")
    data2=f2.read()
    return [data2]


def show_time(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 = (
        ('/login',login),
        ('/',home),
        ("/show_time",show_time)
    )
    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('', 8080, application)

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

# 开始监听HTTP请求:
httpd.serve_forever()

围绕建立 web 应用的所有问题中,两个问题尤其突出:

  1. 我们如何将请求的 URL 映射到处理它的代码上?===>即:路由
  2. 我们怎样动态地构造请求的 HTML 返回给客户端,HTML 中带有计算得到的值或者从数据库中取出来的信息?===>即:模板

每个 web 框架都以某种方法来解决这些问题,也有很多不同的解决方案。首先我们还需要简单讨论一下 MVC 。

二、MVC与MTV

MVC,也就是 Model-View-Controller (模型-视图-控制器),是一种将应用的不同功能从逻辑上划分开。models 代表的是类似数据库表的资源(与 Python 中用 class 来对真实世界目标建模使用的方法大体相同)。controls 包括应用的业务逻辑,对 models 进行操作。为了动态生成代表页面的 HTML,需要 views 给出所有要动态生成页面的 HTML 的信息。

他们之间以一种插件似的,松耦合的方式连接在一起。

  • 模型负责业务对象与数据库的对象(ORM)
  • 视图负责与用户的交互(页面)
  • 控制器(C)接受用户的输入调用模型和视图完成用户的请求。

在 Django 中有点让人困惑的是,controllers 被称做 views,而 views 被称为 templates。除了名字上的有点奇怪,Django 很好地实现了 MVC 的体系架构。

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

  •  Model(模型):负责业务对象与数据库的对象(ORM)
  • Template(模版):负责如何把页面展示给用户
  • View(视图):负责业务逻辑,并在适当的时候调用Model和Template

 

 

 


参考文章:https://blog.csdn.net/lywzgzl/article/details/77932946

参考文章:https://www.cnblogs.com/SevenwindMa/p/web.html

参考文章:http://www.cnblogs.com/yuanchenqi/articles/6083427.html


作者:无涯明月

上篇:1. HTTP协议

下篇:3. 初识 Django

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦否

文章对你有用?不妨打赏一毛两毛

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值