web框架
转载:https://www.cnblogs.com/huang-yc/p/9647815.html
本文为纯属个人学习笔记,如有疏漏错误之处望前辈指正!
1. web 应用
Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件。
应用程序有两种模式C/S、B/S。C/S是客户端/服务器端程序,也就是说这类程序一般独立运行。而B/S就是浏览器端/服务器端应用程序,这类应用程序一般借助谷歌,火狐等浏览器来运行。
WEB应用程序一般是B/S模式。Web应用程序首先是“应用程序”,和用标准的程序语言,如java,python等编写出来的程序没有什么本质上的不同。在网络编程的意义下,浏览器是一个socket客户端,服务器是一个socket服务端。
import socket def handle_request(client): request_data = client.recv(1024) print("request_data: ",request_data) client.send("HTTP/1.1 200 OK\r\n\r\n".encode("utf8")) client.send("<h1 style='color:red'>Hello, web! </h1>".encode("utf8")) def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('localhost',8000)) sock.listen(5) while True: print("the server is waiting for client-connection....") connection, address = sock.accept() handle_request(connection) connection.close() if __name__ == '__main__': main()
2.web 框架
Web框架(Web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法。
web框架已经实现了很多功能,开发人员使用框架提供的方法并且完成自己的业务逻辑,就能快速开发web应用了。浏览器和服务器的是基于HTTP协议进行通信的。也可以说web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使用的方法,大大提高了开发的效率。
3.wsgi 模块
最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。
如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。
正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口协议来实现这样的服务器软件,让我们专心用Python编写Web业务。这个接口就是WSGI:Web Server Gateway Interface。而wsgiref模块就是python基于wsgi协议开发的服务模块。
Python 3.x from wsgiref.simple_server import make_server def RunServer(environ, start_response): #environ客户发来的所有数据 start_response('200 OK', [('Content-Type', 'text/html')]) #start_response 封装要返回给客户的数据,响应头状态 return [b'<h1>Hello,web!</h1>'] #返回给用户的内容 #b: 字符串转字节(Python2.x中无bite. if __name__ == '__main__': httpd = make_server('', 8000, RunServer) print ("Serving HTTP on port 8000...") httpd.serve_forever()
运行该程序,在网页中输入:127.0.0.1:8000,即可打印:
ps:字符串转字节的三种方式:
①b'ffffff";
②bytes('ffffff', encoding = 'utf8');
③'ffffff'.encoding('utf8');
示例1:
from wsgiref.simple_server import make_server def handle_index(): return [b'<h1>Hello,index!</h1>'] def handle_date(): return [b'<h1>Hello,date !</h1>'] def RunServer(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) current_url = environ['PATH_INFO'] if current_url =='/index': return handle_index() elif current_url == '/date': return handle_date() else: return [b'<h1>404!</h1>'] if __name__ == '__main__': httpd = make_server('', 8000, RunServer) print ("Serving HTTP on port 8000...") httpd.serve_forever()
在网页中输入:127.0.0.1:8000/date,即可打印
------有很多URL怎么办?
示例2:
将URL存放于字典中:
from wsgiref.simple_server import make_server def handle_index(): return [b'<h1>Hello,index!</h1>'] def handle_date(): return [b'<h1>Hello,date !</h1>'] URL_DICT = { "/index": handle_index, "/date": handle_date, #可用正则表达式写虚拟的 } def RunServer(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) current_url = environ['PATH_INFO'] func = None if current_url in URL_DICT: func =URL_DICT[current_url] if func: return func() else: return [b'<h1>404!</h1>'] if __name__ == '__main__': httpd = make_server('', 8000, RunServer) print ("Serving HTTP on port 8000...") httpd.serve_forever()
示例3:
可将需要打印的信息存放于HTML中,通过读取HTML文件获取打印信息:
from wsgiref.simple_server import make_server def handle_index(): f = open("index.html", mode='rb') data = f.read() f.close() return [data, ] def handle_date(): return [b'<h1>Hello,date !</h1>'] URL_DICT = { "/index": handle_index, "/date": handle_date, } def RunServer(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) current_url = environ['PATH_INFO'] func = None if current_url in URL_DICT: func =URL_DICT[current_url] if func: return func() else: return [b'<h1>404!</h1>'] if __name__ == '__main__': httpd = make_server('', 8000, RunServer) print ("Serving HTTP on port 8000...") httpd.serve_forever()
index.html文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>INDEX</h1> </body> </html>
通过以上代码,当需要处理大量的重复的操作时,我们可以采取模板,或者将某一类文件放在同一个文件夹中,比如将模板文件放在Model文件夹中,将处理函数放在Controler文件夹中,将数据库文件等放在View文件夹中,这样有了MVC框架。
MVC框架 | Model | View | Controler |
数据库 | 模板文件 | 业务处理 | |
MTV框架 | Model | Template | View |
数据库 | 模板文件 | 业务处理 |
注: Django是标准的MTV框架。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了