Django回顾

目录

1.c/s架构

2.b/s架构

3.基于socket写一个web应用

main.py

index.html

4.手写web框架

main.py

login.html

time.html

user_list.html

user_list_new

二.HTTP协议

1.什么是HTTP协议

2.HTTP协议的作用

3.HTTP版本及区别

4.HTTP协议的特点

5.HTTP请求协议

常用的请求头:

6.HTTP响应协议

常见的HTTP状态码:


1.c/s架构

c/s:客户端  --->  服务端(MySQL是客户端和服务端在同一台机器上)

优点:

  1. 客户端和服务端直接相连
  2. 客户端可以处理一些逻辑事务
  3. 客户端操作界面       

缺点:

  1. 客户端:
            只能处理一些功能单一的多系统
            适用于局域网,对网速要求高
            安装部署困难,不易扩展
  2. 服务器:
            用户数增多会出现通信拥堵
            对服务器的要求很高
  3. 用户:
            没安装客户端的外部用户不能访问
            用户数受限,不易扩张

2.b/s架构

b/s:浏览器--->服务端


优点:

  1. 能面向广大的用户实现信息传播共享
  2. 浏览器负担小
  3. 页面的更新能实时同步
  4. 软件重用性强,节省大量成本

缺点:

  1. 客户端:
            页面需要不停的动态刷新,网速慢的情况很费时间
            面对大量不可知用户
  2. 服务器:
            用户增多,服务器响应慢
            不能处理复杂功能

*****b/s架构本质上就是c/s架构*****

3.基于socket写一个web应用

main.py

import socketdef server_run():soc = socket.socket()soc.bind(('127.0.0.1', 8008))soc.listen(5)while True:conn, addr = soc.accept()recv_data = conn.recv(1024)print(recv_data)# 1 直接在send里写,发送给客户端# conn.send(b'HTTP/1.1 200 OK\r\n\r\n<h1>hello web</h1><img src="https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=5e3814acf9edab64607f4592965fc4a6/14ce36d3d539b600c0c465d0eb50352ac65cb74b.jpg"></img>')#2 打开一个html文件,发送给客户端# with open('index.html','r',encoding='utf-8') as f:#     data=f.read()# conn.send(('HTTP/1.1 200 OK\r\n\r\n%s'%data).encode('utf-8'))# 3 动态网页,字符串替换import timenow=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())print(now)with open('index.html','r',encoding='utf-8') as f:data=f.read()data=data.replace('@@@',now)conn.send(('HTTP/1.1 200 OK\r\n\r\n%s'%data).encode('utf-8'))conn.close()if __name__ == '__main__':server_run()

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h2>@@@</h2><img src="https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=5e3814acf9edab64607f4592965fc4a6/14ce36d3d539b600c0c465d0eb50352ac65cb74b.jpg" alt="">
</body>
</html>

4.手写web框架

main.py

import socketimport pymysql
def index(request):return '<img src="https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=5e3814acf9edab64607f4592965fc4a6/14ce36d3d539b600c0c465d0eb50352ac65cb74b.jpg"></img>'def login(request):with open('login.html','r',encoding='utf-8') as f :data=f.read()return data
def time(request):import datetimenow=datetime.datetime.now().strftime('%Y-%m-%d %X')with open('time.html','r',encoding='utf-8') as f :data=f.read()data=data.replace('@@time@@',now)return data
def user_list(request):# 创建连接conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='lqz')cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)cursor.execute("select id,name,password from user")user_list = cursor.fetchall()cursor.close()conn.close()tr_list=[]for row in user_list:tr='<tr><td>%s</td><td>%s</td><td>%s</td></tr>'%(row['id'],row['name'],row['password'])tr_list.append(tr)with open('user_list.html','r',encoding='utf-8') as f:data=f.read()data=data.replace('@@body@@',''.join(tr_list))return datadef user_list_new(request):# 创建连接conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='lqz')cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)cursor.execute("select id,name,password from user")user_list = cursor.fetchall()cursor.close()conn.close()with open('user_list_new.html','r',encoding='utf-8') as f:data=f.read()from jinja2 import Templatetemplate=Template(data)response=template.render(user_list=user_list)# response=template.render({'user_list':user_list})return responseurls = [('/index', index),('/login', login),('/time', time),('/user_list', user_list),('/user_list_new', user_list_new),
]def run():soc = socket.socket()soc.bind(('127.0.0.1', 8006))soc.listen(5)while True:conn, port = soc.accept()data = conn.recv(1024)# data=data.decode('utf-8')print(data)data = str(data, encoding='utf-8')request_list = data.split('\r\n\r\n')head_list = request_list[0].split('\r\n')method, url, htt = head_list[0].split(' ')# conn.send(b'hello web')conn.send(b'HTTP/1.1 200 OK \r\n\r\n')print(url)func_name = Nonefor u in urls:if url == u[0]:func_name = u[1]breakif func_name:response = func_name(data)else:response = '404 not found'conn.send(response.encode('utf-8'))conn.close()if __name__ == '__main__':run()

