【web框架】——Django01——如桃花来

news2024/11/22 23:47:57

目录索引

  • ==web框架介绍:==
    • 常见软件的架构:
      • *CS架构:*
      • *BS架构:*
  • ==网络通信:==
    • socket知识复习:
      • *服务端代码逻辑:*
      • *客户端代码逻辑:*
    • socket代码演示:
      • *服务端代码演示:*
      • *客户端代码演示:*
  • ==手写框架:==
    • 基于socket实现框架:
      • *改良版:*
    • 基于wsgiref实现框架:
    • 静态页面数据响应:

web框架介绍:

  • web框架就是一个骨架和开发的一系列工具的集合。我们只需要通过一些工具稍作修饰即可完成一个作品。方便web开发 , 不需要一直做一些重复性的操作。相当于一个半成品
  • web框架的存在可以减少应用开发的周期 , 提高效率与质量 ; 降低维护成本。
  • 所有的web框架的本质就是一个socket服务端;用户通过浏览器进行数据访问,浏览器就充当了socket客户端。

常见软件的架构:

CS架构:

CS:(Clinet & Server) 服务端和客户端的架构,这个架构是从用户层面进行划分的,通过这个架构开发出来的东西对用户的系统环境依赖比较大。
(微信 , 抖音 , QQ , pycharm……),一般都需要进行下载。

BS架构:

BS:(Browser & Server) 浏览器和服务端架构 , 这个模式下用户只需要通过浏览器发送http协议请求就可以获取到对应的资源.(百度 ,博客园 , 力扣 , CSDN , B站…… ),一般可以通过浏览器在线访问。

BS的本质也是CS架构 , BS中浏览器充当了客户端。

网络通信:

socket知识复习:

服务端代码逻辑:

socket服务端:

  1. 创建socket对象
  2. 绑定IP和端口号(1024-65535)
  3. 设置监听,最大连接数
  4. 创立对等连接套接字
  5. 等待客户端的连接
  6. 数据的接收与发送
  7. 关闭

客户端代码逻辑:

socket客户端:

  1. 创建socket对象
  2. 连接服务端的IP和端口号
  3. 数据的接收与发送
  4. 关闭

socket代码演示:

服务端代码演示:

import socket

server = socket.socket() #默认是TCP协议
server.bind(("127.0.0.1",8098)) #以元组形式传入,绑定端口号和IP
server.listen(5)

while True:
	conn,addr = server.accept() #创立对等连接套接字
	print(conn) #<socket.socket fd=400, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8098), raddr=('127.0.0.1', 53894)>,这是连接对象,接收和发送数据用连接对象
	print(addr) #('127.0.0.1', 53894)
	data = conn.recv(1024)
	print(data.decode('utf-8'))
	conn.send(data)

客户端代码演示:

import socket

client = socket.socket()
client.connect(("127.0.0.1",8098))

while True:
	message = input("请输入你给客户端发送的信息:")
	if not message:continue #如果数据为空,则不发送。这一代码是避免发送空数据过去
	if message == "q":break #手动输入q结束
	client.send(message.encode("utf-8"))
	data = client.recv(1024)
	print(data.decode("utf-8"))

tips: 我可以通过这种方式在不同电脑上进行数据传输么?

在其他电脑上写一个socket写一个客户端 , 访问我的服务端。(前提两台电脑必须是在同一个局域网中。)

手写框架:

基于socket实现框架:

我们把127.0.0.1:8099输入浏览器进行访问

import socket
server = socket.socket() #默认是TCP协议
server.bind(("127.0.0.1",8089))
server.listen(10) #设置监听

while True:
	conn,addr = server.accept()
	data = conn.recv(1024).decode("utf-8")
	print(data)

在这里插入图片描述

响应无效,不等于访问数据失败。

课程一小时处

改良版:

import socket

server = socket.socket()  # 默认是TCP协议
server.bind(('127.0.0.1', 8098))
server.listen(5)

# 把不同的url响应的数据封装成函数
def index(url):
    return bytes(f'我是{url}响应的页面数据' , encoding='gbk')

