Flask框架小程序后端分离开发学习笔记《1》网络知识

Flask框架小程序后端分离开发学习笔记《1》网络知识

Flask是使用python的后端,由于小程序需要后端开发,遂学习一下后端开发。

一、网址组成介绍

  1. 协议:http,https (https是加密的http)
  2. 主机:g.cn zhihu.com之类的网址
  3. 端口:HTTP协议默认是80,因此一般不用填写
  4. 路径下面的「/question/31838184」是路径
    http://www.zhihu.com/question/31838184
    http://www.zhihu.com:80/

二、通信

电脑通信靠IP地址,IP地址记不住就发明了域名(domain name),然后电脑自动向DNS服务器(domain name server)查询域名对应的IP地址。

比如g.cn这样的网址,可以通过电脑的ping程序查出对应IP地址
ping g.cn
根据域名ping出来的ip不一定是一样的。

三、端口是什么?

一个比喻:
用邮局互相写信的时候,ip相当于地址(也可以看做邮编,地址是域名)
端口是收信人姓名(因为一个地址比如公司、家只有一个地址,但是却可能有很多收信人)
端口就是一个标记收信人的数字。
端口是一个16位的数字,所以范围是 0-65535 (2**16)

顺着ip地址可以找到你的电脑,但是找不到与哪个程序通信。
端口就是某一个程序网络服务的唯一表示,端口是由操作系统分配的,所以当程序关闭端口会被回收,之后重新打开不一定是原先的端口了。

四、HTTP协议

一个传输协议,协议就是双方都遵守的规范。
为什么叫超文本传输协议呢,因为收发的是文本信息。
1,浏览器(客户端)按照规定的格式发送文本数据(请求)到服务器
2,服务器解析请求,按照规定的格式返回数据到浏览器
3,浏览器解析得到的数据,并做相应处理

请求和返回是一样的数据格式,大致可分为4部分:
1,请求行或者响应行
2,Header(请求的 Header中 Host字段是必须的,其他都是可选)
3,lrlnlrln(连续两个换行回车符,用来分隔Header和Body)
4,Body(可选)(数据信息)

请求的格式,注意大小写(这是一个不包含Body的请求):原始数据如下
‘GET / HTTP/1.1\r\nhost:g.cn\r\n\r\n’
打印出来如下两行:
GET / HTTP/1.1
Host: g.cn

其中
1, GET是请求方法(还有POST等,这就是个标志字符串而己)
2,/是请求的路径(这代表根路径)
3,HTTP/1.1中,1.1是版本号,通用了20年
具体字符串是’GET / HTTP/1.1 \r\nhost:g.cn \r\n\r\n ’

返回的数据如下
HTTP/1.1 301 Moved Permanently (1.1为版本、301为状态码)
Alternate-Protocol: 80: quic, p=0,80:quic , p=o
cache-Control: private,max-aqe=2592000
Content-Length: 218 (常见:body页面长度218字节)
Content-Type: text/ html; charset=UTF-8
Date: Tue,07 Jul 2015 02:57:59 GMT
Expires: Tue,07 Jl 2015 02:57:59 GMT
Location: http : / /www. google.cn/
server: gws
X-Frame-options: SAMEORIGIN
X一xSS-Protection: l; mode=block
(header头部)

Body部分太长,先不贴了其中响应行(第一行):

  1. HTTP/1.1是版本
  2. 301 是状态码
  3. Moved Permanently 是状态码的描述
    浏览器会自己解析Header部分,然后将Body显示成网页

五、后端web服务器做什么

主要就是解析请求,发送相应的数据给客户端。
例如下面的代码就是模拟浏览器发送HTTP
请求给服务器并把收到的所有信息打印出来(使用的是最底层的socket,现阶段不必
关心这种低层,web开发是上层开发)

#codinq: utf-8

import socket
# socket 是操作系统用来进行网络通信的底层方案#简而言之,就是发送/接收数据
#创建一个socket对象
#参数socket.AF_INET表示是ipv4协议]#参数socket. sOCK_STREAM表示是tcp协议
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#这两个其实是默认值,所以你可以不写,如下
#s = socket.socket()    socket只能用于http协议的,不能用于https
#s = ssl. wrap_socket ( socket.socket ( ) )   这个用于https


#主机(域名或者ip)和端口
host = 'g.cn'
port = 80
#用connect函数连接上主机,参数是一个tuple
s.connect( (host,port) )

#连接上后,可以通过这个函数得到本机的ip和端口(本地ip路由器分配得到,本地端口操作系统分配的)
ip, port = s.getsockname()
print('本机ip 和port {}\{}'.format(ip, port))

#构造一个HTTP请求
http_request = 'GET / HTTP/1.1\r\nhost:{}\r\n\r\n'.format(host)

#发送HTTP请求给服务器
#send函数只接受bytes 作为参数
# str.encode把str转换为bytes,编码是utf-8
request = http_request.encode('utf-8')
print('请求',request)
s.send(request)