login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form action=""><p>用户名:<input type="text"></p><p>密码:<input type="password"></p></form>
</body>
</html>

time.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>@@time@@
</body>
</html>

user_list.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用户列表</title>
</head>
<body><table border="1"><thead><tr><th>id</th><th>用户名</th><th>密码</th></tr></thead><tbody>@@body@@</tbody></table></body>
</html>

user_list_new

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用户列表</title>
</head>
<body>
<table border="1"><thead><tr><th>id</th><th>name</th><th>password</th></tr></thead><tbody>{% for user in user_list%}<tr><td>{{user.id}}</td><td>{{user.name}}</td><td>{{user.password}}</td></tr>{%endfor%}</tbody></table></body>
</html>

二.HTTP协议

1.什么是HTTP协议

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)

2.HTTP协议的作用

服务器与本地浏览器之间传输超文本的传送协议

3.HTTP版本及区别

0.9:功能捡漏,只支持GET方法,只能发送HTML格式字符串。

1.1:默认持久连接、请求管道化、增加缓存处理、增加Host字段、支持断点传输分块传输等。

2.0:二进制分帧、多路复用、头部压缩、服务器推送

3.0:弃用TCP,改用基于UDP协议的QUIC协议代替TCP协议。

4.HTTP协议的特点

  1. 支持客户端/服务端模式
  2. 简单快速:客户端向服务端发送请求时,只需要传送请求方式和路径(GET、POST、HEAD)
  3. 灵活:HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type加以标记
  4. 无连接:限制每次连接只处理一个请求,服务器处理完客户请求并接收到客户的响应后即断开连接
  5. 无状态:协议对于事务处理没有记忆能力,缺少状态意味着如果后续处理需要前面的信息则必须重传,这样可能导致每次连接传送的数据量增大,另一方面,在服务器不需要先前信息时响应就很快

5.HTTP请求协议

一个HTTP请求报文(也称请求消息)由请求行(request line)、请求头(header)、空行和请求数据(也称请求体)4个部分组成

请求行
请求头1
请求头2
……
请求空行
请求体

请求行:由请求字段、URL字段和HTTP协议版本字段三部分组成,用空格分隔

请求行格式:Method空格Request-URL空格HTTP-Version \r\n

        Method:表示请求方法

        Request-URL:表示一个统一资源标识符

        HTTP-Version:表示请求的HTTP协议版本

        \r\n:表示换行

常用的请求头:

  • Content-Type: 数据类型(text/html等)。
  • Content-Length: 请求体Body的长度。
  • User-Agent:产生请求的浏览器类型。
  • Accept:客户端希望接收的响应数据类型。就是希望服务器返回什么类型的数据。
  • Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
  • referer: 当前页面是从哪个页面跳转过来的。
  • location: 搭配3xx状态码使用,告诉客户端接下来要去哪里访问。
  • Cookie: 用于在客户端存储少量信息,通常用于实现会话(session)的功能。

