搭建web框架

一 什么是web框架?

web框架就是结构,帮你处理好细节;
http协议: 超文本传输协议 现在广泛运用 http1.1 应用层协议
http协议 规定了数据传输时的数据格式 默认端口80
浏览器: 用户代理程序
源服务器 服务端
?
?
?

http协议请求消息格式

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协议

传送协议 http https(加密)
// 双杠表示层级URL标记符号
域名或ip地址
端口号: http协议默认80
路径: 以/区分
查询: get请求后面的?拼接
特点:
一;基于请求和响应的模式
二:无状态保存 不保存记录
三:无连接 提高效率 短连接

接口

put(更新) get post delete(删除请求) options(请求域检)
head trace

web框架

一 css文件的href属性 会异步访问服务器请求数据
js的src属性 也会异步访问服务器的数据
img的src属性也一样

web框架升级版

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()

web框架组成

1.服务器逻辑 所有web项目都需要配置
2.应用层逻辑 根据用户需求配置
WSGI 一种协议 规范了应用层数据和服务器数据的消息格式一致
?

WSIG协议的web框架

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()

模板渲染jinja2

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

最终版

views.py --- 逻辑函数

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(‘应用层准备成功!‘)

manage.py

?
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()

urls.py

import views
url_patterns =[
  (‘/‘,views.html),
  (‘/01.css‘,views.css),
  (‘/01js.js‘,views.js),
  (‘/1.jpg‘,views.jpg),
  (‘/favicon.ico‘,views.fav)
]
print(‘url加载成功!‘)

showdata.py

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

html文件

<!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>

 

搭建web框架

上一篇:【win7】安装开发环境


下一篇:jquery基础操作