了解Web框架
1、web框架
web框架主要简化开发操作,方便我们的web网站开发,不需要一直做重复性的操作。
所有的web框架的本质都是一个socket服务端;用户通过浏览器进行访问数据,浏览器就是socket的客户端。
2、基于 socket 实现web框架
python
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
python
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开发环境中就需要用到这个模块来作为服务器。
python
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.静态网页
静态文件:所有的前端文件都是静态文件
静态网页:前端的文件中不需要从后端获取数据。
python
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
python
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()
html
<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
python
pip install django==3.2