热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

搭建web框架

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

一 什么是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() %}
 

  • {{k}} -- {{v}}

  •   {% 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文件




     
     
     
     
     
     
     
     
     
     
     


    {{ userinfo['name']}}
    欢迎来到冬婷小课堂


        {% for k,v in userinfo.items() %}
       
    • {{k}} -- {{v}}

    •   {% endfor%}
       
    • 魅惑侄女Lisa

    •  
    • 魅惑侄女Lisa






     



    推荐阅读
    • Python瓦片图下载、合并、绘图、标记的代码示例
      本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
    • 文章目录简介HTTP请求过程HTTP状态码含义HTTP头部信息Cookie状态管理HTTP请求方式简介HTTP协议(超文本传输协议)是用于从WWW服务 ... [详细]
    • 博主使用代理IP来自于网上免费提供高匿IP的这个网站用到的库frombs4importBeautifulSoupimportrandomimporturllib.re ... [详细]
    • CSS3选择器的使用方法详解,提高Web开发效率和精准度
      本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
    • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
      本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
    • 本文由编程笔记小编整理,主要介绍了使用Junit和黄瓜进行自动化测试中步骤缺失的问题。文章首先介绍了使用cucumber和Junit创建Runner类的代码,然后详细说明了黄瓜功能中的步骤和Steps类的实现。本文对于需要使用Junit和黄瓜进行自动化测试的开发者具有一定的参考价值。摘要长度:187字。 ... [详细]
    • 如何在HTML中获取鼠标的当前位置
      本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
    • Python爬取豆瓣数据实现过程解析
      这篇文章主要介绍了Python爬取豆瓣数据实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值, ... [详细]
    • 最近在学Python,看了不少资料、视频,对爬虫比较感兴趣,爬过了网页文字、图片、视频。文字就不说了直接从网页上去根据标签分离出来就好了。图片和视频则需要在获取到相应的链接之后取做下载。以下是图片和视 ... [详细]
    • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
    • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
      本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
    • SpringMVC接收请求参数的方式总结
      本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
    • 本文介绍了网页播放视频的三种实现方式,分别是使用html5的video标签、使用flash来播放以及使用object标签。其中,推荐使用html5的video标签来简单播放视频,但有些老的浏览器不支持html5。另外,还可以使用flash来播放视频,需要使用object标签。 ... [详细]
    • html结构 ... [详细]
    • 目录爬虫06scrapy框架1.scrapy概述安装2.基本使用3.全栈数据的爬取4.五大核心组件对象5.适当提升scrapy爬取数据的效率6.请求传参爬虫06scrapy框架1. ... [详细]
    author-avatar
    dazhi20
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有