# 接受服务器的响应数据
#参数是长度,这里为1023字节
#所以这里如果服务器返回的数据中超过1023的部分你就得不到了,正经一次性最长大概1500字节,
response = s.recv (1023)
#输出响应的数据,bytes类型
print('响应',response)
#转成str再输出
print('响应的str 格式',response.decode ('utf-8'))

# 这就是平时我们在浏览器输入“g.cn”时候的内部细节


# 运行结果
# 本机ip 和port 10.2.93.112\53538
# 请求 b'GET / HTTP/1.1\r\nhost:g.cn\r\n\r\n'
# 响应 b'HTTP/1.1 301 Moved Permanently\r\nLocation: https://google.cn/\r\nX-Content-Type-Options: nosniff\r\nServer: sffe\r\nContent-Length: 215\r\nX-XSS-Protection: 0\r\nDate: Tue, 16 Jan 2024 02:26:18 GMT\r\nExpires: Tue, 16 Jan 2024 02:56:18 GMT\r\nCache-Control: public, max-age=1800\r\nContent-Type: text/html; charset=UTF-8\r\nAge: 891\r\n\r\n<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">\n<TITLE>301 Moved</TITLE></HEAD><BODY>\n<H1>301 Moved</H1>\nThe document has moved\n<A HREF="https://google.cn/">here</A>.\r\n</BODY></HTML>\r\n'
# 响应的str 格式 HTTP/1.1 301 Moved Permanently
# Location: https://google.cn/
# X-Content-Type-Options: nosniff
# Server: sffe
# Content-Length: 215
# X-XSS-Protection: 0
# Date: Tue, 16 Jan 2024 02:26:18 GMT
# Expires: Tue, 16 Jan 2024 02:56:18 GMT
# Cache-Control: public, max-age=1800
# Content-Type: text/html; charset=UTF-8
# Age: 891
#
# <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
# <TITLE>301 Moved</TITLE></HEAD><BODY>
# <H1>301 Moved</H1>
# The document has moved
# <A HREF="https://google.cn/">here</A>.
# </BODY></HTML>

# 上面一部分是浏览器的控制信息,我们看不到的,下面的是网页页面代码,经过浏览器渲染之后就会展示给我们看

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视频转码:最简单的批量MP4视频转换方法,视频剪辑的技巧

随着数字媒体技术的快速发展&#xff0c;视频格式的转换和编辑已成为日常生活中常见的需求。经常遇到要把不同格式的视频转换成MP4格式的情况&#xff0c;例如在某些播放器或设备上播放&#xff0c;或者传输和分享。接下来看下云炫AI智剪如何简单的批量转换MP4视频方法&#xf…

实战案例 - 医疗行业攻击面发现及管理

HIS 入侵案例 医院委托第三方安全公司进行渗透测试 公网域名发现 HIS 系统&#xff0c;通过域名访问并进行入侵 植入木马后&#xff0c;被 HIDS 发现并处置 通过 HIDS 发现 HIS 系统存在已知安全漏洞 通报院方负责人进行处理 院方负责人 仅关闭对应系统域名解析 HW 演练时…

爬虫IP代理池的搭建与使用指南

目录 前言 一、IP代理池的搭建 1. 安装依赖库 2. 获取代理IP 3. 验证代理IP 4. 搭建代理池 5. 定时更新代理池 二、使用IP代理池 总结 前言 在进行网络爬虫任务时&#xff0c;为了避免被目标网站封禁IP&#xff0c;我们可以使用IP代理池来进行IP的轮换&#xff0c;达…

linux修改文件名

1.使用 mv 命令&#xff1a;mv 命令用于移动或重命名文件。要重命名一个文件&#xff0c;你可以将原始文件名作为第一个参数&#xff0c;新的文件名作为第二个参数传递给 mv 命令。例如&#xff0c;要将 oldfile.txt 重命名为 newfile.txt&#xff0c;可以运行以下命令&#xf…

【江科大STM32合集】day2按键控制LED光敏传感器控制峰鸣器

【STM32合集】day2按键控制LED&光敏传感器控制峰鸣器 电路基础c语言基础main.ckey.c结果 实现一个键开关灯实验结果避坑 电路基础 运算放大器-在江科大51单片机b站视频&#xff08;AD/DA&#xff09;复习 原理&#xff1a;两个极端 同相输入端电压 》反相输入端 电压输出最…

3DMax的位图是什么? 3DMax的位图介绍

在3dmax建模中&#xff0c;使用贴图时的位图的频率是很高的。主要原因便就是位图就是我们平常说的图片&#xff0c;有各种格式的图片&#xff0c;能把这张图片贴到物体的表面&#xff0c;呈现效果进行渲染。 3damx的位图支持多种格式&#xff0c;比如jpg、png等等。 当然常用的…

第8章-第4节-Java中字节流的缓冲流

1、缓冲流&#xff1a;属于高级IO流&#xff0c;并不能直接读写数据&#xff0c;需要依赖于基础流。缓冲流的目的是为了提高文件的读写效率&#xff1f;那么是如何提高文件的读写效率的呢&#xff1f; 在内存中设置一个缓冲区&#xff0c;缓冲区的默认大小是8192字节&#xff…

