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

news2024/11/26 19:30:34

目录索引

  • ==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/577836.html

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

相关文章

chatgpt赋能python:Python生成:深入了解Python编程中的生成

Python 生成&#xff1a;深入了解Python编程中的生成 简介 Python是一门多用途编程语言&#xff0c;广泛应用于 Web 开发&#xff0c;数据分析&#xff0c;人工智能和科学计算等领域。在Python编程中&#xff0c;生成是一个强大而又常用的概念。本文将介绍Python编程中的生成…

如何在华为OD机试中获得满分?Java实现【输入n个整数,输出其中最小的k个】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

Java 的 String、StringBuffer 和 StringBuilder(一文讲透)

提到 String、StringBuffer 和 StringBuilder&#xff0c;就不得不谈及它们的历史&#xff0c;在了解它们的历史之后&#xff0c;我们对它们的理解将更上一级台阶&#xff01; 发展历史 String 与 StringBuffer 的出现 String 和 StringBuffer 在 Java1.0 中就已经有了&…

chatgpt赋能python:Python自动操作软件:提高工作效率和节省时间的利器

Python自动操作软件&#xff1a;提高工作效率和节省时间的利器 Python是一种高级编程语言&#xff0c;具有易读易用、快速开发、可移植性好、跨平台兼容等优点。它在自动化操作方面具有很大的优势&#xff0c;可以帮助用户实现各种自动化操作&#xff0c;从而为我们的工作提供…

有哪些信息安全/网络安全/渗透测试/众测/CTF/红蓝攻防/漏洞测试等前沿技术/研究/技巧获取渠道?

​前言 护网的定义是以国家组织组织事业单位、国企单位、名企单位等开展攻防两方的网络安全演习。进攻方一个月内采取不限方式对防守方展开进攻&#xff0c;不管任何手段只要攻破防守方的网络并且留下标记即成功&#xff0c;直接冲到防守方的办公大楼&#xff0c;然后物理攻破…

第2章 Class

Point结构体 //C语言写法 typedef struct point{float x;float y; }Point;Point a; a.x 1; a.y 2; //const表示p指向的对象里的值不能由p指针修改 void print(const Point* p){printf("%d %d\n", p -> x, p -> y); } print(&a);//想实现点的移动&#x…

深入解析OSI七层协议:实现网络通信的基石

目录 引言&#xff1a;详细介绍1. 物理层&#xff08;Physical Layer&#xff09;2. 数据链路层&#xff08;Data Link Layer&#xff09;3. 网络层&#xff08;Network Layer&#xff09;4. 传输层&#xff08;Transport Layer&#xff09;5. 会话层&#xff08;Session Layer…

【章节1】git commit规范 + husky + lint-staged实现commit的时候格式化代码

创建项目我们不多说&#xff0c;可以选择默认的&#xff0c;也可以用你们现有的项目。 前言&#xff1a; git commit 的时候总有人填写一堆花里胡哨乱写的内容&#xff0c;甚至看了commit 的描述都不知道他这次提交到底做了个啥&#xff0c;那我们有没有办法规范大家的commit提…

chatgpt赋能python:Python中的绝对值函数:abs()

Python中的绝对值函数&#xff1a;abs() 在Python中&#xff0c;绝对值函数可以用来计算一个数的绝对值。这个函数名为abs()&#xff0c;它的语法为&#xff1a; abs(x)其中x为需要计算绝对值的数字。 abs()的用法 abs()函数可以计算传入参数的绝对值&#xff0c;并返回一个…

JavaScript实现使用js外链的方式输出一个5行6列的长方形的代码

以下为实现使用js外链的方式输出一个5行6列的长方形的程序代码和运行截图 目录 前言 一、使用js外链的方式输出一个5行6列的长方形&#xff08;HTML部分&#xff09; 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 二、使用js外链的方式输出一个5行6列的长方形&…

Solidity基础七

无论风暴将我带到什么岸边&#xff0c;我都将以主人的身份上岸 目录 一、Solidity的单位 1. 货币Ether 2. 时间单位Time 二、地址的形成 三、以太坊的账户 1.内部账户&#xff08;简称CA&#xff09; 2.外部账户&#xff08;简称EOA&#xff09; 3.内部账户和外部账户…

dom中的事件处理

事件参考 | MDN (mozilla.org) 什么是事件 事件监听方式 直接在html中编写JavaScript代码(了解) <button οnclick"console.log(按钮1发生了点击~);">按钮1</button> DOM属性&#xff0c;通过元素的on.....来监听事件 // 2.onclick属性// function h…

如何在华为OD机试中获得满分?Java实现【任务总执行时长】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

Visual Studio2022编译器实用调试技巧

目录 1.什么是bug 2.调试是什么&#xff1f; 3.debug和release的介绍 4.windows环境调试介绍 4.1 调试环境的准备 4.2 学会快捷键 4.3 调试的时候查看程序当前信息 4.4 查看内存信息 5.如果写出好&#xff08;易于调试&#xff09;的代码 7.编程常见的错误 1.什么是b…

android MutableLiveData与AndroidViewModel避坑小提示,Java

android MutableLiveData与AndroidViewModel避坑小提示&#xff0c;Java import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LifecycleOwner; import androidx.l…

Tomcat部署项目后,验证码不显示问题

在使用Tomcat服务器部署项目后&#xff0c;发现验证码不显示&#xff0c;在浏览器按f12查询后出现以下页面 查看源码发现一切正常 查阅相关资料后&#xff0c;得到以下方法&#xff1a; 1.在tomcat配置文件catalina.sh文件中找到-Djava.io.tmpdir"$CATALINA_TMPDIR" …

day38|动态规划-爬楼梯问题

DP问题类型&#xff1a; 动态规划比较重要的是找到前后两个状态之间的联系&#xff0c;在向后遍历的过程中注意遍历的顺序和初始化操作。 动归基础类问题 背包问题 打家劫舍 股票问题 子序列问题 DP问题的一些注意事项&#xff1a; 动态规划类的问题代码都是比较简洁的&…

数据结构之排序专题 —— 快速排序原理以及改进方法(添加随机,三路快排)

内容概述 尽管此类博客已经非常非常多&#xff0c;而且也有很多写得很好&#xff0c;但还是想记录一下&#xff0c;用最容易理解的方式&#xff0c;并且多补充了一些例子。 整理云盘的时候发现大一时候的笔记&#xff0c;用的是 txt 文本文件记录的&#xff0c;格式之丑陋可想…

SAP-MM-采购申请审批那些事!

1、ME55不能审批删除行项目的PR 采购申请审批可以设置行项目审批或抬头审批。如果设置为抬头审批时&#xff0c;ME55集中审批时&#xff0c;就会发现有些采购申请时不能审批的&#xff0c; 那么这些采购申请时真的不需要审批么&#xff1f;不是的&#xff0c;经过核对这些采购申…

solr快速上手:managed-schema标签详解(三)

0. 引言 core核心是solr中的重中之重&#xff0c;类似数据库中的表&#xff0c;在搜索引擎中也叫做索引&#xff0c;在solr中索引的建立&#xff0c;要先创建基础的数据结构&#xff0c;即schema的相关配置&#xff0c;今天继续来学习solr的核心知识&#xff1a; solr快速上手…