了解Web框架
1、web框架
web框架主要简化开发操作,方便我们的web网站开发,不需要一直做重复性的操作。
所有的web框架的本质都是一个socket服务端;用户通过浏览器进行访问数据,浏览器就是socket的客户端。
2、基于 socket 实现web框架
import socket # 创建 socket 服务端对象 server = socket.socket() # 绑定 ip 以及 端口号(1024 ~ 65535) server.bind(('127.0.0.1' , 8080)) server.listen(5) while True: sock , address = server.accept() data = sock.recv(1024) print(data) ''' 127.0.0.1 发送的响应无效 是因为服务端和客户端之间发送和接收数据的传输协议不同 浏览器访问数据是:通过 http协议获取数据 http协议(http1.0 , http1.1) 数据响应格式 1、响应首行 (http协议版本 , 响应状态码 响应状态) 200 OK 2、响应头 (键值对方式显示) 3、\r\n (空行) 4、响应体 (我们要响应的数据) ''' # 127.0.0.1 发送的响应无效。 sock.send('HTTP1.1 200 OK \r\n\r\n'.encode('utf-8')) sock.send(b'hello') sock.send('阿宸好帅'.encode('gbk')) # 浏览器访问数据是:通过 http协议获取数据 # url , 浏览器资源获取器 # 127.0.0.1:8686/index # 127.0.0.1:8686/num/1
import socket # 创建 socket 服务端对象 server = socket.socket() # 绑定 ip 以及 端口号(1024 ~ 65535) server.bind(('127.0.0.1' , 8080)) server.listen(5) # 视图函数 def index(): return bytes('index页面' , encoding='gbk') def ac(): return bytes('阿宸好帅', encoding='gbk') # url 路由 url_dict = { '/index':index, '/ac':ac } while True: sock , address = server.accept() data = sock.recv(1024).decode('utf-8') url = data.split(' ')[1] ''' 127.0.0.1 发送的响应无效 是因为服务端和客户端之间发送和接收数据的传输协议不同 浏览器访问数据是:通过 http协议获取数据 http协议(http1.0 , http1.1) 数据响应格式 1、响应首行 (http协议版本 , 响应状态码 响应状态) 200 OK 2、响应头 (键值对方式显示) 3、\r\n (空行) 4、响应体 (我们要响应的数据) ''' # 127.0.0.1 发送的响应无效。 sock.send('HTTP1.1 200 OK \r\n\r\n'.encode('utf-8')) if url in url_dict: func = url_dict[url]() sock.send(func) else: sock.send(b'404')
3、基于wsgiref模块
WSGI是一个标准规范,web服务器的网关接口,定义web服务器和python程序进程交互
wsgiref模块中封装了 socket服务器操作 ,处理数据请求和响应的协议
Django开发环境中就需要用到这个模块来作为服务器。
from wsgiref.simple_server import make_server # 视图函数 def index(): return bytes('index页面' , encoding='gbk') def ac(): return bytes('阿宸好帅', encoding='gbk') # url 路由 url_dict = { '/index':index, '/ac':ac } # 响应服务 def run_server(environ , response): ''' :param environ: 接收请求去相关的所有数据 , wsgiref模块将http请求的数据封装成字典进行传输 :param response: 响应的数据 :return: 返回给客户端的数据 , 以列表的形式返回 ''' # 响应状态码 , 响应头 response('200 OK', []) # 获取url进行匹配响应 url = environ['PATH_INFO'] if url in url_dict: response_data = url_dict[url]() else: response_data = b'404' return [response_data] if __name__ == '__main__': # 实例化服务进程 httpd = make_server('127.0.0.1',8989,run_server) # 启动服务 httpd.serve_forever()
4、动静态网页
1.静态网页
静态文件:所有的前端文件都是静态文件
静态网页:前端的文件中不需要从后端获取数据。
from wsgiref.simple_server import make_server # 视图函数 def info(): # 1、读取html文件 with open('info.html' , 'r' , encoding='utf-8') as f: data = f.read() return bytes(data.encode('utf-8')) # url 路由 url_dict = { '/index':info, } # 响应服务 def run_server(environ , response): ''' :param environ: 接收请求去相关的所有数据 , wsgiref模块将http请求的数据封装成字典进行传输 :param response: 响应的数据 :return: 返回给客户端的数据 , 以列表的形式返回 ''' # 响应状态码 , 响应头 response('200 OK', []) # 获取url进行匹配响应 url = environ['PATH_INFO'] if url in url_dict: response_data = url_dict[url]() else: response_data = b'404' return [response_data] if __name__ == '__main__': # 实例化服务进程 httpd = make_server('127.0.0.1',8989,run_server) # 启动服务 httpd.serve_forever()
2.动态网页
动态网页:前端的文件中需要从后端获取数据
将html文件进行模板化,将其转换为字符串模板 , 可以在html文件中写近似后端的语法
pip install jinja2
from wsgiref.simple_server import make_server from jinja2 import Template import time , pymysql # 视图函数 def info(): # 1、读取html文件 with open('info.html' , 'r' , encoding='utf-8') as f: data = f.read() return bytes(data.encode('utf-8')) def get_time(): data_time = time.strftime(f"{'%Y'}年{'%m'}月{'%d'}日 {'%H'}时{'%M'}分{'%S'}秒") with open('index.html' , 'r' , encoding='utf-8') as f: data = f.read() # Template 对html页面进行模板化 , 转换成后端可以操作的方式 temp = Template(data) # render 将后端数据专递到模板化后端 html文件中 {html_time : data_time} res = temp.render(html_time = data_time) return bytes(res.encode('utf-8')) def get_data(): db = pymysql.connect( host='localhost', user='root', password='root', charset='utf8', database='demo' ) # 设置游标 , 将返回获取的数据类型修改为字典类型 cur = db.cursor(cursor=pymysql.cursors.DictCursor) sql = 'select * from t_hero' cur.execute(sql) db_data = cur.fetchall() with open('hero.html' , 'r' , encoding='utf-8') as f: data = f.read() # Template 对html页面进行模板化 , 转换成后端可以操作的方式 temp = Template(data) # render 将后端数据专递到模板化后端 html文件中 {html_time : data_time} res = temp.render(t_hero = db_data) return bytes(res.encode('utf-8')) # url 路由 url_dict = { '/time':get_time, '/info':info, '/hero' : get_data } # 响应服务 def run_server(environ , response): ''' :param environ: 接收请求去相关的所有数据 , wsgiref模块将http请求的数据封装成字典进行传输 :param response: 响应的数据 :return: 返回给客户端的数据 , 以列表的形式返回 ''' # 响应状态码 , 响应头 response('200 OK', []) # 获取url进行匹配响应 url = environ['PATH_INFO'] if url in url_dict: response_data = url_dict[url]() else: response_data = b'404' return [response_data] if __name__ == '__main__': get_data() # 实例化服务进程 httpd = make_server('127.0.0.1',8989,run_server) # 启动服务 httpd.serve_forever()
<body> <table border="1"> <tr> <th>name</th> <th>identity</th> <th>weapon</th> <th>Shunt</th> </tr> {% for data in t_hero %} <tr> <th>{{ data.name }}</th> <th>{{ data.identity }}</th> <th>{{ data.weapon }}</th> <th>{{ data.Shunt }}</th> </tr> {% endfor %} </table> </body>
下载Django框架
python的版本:3.7 , 3.8 , 3.9
pip install django==3.2