def ac(url):
    return bytes('我好帅', encoding='gbk')

# 可以把url以及对应功能函数用字典进行对应关系
url_dict = {
    '/index/':index,
    '/ac/':ac
}

while True:
    sock, address = server.accept()
    data = sock.recv(1024).decode('utf-8')
    # 浏览器发送的http协议请求
    print(data)
    url = data.split(' ')[1]
    # 以http协议发送响应数据 , 前提就是先发送一个http协议
    sock.send(b'HTTP1.1 200 OK \r\n\r\n')
    # 定义一个变量作为程序的标志
    msg = 1
    # 循环遍历url对应关系的字典
    for i in url_dict:
        # 判断获取到的数据是否等于请求的url
        if i == url:
            # 代用url对应的功能函数
            func = url_dict[i](url)
            sock.send(func)
            msg = 0
    # 判断是否有对应url响应数据
    if msg :
        sock.send('404 not found'.encode('utf-8'))

基于wsgiref实现框架:

  • 在web开发中程序一般会分为两个部分
  • 服务器程序:负责对socke服务器进行封装,处理请求的
  • 应用程序:负责具体的逻辑处理 , 具体做事的。
  • WSGI:是一个规范化接口,定义了Web服务器如何与python应用程序进行交互。里面把所有的http请求和解析http请求协议进行包装。
  • 在python标准库中 , 提供了WSGI的服务器模块 wsgiref , wsgiref里面封装了socket代码,Django底层也是使用这个模块进行socket的操作
from wsgiref.simple_server import make_server

# 把不同的url响应的数据封装成函数
def index(url):
    return bytes(f'我是{url}响应的页面数据' , encoding='gbk')

def ac(url):
    return bytes('阿宸好帅', encoding='gbk')

# 可以把url以及对应功能函数用字典进行对应关系
url_dict = {
    '/index/':index,
    '/ac/':ac
}

# 响应函数
def run(environ , response):
    '''
    :param environ: 接收的是请求相关的所有数据 , wsgiref模块将http请求封装成字典类型的数据
    :param response:响应数据 , 是一个函数
    :return: 返回客户端的数据 , 以列表的形式返回
    '''
    # 响应数据 , 传入响应状态码 , 响应头
    response('200 OK' , [])
    # 获取请求的url
    url = environ['PATH_INFO']
    # 定义一个变量作为程序的标志
    msg = 1
    # 循环遍历url对应关系的字典
    for i in url_dict:
        # 判断获取到的数据是否等于请求的url
        if i == url:
            # 代用url对应的功能函数
            response_data = url_dict[i](url)
            msg = 0
    # 判断是否有对应url响应数据
    if msg:
        response_data = b'404 not found'
    # 将获取到的数据响应到浏览器中
    return [response_data]

if __name__ == '__main__':
    # 实例化 , 创建服务端对象 , 实时监听请求
    client = make_server('127.0.0.1',10086 , run)
    # 启动服务端
    client.serve_forever()

静态页面数据响应:

from wsgiref.simple_server import make_server

# 把不同的url响应的数据封装成函数
def index(url):
    # 服务器响应前端页面
    with open('index.html' , 'r' , encoding='utf-8') as f:
        data = f.read()
    # 讲读取出来的页面数据进行返回给浏览器
    return bytes(data.encode('utf-8'))

def ac(url):
    return bytes('阿宸好帅', encoding='gbk')

# 可以把url以及对应功能函数用字典进行对应关系
url_dict = {
    '/index/':index,
    '/ac/':ac
}

# 响应函数
def run(environ , response):
    '''
    :param environ: 接收的是请求相关的所有数据 , wsgiref模块将http请求封装成字典类型的数据
    :param response:响应数据 , 是一个函数
    :return: 返回客户端的数据 , 以列表的形式返回
    '''
    # 响应数据 , 传入响应状态码 , 响应头
    response('200 OK' , [])
    # 获取请求的url
    url = environ['PATH_INFO']
    # 定义一个变量作为程序的标志
    msg = 1
    # 循环遍历url对应关系的字典
    for i in url_dict:
        # 判断获取到的数据是否等于请求的url
        if i == url:
            # 代用url对应的功能函数
            response_data = url_dict[i](url)
            msg = 0
    # 判断是否有对应url响应数据
    if msg:
        response_data = b'404 not found'
    # 将获取到的数据响应到浏览器中
    return [response_data]

