WEB框架初识
HTTP介绍
Hyper Text Transfer Protocol,超文本传输书协议,是万维网数据通信的基础,规定了请求和响应标准。
HTTP工作原理
HTTP 请求以及响应的步骤
客户端连接到Web服务器。一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接;
发送HTTP请求。通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成,其中空行的作用是告诉服务端接下来是请求体部分。
服务器接受请求并返回HTTP响应。Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
释放连接TCP连接。若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
客户端浏览器解析HTML内容。客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
在浏览器地址栏输入URL,按下回车后发生的事
浏览器向 DNS 服务器请求解析该URL中的域名所对应的 IP 地址;
解析出 IP 地址后,根据该IP地址和默认端口80,和服务器建立TCP连接;
浏览器发出读取文件(URL中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
释放 TCP连接;
浏览器将该 html 文本内容显示出来。
请求方法
HTTP/1.1协议中共定义了八种方法,也可以说是动作
GET
获取指定的资源的请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中。
POST
向指定资源提交数据,请求服务器进行处理,该操作传输实体内容资源,例如提交表单或者上传文件。
HEAD
获得报文首部。与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
PUT
更新资源,向指定资源位置上传其最新内容。
DELETE
删除文件,请求服务器删除Request-URI所标识的资源。
TRACE
回显服务器收到的请求,主要用于测试或诊断。
OPTIONS
允许客户端查看服务器的性能。这个方法可使服务器传回该资源支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
注意事项
方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。
HTTP服务器至少应该实现GET和HEAD/POST方法,其他方法是可选的。所有的方法的实现都应当匹配各自的语义定义。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。例如PATCH(由 RFC 5789 指定的方法)用于将局部修改应用到资源。
POST和GET的区别?
GET参数通过URL传递,POST放在Request body(请求主体)中。
GET在浏览器回退时是无害的,而POST需再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的(2kb 不同浏览器也会有所不同),而POST没有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET请求只能进行url编码 -- encodeURIComponent(),而POST支持多种编码方式。
POST数据的格式与查询字符串格式相同,如果需要将页面中表单的数据进行序列化,然后再通过 XHR 发送到服务器,可以使用 serialize()函数来创建这个字符串,也就是表单序列化
HTTP状态码
所有HTTP响应的第一行都是状态行,依次表示的是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。
状态码一共分为五级:
1XX ----服务器已接收请求,需进一步处理
2XX----请求被服务器接收、理解并处理
200: ok
206:“Partial Content”响应: 客户端发送了一个带有Range请求头的Get请求,是表明自己只需要url上部分的资源,服务器完成了它。 比如:video audio播放一个很大的视频/音频地址时,一般会返回206
3XX ----重定向,执行后续的操作,继续完成请求
301: 永久重定向,所请求的页面已经转移至新的URL
302: 临时重定向
304:缓存,服务器告诉浏览器可以直接使用缓存,不用请求服务器了
4XX ----请求错误 ,请求含有词法错误或者无法被执行
400: 客户端语法错误
401: 请求授权失败
403: 请求不允许 Forbidden资源禁止被访问
404: 没有发现文件、查询或URl
5XX ----服务器接受请求时发生错误
500:服务器不可预计的错误
501: "Internal Server Error" 服务器端在执行请求时发生了错误,此时服务器并没有正常工作
503: 服务器当前不能处理客户端的请求 临时过载和当机
504: 服务器没连上
505: 服务器不支持或拒绝支请求头中指定的HTTP版本
RFC 2616 中已经推荐了描述状态的短语,例如"200 OK","404 Not Found",但是WEB开发过程中还是能够自定义状态描述或者自定义信息。
URL介绍
Uniform Resource Locators,统一资源定位器
组成:
scheme传送协议,例如http,ftp,https
层级URL标记符号
//
固定不变访问资源需要的凭证信息(可省略)
服务器,(通常为域名,有时为IP地址)
端口号,(以数字方式表示,若为HTTP的默认值“:80”可省略)
路径,(以“/”字符区别路径中的每一个目录名称)
查询,(GET模式的窗体参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题)
片段。以“#”字符为起点,锚点
http://www.jjzz.com:80/news/index.html?id=250&page=1
传输协议:http 服务器:www.jjzz.com
端口:80 路径:/news/index.html 查询:?id=250&page=1
HTTP请求和响应格式
请求格式request
【注意】get的请求包中没有请求数据部分。
响应格式response
web框架的功能
收发消息,包含的模块有wsgi wsgiref (python模块) uwsgi(部署时使用)
根据路径返回不同的内容
返回动态的数据(字符串的替换 模板的渲染)
web的本质就是socket服务端。
web框架分类
django 可以实现2 、3功能
flask 可以实现2 功能
tornado 可以实现1、2 、3功能
手写web框架
socket服务端基础款
import socket
server = socket.socket()
server.bind(("127.0.0.1",8005))
server.listen( )
while 1:
conn,addr = server.accept()
re = conn.recv(1024)
print(re)
conn.send(b'HTTP/1.1 200 OK\r\n\r\nok')
conn.close()
根据请求的路径返回不同的内容
import socket
server = socket.socket()
server.bind(("127.0.0.1",8005))
server.listen( )
while 1:
conn,addr = server.accept()
re = conn.recv(1024)
print(re)
url = re.decode("utf-8").split()[1]
if url == "/index":
se = '这里是index'
elif url == "/home":
se = '这里是home'
else:
se = "这里是默认访问"
conn.send(b'HTTP/1.1 200 OK\r\ncontent-type: text/html; charset=utf-8\r\n\r\n')
conn.send(se.encode('utf-8'))
conn.close()
函数版
import socket
server = socket.socket()
server.bind(("127.0.0.1",8005))
server.listen( )
def index(url):
ret = f'这里是{url}'
return ret.encode("utf-8")
def home(url):
ret = f'这里是{url}'
return ret.encode("utf-8")
ls = [("/index",index),
("/home",home)]
while 1:
conn,addr = server.accept()
re = conn.recv(1024)
print(re)
url = re.decode("utf-8").split()[1]
func = None
for i in ls:
if i[0] == url:
func = i[1]
break
if func:
se = func(url)
else:
se = "这里是默认访问".encode("utf-8")
conn.send(b'HTTP/1.1 200 OK\r\ncontent-type: text/html; charset=utf-8\r\n\r\n')
conn.send(se)
conn.close()
带html文件版
import socket
server = socket.socket()
server.bind(("127.0.0.1", 8005))
server.listen()
def index():
with open("index.html", mode='rb') as f:
ret = f.read()
return ret
def home():
with open("home.html", mode='rb') as f:
ret = f.read()
return ret
ls = [("/index", index),
("/home", home)]
while 1:
conn, addr = server.accept()
re = conn.recv(1024)
print(re)
url = re.decode("utf-8").split()[1]
func = None
for i in ls:
if i[0] == url:
func = i[1]
break
if func:
se = func()
else:
se = "这里是默认访问".encode("utf-8")
conn.send(b'HTTP/1.1 200 OK\r\ncontent-type: text/html; charset=utf-8\r\n\r\n')
conn.send(se)
conn.close()
WEB框架初识的更多相关文章
- python web框架——初识tornado
一 Tornado概述 Tornado是FriendFeed使用的可扩展的非阻塞式web框架及其相关工具的开源版本.这个Web框架看起来有些像web.py或者Google的 webapp,不过为了能有 ...
- Web框架的原理和Django初识
一.Web框架的本质 1.本质 实际上Web应用本质上就是一个socket服务端, 而用户的浏览器就是一个socket客户端. 2.最原始的web框架 socket服务端 import socket ...
- Flask(1)- 主流web框架、初识flask
一.Python 现阶段三大主流Web框架 Django.Tornado.Flask 对比 Django 主要特点是大而全,集成了很多组件(例如Models.Admin.Form等等), 不管你用得到 ...
- web框架--tornado框架之初识
在python中常见的web框架构建模式有以下两种: *MVC框架: * 数据库相关操作的Models 视图文件的Views 业务逻辑的Controllers MTV框架: 数据库相关操作的Model ...
- web框架之初识Django
目录 一.web框架 1.1什么是web框架 1.2自制的简易web框架 1.3三大主流web框架简介 Django Flask Tornado 1.4动态网页与静态网页 二.初识Django框架 2 ...
- 初识DJango——Web框架
一.Web框架 HTTP特点 1.简单快速:客户向服务器请求服务时,只需传送请求方法和路径.请求方法常用的有GET.HEAD.POST.每种方法规定了客户与服务器联系的类型不同. 由于HTTP协议简单 ...
- Web 应用 WEB框架 HTTP协议 初识Django
----------------------------财富存在于人的思想里,你没找到路,不等于没有路,你想知道将来要得到什么,你必须知道现在应该先做什么和先放弃什么! [web 应用] web应用 ...
- Go实战--也许最快的Go语言Web框架kataras/iris初识(basic认证、Markdown、YAML、Json)
ris自称是Go语言中所有Web框架最快的,它的特点如下: 1.聚焦高性能 2.健壮的静态路由支持和通配符子域名支持. 3.视图系统支持超过5以上模板 4.支持定制事件的高可扩展性Websocket ...
- web框架之Django<一、初识>
一.什么是web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对于所有的 ...
随机推荐
- 更改centos的网卡名
Centos6更改网卡名的方法: 1.修改皮配置文件/etc/udev/rules.d/70-persistent-net.rules # This file was automatically ge ...
- 在MariaDB导入sql文件出现乱码解决方案
第一方式: 命令: mysql -u(用户名) -p --default-character-set=utf8(设置编码) data_name(数据库名)<文件路径 示例: 这时,会有一个假死的 ...
- Win7 右键 新建图标消失的解决办法
方法一: 把下面一段代码存在一个记事本上,再选择另存为1.cmd,最后运行! regsvr32 /u /s igfxpph.dll reg delete HKEY_CLASSES_ROOT\Direc ...
- Java-Base64工具类
/* * Base64 encoding and decoding. * Copyright (C) 2001-2004 Stephen Ostermiller * http://ostermille ...
- BZOJ 1758 / Luogu P4292 [WC2010]重建计划 (分数规划(二分/迭代) + 长链剖分/点分治)
题意 自己看. 分析 求这个平均值的最大值就是分数规划,二分一下就变成了求一条长度在[L,R]内路径的权值和最大.有淀粉质的做法但是我没写,感觉常数会很大.这道题可以用长链剖分做. 先对树长链剖分. ...
- 5天noip训练心得
day1 100+95+0=195 T1 二分答案,并查集,很像noip2017 day2 T1 T2 缩环,然后数据结构维护求答案,貌似也是原题 T3 树形dp,比赛上没有做出来, day2 90+ ...
- [旧版] CASthesis 模板编译的问题
写在前面的话:国科大最新版的模板在这里(https://github.com/mohuangrui/ucasthesis),利用它来写博后出站报告的相关介绍在这里: 本篇博文是针对另一个模板进行介绍的 ...
- BZOJ 3143: [Hnoi2013]游走 概率与期望+高斯消元
Description 一个无向连通图,顶点从1编号到N,边从1编号到M.小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获 ...
- VirtualBox:启动虚拟机后计算机死机
造冰箱的大熊猫@cnblogs 2018/2/21 故障描述:Ubuntu 16.04升级Linux内核后,在VirtualBox中启动虚拟机发现Ubuntu死机,只能通过长按电源开关硬关机的方式关闭 ...
- AcWing:173. 矩阵距离(bfs)
给定一个N行M列的01矩阵A,A[i][j] 与 A[k][l] 之间的曼哈顿距离定义为: dist(A[i][j],A[k][l])=|i−k|+|j−l|dist(A[i][j],A[k][l]) ...