6.HTTP响应协议

HTTP响应也由三个部分组成,分别是:状态行、响应头、空行、响应正文

状态行
响应头1
响应头2
……
响应空行
响应体

状态行:由 协议版本,状态码,[状态码说明] 三部分组成

状态行格式:HTTP-Version空格Status-Code空格Reason-Phrase 

        HTTP-Version表示服务器HTTP协议的版本,例如为HTTP/1.1

        Status-Code表示服务器发回的响应状态代码,例如200

        Reason-Phrase表示状态代码的文本描述

常见的HTTP状态码:

  • 1xx:指示信息--表示服务器收到请求,需要请求者继续执行操作。
  • 2xx:成功--表示操作被成功接收并处理。
  • 3xx:重定向--需要进一步的操作以完成请求。
  • 4xx:客户端错误--请求有语法错误或请求无法完成。
  • 5xx:服务器端错误--服务器在处理请求的过程中发生了错误。

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

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

相关文章

lenovo联想笔记本YogaPro 14s IRP8D 2023款(83BU)原装出厂Windows11预装OEM系统

链接&#xff1a;https://pan.baidu.com/s/1s7PcN-y8RyHSV7uJQzC5OQ?pwddy9y 提取码&#xff1a;dy9y 联想电脑原厂W11系统&#xff0c;自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、联想电脑管家等预装程序 所需要工具&#xff1a;16GB或以上的U盘…

linux task_struct中进程调度相关的变量记录

参考文章&#xff1a; Linux进程调度分析记录&#xff0c;进程优先级&#xff0c;隔离处理器&#xff0c;isolcpus - 知乎

echarts 通用线性图