HarmonyOS4.0 系列——06、渲染之条件渲染、循环渲染以及懒加载渲染

HarmonyOS4.0 系列——06、渲染之条件渲染、循环渲染以及懒加载渲染 if/else&#xff1a;条件渲染 ArkTS 提供了渲染控制的能力。条件渲染可根据应用的不同状态&#xff0c;使用 if、else 和 else if 渲染对应状态下的 UI 内容。 写法和 TS 的一样&#xff0c;简单看一下即可…

java的object类

object类 看下object类的结构&#xff1a; Object是所有类的父类&#xff0c;任何类都默认继承Object。在Java中&#xff0c;如果没有指定父类&#xff0c;则默认为Object。这是因为Object类是Java中最基本的类&#xff0c;也是所有类的祖先 public String toString() : 这…

Windows下Python+PyCharm+miniconda+Cuda/GPU 安装步骤

1. 官网安装Python 3.9 Python Release Python 3.9.0 | Python.org 2. 安装pycharm https://download.jetbrains.com/python/pycharm-professional-2023.3.2.exe 3. 安装miniconda Miniconda — miniconda documentation 4. 安装完miniconda 创建虚拟环境 conda create …

Linux命令之用户账户管理whoami,useradd,passwd,chage,usermod,userdel的使用

1、查看当前用户账户 2、切换用户为root用户 3、新建用户user1&#xff0c;给用户user1设置密码为password123 4、新建用户user2&#xff0c;UID为510&#xff0c;指定其所属的私有组为group1&#xff08;group1组的标识符为500&#xff09;&#xff0c;用户的主目录为/home/us…

6.1810: Operating System Engineering 2023 <Lab7 lock: Parallelism/locking>

一、本节任务 二、要点 2.1 文件系统&#xff08;file system&#xff09; xv6 文件系统软件层次如下&#xff1a; 通过路径树我们可以找到相应的文件&#xff1a; fd&#xff08;文件描述符&#xff09;是进程用来标识其打开的文件的手段&#xff0c;每个进程有自己的文件…

C++学习笔记(三十三):c++ 宏定义

本节对c的宏定义进行描述。c使用预处理器来对宏进行操作&#xff0c;我们可以写一些宏来替换代码中的问题&#xff0c;c的宏是以#开头&#xff0c;预处理器会将所有的宏先进行处理&#xff0c;之后在通过编译器进行编译。宏简单说就是文本替换&#xff0c;可以替换代码中的任何…

高级分布式系统-第15讲 分布式机器学习--概念与学习框架

高级分布式系统汇总&#xff1a;高级分布式系统目录汇总-CSDN博客 分布式机器学习的概念 人工智能蓬勃发展的原因&#xff1a;“大” 大数据&#xff1a;为人工智能技术的发展奠定了坚实的物质基础。 大规模机器学习模型&#xff1a;具备超强的表达能力&#xff0c;可以解决…

CMU15-445-Spring-2023-Project #3 - 前置知识(lec10-14)

Lecture #10_ Sorting & Aggregation Algorithms Query Plan 数据库系统会将 SQL 编译成查询计划。查询计划是一棵运算符树。 Sorting DBMS 需要对数据进行排序&#xff0c;因为根据关系模型&#xff0c;表中的tuple没有特定的顺序。排序使用 ORDER BY、GROUP BY、JOIN…

如何在Windows 10/11的防火墙中禁止和允许某个应用程序,这里提供详细步骤

想阻止应用程序访问互联网吗&#xff1f;以下是如何通过简单的步骤阻止和允许Windows防火墙中的程序。​ 一般来说&#xff0c;大多数用户永远不需要担心应用程序访问互联网。然而&#xff0c;在某些情况下&#xff0c;你需要限制应用程序访问互联网。 例如&#xff0c;有问题…

高级定时器

本节主要介绍以下内容&#xff1a; 定时器简介 高级定时器功能框图讲解 一、定时器简介 定时器功能 &#xff1a;定时、输出比较、输入捕获、断路输入 定时器分类 &#xff1a;基本定时器、通用定时器、高级定时器 定时器资源 &#xff1a;F103有2个高级定时器、4个通…

Vue学习笔记3--全局事件总线

Vue学习笔记3—全局事件总线 1.全局事件总线可以实现任意组件间通信 X需具备的条件&#xff1a; 所有的组件都要能看见X可以调用$on $off $emitVue.prototype.x {a:1, b:2} 可以被所有组件看见VueComponent.protoype.proto Vue.prototype组件实例对象(vc)可以访问到Vue原型上…

Redis实现全局唯一Id

一、全局唯一ID 每个店铺都可以发布优惠券&#xff1a; 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显 受单表数据量的限制 场景分析&#xff1a;如果我们的…

10.9.2 std::function 代替函数指针 Page182~183

std::function是一个模板类&#xff0c;基本可作为函数指针的代替品&#xff0c;具备更多功能&#xff0c;特别是与函数对象及bind配合使用。使用std::function时&#xff0c;需要添加头文件 #include <functional> 1.定义函数指针 18行&#xff0c;定义了一个函数指针类…