if __name__ == '__main__':
    # 实例化 , 创建服务端对象 , 实时监听请求
    client = make_server('127.0.0.1',10086 , run)
    # 启动服务端
    client.serve_forever()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/610736.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【学习记录】win10 + ubuntu 22.04双系统安装

一、背景 因为家里的台式&#xff08;Windows 10&#xff09;最近一直频繁蓝屏&#xff0c;再加上Win10之前经常性的资源管理器未响应&#xff0c;对Windows系统逐渐失去了信心&#xff0c;于是想着安装稳定性较好的Linux。以前抵触Linux是因为其人机交互界面没Windows那么直观…

今天来当一下数据库,看一下sql到底在里面如何执行的?

今天来当一下数据库&#xff0c;看一下sql到底在里面如何执行的&#xff1f; 一、引子 不管是开发&#xff0c;还是运维&#xff0c;亦或者是产品。 多多少少会写sql&#xff0c;只不过有的人写得多&#xff0c;有的人写得少罢了。 但是你有想过&#xff0c;在数据库中&…

ASCII 码对照表

1. ASCII码表&#xff08;控制字符&#xff09; 2. ASCII码表&#xff08;打印字符&#xff09; 3. ASCII码表&#xff08;扩展字符&#xff09;

不要藏着掖着了,600万用户已经使用“Excel新版本”,统统拿走

600万用户正在切换 已经2023年&#xff0c;就不用再藏着掖着了&#xff0c;目前已经有600万用户开始使用了。 没错&#xff0c;“Excel新版本”已经开始普及了&#xff0c;正在大面积替代切换&#xff0c;不仅Excel用户能用&#xff0c;Access用户照样可以轻松玩转&#xff0…

VBA中如何调用自定义函数

一、问题提出 在VBA中我要把B列中所有的非空单元格的值都判断一遍&#xff0c;如果大于60就在其旁边的单元格写入"及格"&#xff0c;反之就写入不及格。如下图所示&#xff1a; 由于B列的非空单元格数量无法确定&#xff0c;所以我们就要定义一个自定义的函数来获取…

【Qt】delegate的自定义实现函数createEditor进不去【2023.05.07】

摘要 妈卖批&#xff0c;因为这个函数进不去&#xff0c;emo了一下午。实际上就是因为函数声明和定义的地方漏了个const关键字。 1.正确✔&#xff1a; QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) cons…

DCASE挑战赛中的声音事件检测与定位(SELD)子任务介绍

DCASE&#xff08;Detection and Classification of Acoustic Scenes and Events&#xff09;系列挑战赛包含多个与声音计算相关的子任务&#xff0c;以DCASE2023为例&#xff0c;其包含如下七个与声音计算相关的任务。 (source&#xff1a;DCASE challenge website) 声音事件…

ChatGPT配合两款神器,1分钟生成流程图

流程图&#xff0c;工作上再正常不过的一种图形&#xff0c;常见制图方法对比&#xff1a; 传统手动制图&#xff1a;耗时耗力&#xff0c;迁移性差AI 辅助制图&#xff1a;使用自然语言提出需求&#xff0c;零基础快速制图 几款常见的我在用的在线绘图工具推荐&#xff1a; Pr…

火山引擎DataLeap的Catalog系统搜索实践(三):Learning to rank与后续工作

Learning to rank Learning to rank主要分为数据收集&#xff0c;离线训练和在线预测三个部分。搜索系统是一个Data-driven system&#xff0c;因此火山引擎DataLeap的Catalog系统设计之初就需要考虑数据收集。收集的数据可以用来评估和提升搜索的效果。数据收集和在线预测前面…

基于国民技术N32G435的FLASH读写测试