echarts 通用线性图 getLineData() {const myChart echarts.init(this.$refs.chartDom);const option {tooltip: {trigger: axis,},legend: {show: false,textStyle: {fontSize: 14, //字体大小color: #ffffff, //字体颜色},data: [AAA, BBB],},grid: {show: true,left: 10%,…

【NGINX--7】安全控制--2

1、HTTPS 重定向 将未加密的请求重定向到 HTTPS。 使用 rewrite 指令将所有 HTTP 流量发送到 HTTPS&#xff1a; server {listen 80 default_server;listen [::]:80 default_server; server_name _;return 301 https://$host$request_uri; }此配置用于侦听 IPv4 和 IPv6 以及…

Linux文件操作应用及open和fork

1.文件操作的应用: 1).打开一个文件并往里面写入hello: #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> #include <assert.h> int main() { int fdopen("file.txt",O_WRONLY|O_CREAT,0600); …

NJU操作系统公开课笔记(2)

上期目录&#xff1a; NJU操作系统公开课笔记&#xff08;1&#xff09;https://blog.csdn.net/jsl123x/article/details/134431343?spm1001.2014.3001.5501 目录 一.处理器与寄存器 二.中断 三.中断系统 四.进程 五.线程与多线程技术概述 六.处理器调度算法 一.处理器…

完美的输出打印 SQL 及执行时长[MyBatis-Plus系列]

导读 Hi,大家好,我是悟纤。过着爱谁谁的生活,活出不设限的人生。 在我们日常开发工作当中,避免不了查看当前程序所执行的SQL语句,以及了解它的执行时间,方便分析是否出现了慢SQL问题。 MyBatis-Plus提供了两种SQL分析打印的方式,用于输出每条SQL语句及其执行时间,针…

上游任务和下游任务

起源多任务学习中的定义理解结合定义分析例子示例 1&#xff1a;计算机视觉示例 2&#xff1a;自然语言处理示例 3&#xff1a;语音处理示例 4&#xff1a;强化学习总结 起源 "上游任务"和"下游任务"这两个术语在深度学习领域中通常用来描述一种 多任务学…

FLASK博客系列6——数据库之谜

我们上一篇已经实现了简易博客界面&#xff0c;你还记得我们的博客数据是自己手动写的吗&#xff1f;但实际应用中&#xff0c;我们是不可能这样做的。大部分程序都需要保存数据&#xff0c;所以不可避免要使用数据库。我们这里为了简单方便快捷&#xff0c;使用了超级经典的SQ…

​无人机石油管道巡检方案新亮点:灵活准确又高效

在当前石油工业的安全管理中&#xff0c;无人机技术逐渐成为一种不可或缺的工具。随着我国油气管道里程的持续增长&#xff0c;确保这些关键基础设施的安全运行变得越来越重要。传统的巡检方法已经无法满足现代油气行业的需求&#xff0c;而无人机石油管道巡检技术的应用提供了…

目标检测YOLO实战应用案例100讲-基于改进YOLO深度学习模型的烟支外观质量检测(续)

目录 基于YOLOv5烟支外观缺陷检测研究 4.1本章引言 4.2YOLOv5s模型 4.2.1 输入端 4.2.2 Backbone部分

【LeeCode】*76. 最小覆盖子串

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。 如…

2023.11.27如何使用内网穿透工具实现Java远程连接操作本地Elasticsearch搜索引擎

文章目录 前言1. Windows 安装 Cpolar2. 创建Elasticsearch公网连接地址3. 远程连接Elasticsearch4. 设置固定二级子域名 前言 简单几步,结合Cpolar内网穿透工具实现Java远程连接操作本地Elasticsearch。 什么是elasticsearch&#xff1f;一个开源的分布式搜索引擎&#xff0…

解决:AttributeError: module ‘os’ has no attribute ‘mknod’

解决&#xff1a;AttributeError: module ‘os’ has no attribute ‘mknod’ 文章目录 解决&#xff1a;AttributeError: module os has no attribute mknod背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在使用之前的代码时&#xff0c;报错…

element table滚动条失效

问题描述:给el-table限制高度之后滚动条没了 给看看咋设置的&#xff1a; <el-table:data"tableData"style"width: 100%;"ref"table"max-height"400"sort-change"changeSort">对比了老半天找不出问题&#xff0c;最后…

sizeHint() 是一个用于获取部件(widget)的建议大小的函数,它是在许多 GUI 框架中都存在的常见函数之一

sizeHint() 是一个用于获取部件&#xff08;widget&#xff09;的建议大小的函数&#xff0c;它是在许多 GUI 框架中都存在的常见函数之一。 具体来说&#xff0c;sizeHint() 函数用于返回部件在没有特定约束条件时所建议的最佳尺寸。这个建议的尺寸通常基于部件的内容、布局和…

使用opencv的matchTemplate进行银行卡卡号识别

![字体文件](https://img-blog.csdnimg.cn/3a16c87cf4d34aceb0778c4b20ddadb2.png#pic_center import cv2 import numpy as npdef show_img(img, name"temp"):img cv2.resize(img, (0, 0), fx3, fy3)cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()de…

sed笔记231127

-e基本正则,-E扩展版正则 -E, -r, --regexp-extended 在脚本中使用扩展正则表达式&#xff08;为保证可移植性使用 POSIX -E&#xff09;。-e或 --expression 接基本正则表达式, 可多次使用,多次过滤-f 或 --file 选项接脚本文件, 注意是脚本文件, 而不是输入文件 -e可以不写…

excel单元格内换行按什么快捷键

如果我们使用excel软件的时候&#xff0c;因为一些日常的操作太过繁琐想要简化自己的操作步骤的话&#xff0c;其实是有很多快捷方式在其中的。那么对excel单元格内换行按什么快捷键这个问题&#xff0c;据小编所知我们可以在表格中使用Alt Enter来进行换行。详细内容就来看下…

C语言入门---位操作

目录 1. 两个数不同的二进制位个数 2.原码、反码、补码 3.不创建临时变量实现两个数的交换 4.求一个整数存储在内存中的二进制中1的个数 5. 特例-1 6.将指定的位置置1 7.将指定位置置1 8.a与a 9.||与&& 10.逗号表达式 11.srand与rand 12.sizeof 13.结构体初始…