web框架
Table of Contents
下面是自己写一个简单的web框架的案例:《原文:http://www.cnblogs.com/yuanchenqi/articles/6083427.html》
一、什么是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 应用的所有问题中,两个问题尤其突出:
- 我们如何将请求的 URL 映射到处理它的代码上?===>即:路由
- 我们怎样动态地构造请求的 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