一、测试工具&#xff1a; 1.国民技术N32G43XCL-STB开发板----主控为N32G435CB 2.创芯工坊PW200加密离线烧录器 3.PowerWriter上位机&#xff0c;配合PW200查看FLASH数据。 4.keil5 二、测试背景 现在很多的应用中都需要保存离线数据&#xff0c;例如一些传感器的校正数…

基于C#制作一个鼠标连点器

秒杀抢券、压枪换弹都是网上冲浪的基本操作,制作一个鼠标连点器,从此在互联网所向披靡。 一、项目搭建1.1、创建1.2、界面设计 二、功能实现2.1、类型库调用2.2、窗口句柄定义2.3、线程处理2.4、快捷键 一、项目搭建 1.1、创建 打开Visual Studio&#xff0c;右侧选择创建新项…

ARM体系结构和RAM的工程搭建、程序编写

目录 工程搭建 程序编写 带标志位的加法ADC ADCS 跳转指令B\BL 栈的应用->叶子函数的调用过程 栈的应用->非叶子函数的调用过程 异常中断产生指令 协处理器指令 伪操作 安装交叉编译工具 Makefile 宏定义 预编译指令 申请一个字的空间 .word 申请多个字节空间 嵌套编程 方…

如何查询期刊的SCI分区

好消息是CSDN AI写作助手上线了 我不用自己一个字一个字去写SCI分区是啥&#xff08;x&#xff09; 然而—— 麻了还是自己写吧&#xff0c; 在人工智能这条路上&#xff0c;CSDN还是需要努力。 简单来说&#xff0c;我们做科研、发文章&#xff0c;肯定是需要比较的 谁的…

记录一次Mysql死锁事件(由Insert与uniqueKey导致)

| 导语记录一次于2023年01月23日遇到的死锁问题。 1、基础 1.1 数据库隔离级别 1.1.1RC READ COMMITTED&#xff1a;只能读取已经提交的数据&#xff1b;此时&#xff1a;允许幻读和不可重复读&#xff0c;但不允许脏读&#xff0c;所以RC隔离级别要求解决脏读&#xff1b; 1.1…

Mac下通过Docker安装ElasticSearch集群

1、安装ElasticSearch 使用docker直接获取es镜像&#xff0c;执行命令docker pull elasticsearch:7.7.0 执行完成后&#xff0c;执行docker images即可看到上一步拉取的镜像。 2、创建数据挂在目录&#xff0c;以及配置ElasticSearch集群配置文件 创建数据文件挂载目录 mkdir -…

如何快速掌握Facebook运营+独立站运营基础?

在当今数字化时代&#xff0c;Facebook运营和独立站运营成为许多企业和个人创业者的关键战略。通过巧妙地结合这两个渠道&#xff0c;你可以有效地推广品牌、吸引目标受众并实现商业目标。本文将为你介绍如何快速掌握Facebook运营和独立站运营的基础知识&#xff0c;为你的业务…

微服务组件之Eureka

1、什么是Eureka&#xff0c;为什么要有Eureka 在传统的RPC远程调用中&#xff0c;管理每个服务于服务之间依赖关系复杂&#xff0c;管理复杂&#xff0c;所以需要使用服务治理&#xff0c;管理服务于服务之间依赖关系&#xff0c;可以实现服务调用、负载均衡、容错等&#xf…

一文搞懂KMP算法!!!

一文搞懂KMP算法&#xff01;&#xff01;&#xff01; &#x1f341;什么是KMP算法?&#x1f341;什么是 next() 数组 和 前缀表?前缀表有什么作用呢最长公共前后缀如何计算前缀表 &#x1f680; 构造next数组&#x1f680; 使用next数组来做匹配 &#x1f341;什么是KMP算法…

基于SSM+Vue的旅游资源网站设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

我们不打价格战!大众的倔强

2023年即将过半&#xff0c;在价格战席卷市场的同时&#xff0c;汽车制造商必须在市场份额、销量、营收以及利润之间做出权衡。“无论如何&#xff0c;大众都不会参与中国市场的价格战。“本周&#xff0c;大众汽车首席运营官Ralf Brandstaetter表示。 这家曾经在中国市场长期占…