web框架就是结构,帮你处理好细节;
http协议: 超文本传输协议 现在广泛运用 http1.1 应用层协议
http协议 规定了数据传输时的数据格式 默认端口80
浏览器: 用户代理程序
源服务器 服务端
?
?
?
GET / HTTP/1.1 //请求方式 空格 url 协议版本 ----请求行
url是路径 ip和端口后面的路径
Host: 127.0.0.1:8001
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Google Chrome";v="87", " Not;A Brand";v="99", "Chromium";v="87"
sec-ch-ua-mobile: ?0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
1.get 输入网址按回车 点击a标签转移 会把提交的数据拼接到url后面
2.post 提交表单数据 url
区别:
1.get请求数据长度有限制(因为会拼接到url后面)
2.post请求没有
-----------
get请求数据在请求行中
post请求数据在数据行
1.请求行 \r\n
2.请求头 告诉服务器一些细节的配置信息 键值对
3.空行
4.请求数据
1xx 服务器接受,正在处理
2xx 服务器接受,并接受
3xx 重定向 跳转页面
4xx 请求错误 404
5xx 服务器错误
协议 空格 状态码 空格 状态码描述 回车 换行 //(\r\n)
响应头部 告诉浏览器一些配置细节 键值对
\r\n
响应正文
传送协议 http https(加密)
// 双杠表示层级URL标记符号
域名或ip地址
端口号: http协议默认80
路径: 以/区分
查询: get请求后面的?拼接
特点:
一;基于请求和响应的模式
二:无状态保存 不保存记录
三:无连接 提高效率 短连接
put(更新) get post delete(删除请求) options(请求域检)
head trace
一 css文件的href属性 会异步访问服务器请求数据
js的src属性 也会异步访问服务器的数据
img的src属性也一样
import socket
import time
server = socket.socket()
ip_Port = (‘127.0.0.1‘,8001)
server.bind(ip_Port)
server.listen()
def html(conn):
with open(‘test.html‘,‘r‘,encoding=‘utf-8‘)as f:
data = f.read()
timeStamp = time.time()
timeArray = time.localtime(timeStamp)
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
data = data.replace(‘$xxoo$‘,otherStyleTime).encode(‘utf-8‘)
conn.send(data)
conn.close()
def css(conn):
with open(‘01.css‘,‘rb‘)as f:
data = f.read()
conn.send(data)
conn.close()
def jpg(conn):
with open(‘1.jpg‘,‘rb‘)as f:
data = f.read()
conn.send(data)
conn.close()
def fav(conn):
with open(‘favicon.ico‘,‘rb‘)as f:
data = f.read()
conn.send(data)
conn.close()
def js(conn):
with open(‘01js.js‘,‘rb‘)as f:
data = f.read()
conn.send(data)
conn.close()
data_lst =[
(‘/‘,html),
(‘/01.css‘,css),
(‘/01js.js‘,js),
(‘/1.jpg‘,jpg),
(‘/favicon.ico‘,fav)
]
from threading import Thread
while 1:
conn,addr = server.accept()
data = conn.recv(1024).decode(‘utf-8‘)
data_msg = data.split(‘\r\n‘)[0].split(‘ ‘)[1]
# print(data.decode(‘utf-8‘))
print(data_msg)
conn.send(b‘HTTP 200 OK\r\n\r\n‘)
for i in data_lst:
if data_msg == i[0]:
t = Thread(target=i[1],args=(conn,))
t.start()
1.服务器逻辑 所有web项目都需要配置
2.应用层逻辑 根据用户需求配置
WSGI 一种协议 规范了应用层数据和服务器数据的消息格式一致
?
from wsgiref.simple_server import make_server
import time
from threading import Thread
def html():
with open(‘test.html‘,‘r‘,encoding=‘utf-8‘)as f:
data = f.read()
timeStamp = time.time()
timeArray = time.localtime(timeStamp)
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
data = data.replace(‘$xxoo$‘,otherStyleTime).encode(‘utf-8‘)
return data
def css():
with open(‘01.css‘,‘rb‘)as f:
data = f.read()
return data
def jpg():
with open(‘1.jpg‘,‘rb‘)as f:
data = f.read()
return data
def fav():
with open(‘favicon.ico‘,‘rb‘)as f:
data = f.read()
return data
def js():
with open(‘01js.js‘,‘rb‘)as f:
data = f.read()
return data
data_lst =[
(‘/‘,html),
(‘/01.css‘,css),
(‘/01js.js‘,js),
(‘/1.jpg‘,jpg),
(‘/favicon.ico‘,fav)
]
def application(environ,start_response):
path = environ[‘PATH_INFO‘]
for i in data_lst:
if path == i[0]:
# 发送响应行 响应头
start_response(‘200 ok‘,[(‘k1‘,‘v1‘),(‘k2‘,‘v2‘)])
ret = i[1]()
break
else:
return [b‘404 not found!!!‘]
return [ret]
?
?
http = make_server(‘127.0.0.1‘,8001,application)
print(‘服务器在运行,端口8001‘)
http.serve_forever()
html --->模板
原理:字符串替换
模板语法:
{% for k,v in userinfo.items() %}
<li>{{k}} -- {{v}}</li>
{% endfor%}
def html():
#从数据库中拿出来一个字典
userinfo_data = show()
with open(‘test.html‘,‘r‘,encoding=‘utf-8‘)as f:
data = f.read()
# 创建jinja2模板对象(把html文件变成模板对象)
tem = Template(data)
# 调用渲染方法
data=tem.render({‘userinfo‘:userinfo_data}).encode(‘utf-8‘)
return data
from showdata import show
from jinja2 import Template
#逻辑函数就这么写
def html():
#从数据库中拿出来一个字典
userinfo_data = show()
with open(‘jinja2起飞版动态web框架.html‘,‘r‘,encoding=‘utf-8‘)as f:
data = f.read()
# 创建jinja2模板对象(把html文件变成模板对象)
tem = Template(data)
# 调用渲染方法
data=tem.render({‘userinfo‘:userinfo_data}).encode(‘utf-8‘)
return data
def css():
with open(‘static/css/01.css‘,‘rb‘)as f:
data = f.read()
return data
def jpg():
with open(‘static/img/1.jpg‘,‘rb‘)as f:
data = f.read()
return data
def fav():
with open(‘static/img/favicon.ico‘,‘rb‘)as f:
data = f.read()
return data
def js():
with open(‘static/js/01js.js‘,‘rb‘)as f:
data = f.read()
return data
print(‘应用层准备成功!‘)
?
from wsgiref.simple_server import make_server
from urls import url_patterns
def application(environ,start_response):
path = environ[‘PATH_INFO‘]
for i in url_patterns:
if path == i[0]:
# 发送响应行 响应头
start_response(‘200 ok‘,[(‘k1‘,‘v1‘),(‘k2‘,‘v2‘)])
ret = i[1]()
break
else:
return [b‘404 not found!!!‘]
#return 后面方括号就是一种消息格式
return [ret]
http = make_server(‘127.0.0.1‘,8001,application)
print(‘服务器在运行,端口8001‘)
http.serve_forever()
import views
url_patterns =[
(‘/‘,views.html),
(‘/01.css‘,views.css),
(‘/01js.js‘,views.js),
(‘/1.jpg‘,views.jpg),
(‘/favicon.ico‘,views.fav)
]
print(‘url加载成功!‘)
import pymysql
def show():
conn = pymysql.connect(
host =‘127.0.0.1‘,
port =3306,
database = ‘day41‘,
charset =‘utf8‘,
user =‘root‘,
password=‘123‘
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
sql =‘select * from userinfo;‘
cursor.execute(sql)
data = cursor.fetchone()
print(data)
conn.commit()
cursor.close()
conn.close()
print(‘数据加载成功!‘)
return data
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<!-- 告诉IE浏览器要以最高规格渲染-->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- viewport 窗口 宽度是设备的宽度 缩放比例是1-->
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
<title>Bootstrap 101 Template</title>
<!-- Bootstrap -->
<!--<link href="bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">-->
<link rel="stylesheet" href="01.css">
<link rel="icon" href="favicon.ico">
</head>
<body>
<h1>{{ userinfo[‘name‘]}}</h1>
<h1>欢迎来到冬婷小课堂</h1>
<ul>
{% for k,v in userinfo.items() %}
<li>{{k}} -- {{v}}</li>
{% endfor%}
<li>魅惑侄女Lisa</li>
<li>魅惑侄女Lisa</li>
?
</ul>
<img src="1.jpg" >
<script src="01js.js"></script>
</body>
</html>
原文:https://www.cnblogs.com/learn-record/p/14615627.html