wab框架

http协议

一、http简介

       1.HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

      2.HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展

    3.HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。

 

 

二、http协议的特点

      1、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。

 

由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

 

      2、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

 

      3.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

 

      4.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。

 

缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

三、http请求协议

1、http请求协议遵循以下格式

请求协议遵循以下格式:

    请求首行;    //请求方式、请求路径、协议和版本   如:GET  /index.html   http/127.0.0.1

   请求头信息;    请求头名称:请求头内容,即key:value格式

  空行  :         用来用请求体分开

  请求体:      GET 没有请求体,POST有请求体

 

在http协议中最为常用的请求体是GET,与POST    

2.get的请求

GET /562f25980001b1b106000338.jpg HTTP/1.1
Host    img.mukewang.com
User-Agent    Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept    image/webp,image/*,*/*;q=0.8
Referer    http://www.imooc.com/
Accept-Encoding    gzip, deflate, sdch
Accept-Language    zh-CN,zh;q=0.8
View Code

HTTP默认的请求方法就是GET
     * 没有请求体
     * 数据量有限制!
     * GET请求数据会暴露在浏览器的地址栏中

GET请求常用的操作:
       1. 在浏览器的地址栏中直接给出URL,那么就一定是GET请求
       2. 点击页面上的超链接也一定是GET请求
       3. 提交表单时,表单默认使用GET请求,但可以设置为POST

请求头

 

1、Host请求的web服务器域名地址2、User-AgentHTTP客户端运行的浏览器类型的详细信息。通过该头部信息,web服务器可以判断出http请求的客户端的浏览器的类型。3、Accept指定客户端能够接收的内容类型,内容类型的先后次序表示客户都接收的先后次序4、Accept-Lanuage指定HTTP客户端浏览器用来展示返回信息优先选择的语言5、Accept-Encoding指定客户端浏览器可以支持的web服务器返回内容压缩编码类型。表示允许服务器在将输出内容发送到客户端以前进行压缩,以节约带宽。
而这里设置的就是客户端浏览器所能够支持的返回压缩格式。6、Accept-CharsetHTTP客户端浏览器可以接受的字符编码集7、Content-Type显示此HTTP请求提交的内容类型。一般只有post提交时才需要设置该属性有关Content-Type属性值有如下两种编码类型:(1)“application/x-www-form-urlencoded”: 表单数据向服务器提交时所采用的编码类型,默认的缺省值就是“application/x-www-form-urlencoded”。然而,在向服务器发送大量的文本、包含非ASCII字符的文本或二进制数据时这种编码方式效率很低。(2)“multipart/form-data”: 在文件上载时,所使用的编码类型应当是“multipart/form-data”,它既可以发送文本数据,也支持二进制数据上载。当提交为表单数据时,可以使用“application/x-www-form-urlencoded”;当提交的是文件时,就需要使用“multipart/form-data”编码类型。

3.post请求

POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alivename=Professional%20Ajax&publisher=Wiley

 

 

http响应协议

三、响应格式

1.HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

复制代码
HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8<html><head></head><body><!--body goes here--></body>
</html>
第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。

第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)

第二部分:消息报头,用来说明客户端要使用的一些附加信息

第二行和第三行为消息报头,
Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8

第三部分:空行,消息报头后面的空行是必须的
第四部分:响应正文,服务器返回给客户端的文本信息。

空行后面的html部分为响应正文。

2.响应状态吗

 

状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求常见状态码:200 OK                        //客户端请求成功
400 Bad Request               //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized              //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
403 Forbidden                 //服务器收到请求,但是拒绝提供服务
404 Not Found                 //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error     //服务器发生不可预期的错误
503 Server Unavailable        //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
复制代码

 

四、get与post请求区别

 

GET请求GET /books/?sex=man&name=Professional HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive注意最后一行是空行
POST请求POST / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alivename=Professional%20Ajax&publisher=Wiley

 

           1、  在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放在HTTP包的body中。

         2、 GET方式提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST则没有此限制。

        3、安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。

      4.、服务器取值方式不一样。GET方式取值,如php可以使用$_GET来取得变量的值,而POST方式通过$_POST来获取变量的值。

web应用与web框架

对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。

 

import socketdef handle_request(client):buf = client.recv(1024)client.send("HTTP/1.1 200 OK\r\n\r\n".encode("utf8"))client.send("<h1 style='color:red'>Hello, yuan</h1>".encode("utf8"))def main():sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.bind(('localhost',8001))sock.listen(5)while True:connection, address = sock.accept()handle_request(connection)connection.close()if __name__ == '__main__':main()

 

wsgiref模块

from wsgiref.simple_server import make_serverdef application(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])return [b'<h1>Hello, web!</h1>']httpd = make_server('', 8080, application)print('Serving HTTP on port 8000...')
# 开始监听HTTP请求:
httpd.serve_forever()

创建一个自己的框架

manage.py

import wsgi
print("server is working...")
wsgi.s.serve_forever()

urls

 

from app01 import views#  路径与逻辑函数的映射关系
URLpattern= (("/login", views.login),("/auth", views.auth),("/reg", views.reg),("/reg_auth", views.reg_auth)
)

 

views

 

def login(environ):with open("template/login.html", "rb") as f:data = f.read()return datadef auth(environ):print("QUERY_STRING", environ.get("QUERY_STRING"))  # user=yuan&pwd=123useron, pwdon = environ.get("QUERY_STRING").split("&")_, user = useron.split("=")_, pwd = pwdon.split("=")import pymysql# 连接数据库# conn = pymysql.connect(host='', port=3306, user='root', passwd='', db='s6')  # db:库名conn = pymysql.connect(host='localhost', user='root', password='123', database='s6')# 创建游标cur = conn.cursor()SQL = "select * from userinfo WHERE NAME ='%s' AND PASSWORD='%s'" % (user, pwd)cur.execute(SQL)if cur.fetchone():with open("template/backend.html", "r") as f:data = f.read()data = data % userreturn data.encode("utf8")else:with open("template/login.html", "rb") as f:data = f.read()return datadef reg(environ):with open("template/reg.html", "rb") as f:data = f.read()return datadef reg_auth(environ):print("QUERY_STRING", environ.get("QUERY_STRING"))useron, pwdon ,repeat_pwdon= environ.get("QUERY_STRING").split("&")_,user= useron.split("=")_,pwd = pwdon.split("=")_,repeat_pwd = repeat_pwdon.split("=")print(user,pwd,repeat_pwd)if repeat_pwd==pwd:import pymysqlconn = pymysql.connect(host='localhost', user='root', password='123', database='s7')cur = conn.cursor()SQL="insert into userinfo1(name,password) values('%s','%s')"%(user,pwd)cur.execute(SQL)conn.commit()with open("template/login.html","rb") as f:data = f.read()return dataelse:with open("template/reg.html","rb") as f:data = f.read()return data

 

models

 

import pymysql
#连接数据库
# conn = pymysql.connect(host='localhost',port= 3306,user = 'root',password='123',db='s6') #db:库名
conn=pymysql.connect(host='localhost',user='root',password='123',database='s7')
#创建游标
cur = conn.cursor()# sql='''
# create table userinfo(
#         id INT PRIMARY KEY ,
#         name VARCHAR(32) ,
#         password VARCHAR(32)
# )
#
# # '''
sql='''
create table userinfo1(id INT PRIMARY KEY auto_increment,name VARCHAR(32) ,password VARCHAR(32)
)'''cur.execute(sql)# cur.executemany("insert into userinfo values(%s,%s,%s)", [(1,"yuan","123"),
#                                                           (2,"alex","456"),
#                                                           (3,"egon","789")])
cur.executemany("insert into userinfo1 values(%s,%s,%s)", [(1,"yuan","123"),(2,"alex","456"),(3,"egon","789")])
conn.commit()
#关闭指针对象
cur.close()
#关闭连接对象
conn.close()

 

wsgi

 

from wsgiref.simple_server import make_serverimport urlsdef application(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])print("environ",environ)print("path",environ.get("PATH_INFO"))  # /login
path=environ.get("PATH_INFO")  # /auth
URLpattern=urls.URLpatternprint("URLpattern",URLpattern)func=Nonefor item in URLpattern:if path==item[0]:func=item[1]breakif func:return [func(environ)]else:return [b"<h1>404</h1>"]s=make_server("127.0.0.1",8083,application)

 

 重点

web框架:wsgiref模块的使用from wsgiref.simple_server import make_serverdef application(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])return [b'<h1>Hello, web!</h1>']httpd = make_server('', 8080, application)print('Serving HTTP on port 8000...')# 开始监听HTTP请求:httpd.serve_forever()
wsgiref模块的使用(重点:背会)

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/mengqingjian/p/7701358.html

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

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

相关文章

c++ 二维矩阵 转vector_Python线性代数学习笔记——矩阵的基本运算和基本性质,实现矩阵的基本运算...

当学习完矩阵的定义以后&#xff0c;我们来学习矩阵的基本运算&#xff0c;与基本性质矩阵的基本运算&#xff1a;矩阵的加法&#xff0c;每一个对应元素相加&#xff0c;对应结果的矩阵例子&#xff1a;矩阵A和矩阵B表示的是同学上学期和下学期的课程的成绩&#xff0c;两个矩…

android 4.4以上能够实现的沉浸式状态栏效果

仅仅有android4.4以及以上的版本号才支持状态栏沉浸效果 先把程序执行在4.4下面的手机上,看下效果: 在4.4以上的效果: 当然图片也是能够作为背景的.效果: 代码: if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {Window window getWindow();window.setFlags(Wind…

为abp vnext生成C#客户端给非abp第三方net程序使用

abp vnext提供了动态C#API客户端和静态C#API客户端来调用abp项目的接口&#xff0c;但是有局限性&#xff1b;要使用动态C#API客户端的项目必须也是ABP vnext的项目。静态C#API客户端也依赖abp的包&#xff0c;如下图为的静态客户端依赖于 Volo.Abp.DependencyInjection、Volo.…

C#项目代码规范

目的 1.方便代码的交流和维护。 2.不影响编码的效率&#xff0c;不与大众习惯冲突。 3.使代码更美观、阅读更方便。 4.使代码的逻辑更清晰、更易于理解。 在C#中通常使用的两种编码方式如下 Camel(驼峰式)&#xff1a; 大小写形式&#xff0d;除了第一个单词&#xff0c;所有单…

.NET MAUI实战 FolderPicker

1.概要最近在迁移 GeneralUpdate.Tool的时候需要用到文件夹选择&#xff0c;在MAUI中可以使用FolderPicker进行选择。注意&#xff0c;和上篇文章的文件选择不一样。因为在.NET MAUI中目前还没有傻瓜式直接可用的FolderPicker供开发者使用所以需要自己动手做一些修改。完整示例…

h5外卖源码php_校园食堂外卖APP走红 更多APP定制开发上一品威客网

近日&#xff0c;西安一高校推出了一款校园食堂外卖APP走红网络。该APP涵盖学校食堂的所有饭菜&#xff0c;并可给该校的师生提供校园食堂饭菜外卖服务。饭菜价格与食堂统一&#xff0c;且仅供该校内的师生使用。 目前开发校园外卖订餐系统可谓是一个较热门的创业项目&#xff…

微信自定义tabbar有小红点_自定义微信小程序tabBar组件上边框的颜色

背景&#xff1a;在微信小程序的实际开发过程中&#xff0c;有时候我们需要修改微信小程序提供的 tabBar 组件顶部边框的颜色&#xff0c;以满足项目需求解决方案&#xff1a;方式一&#xff1a;通过tabBar组件自带的 borderStyle 属性来控制边框的颜色&#xff0c;将边框的颜色…

又一批优质.NET6实战项目,面临永久下线...

多好的实战项目大家抓紧时间实操起来呀移动电商实战这次能上岸&#xff0c;最重要的是这个Vue3VantUI.NET6SqlSugar移动电商实战&#xff0c;全部都是最新最热的技术栈&#xff0c;写上简历后面试基本上都是问的这块儿内容。我先给大家看看项目的UI。项目UI全套实战源码这个电商…

laravel 配置微信公众号时{errcode:-106,errmsg:token check fail}

一、问题描述 做微信授权登录时&#xff0c;遇到的一个坑&#xff0c;提示配置失败&#xff0c;F12&#xff0c;响应为 errcode":-106,"errmsg":"token check fail 二、解决方案&#xff1a; 注&#xff1a;宗旨就是让微信能够访问你填写的网址&#xff…

电商企业怎样用好大数据

电商企业怎样用好大数据 大数据正在促生新的蓝海&#xff0c;催生新的经济增长点&#xff0c;正在成为政府和企业竞争的新焦点。2012年&#xff0c;瑞士达沃斯论坛发布《大数据&#xff0c;大影响》报告&#xff0c;称“数据已经成为一种新的经济资产类别&#xff0c;就像货币或…

同步方法 调用异步防范_Spring一个注解实现方法的异步调用,再也不用单开线程了...

介绍同步调用先来演示一下什么是同步调用测试方法输出如下doTaskOne start 1566121320372doTaskOne end 1566121321373doTaskTwo start 1566121321373doTaskTwo end 1566121322374可以看到方法一执行完毕&#xff0c;方法二才会执行异步调用不返回值1.Spring Boot启动类上加Ena…

【源码探索】.NET中的List,是哪种数据结构

“当你提出疑问并开始思考时&#xff0c;答案就离你不远了”图片&#xff1a;奥森公园的向日葵 拍摄于2022年7月23日 摄影师&#xff1a;刘先生01—问题缘起严格来说应该是List<T>&#xff0c;因为.NET的核心基础类库中&#xff0c;并没有List&#xff0c;作为泛型类型的…

dpdk对虚拟化的支持调研

目录&#xff1a; 虚拟化dpdk的实现研究 virtiovhostSR-IOV热迁移相关研究拓展本文记录近期对dpdk在虚拟化和云计算领域应用的研究成果&#xff0c;内容梳理如下。 虚拟化 虚拟化&#xff0c;抽象来说&#xff0c;就是将物理资源逻辑化。具体来说&#xff0c;虚拟技术的实现是在…

隐藏键盘_三星新专利:带有隐藏键盘的三折叠屏手机

10月31日消息 众所周知&#xff0c;三星现已推出四款折叠屏机型(Fold、Fold 2、Z Flip、W20)&#xff0c;而此前多有传言表示三星下一代折叠屏机型(以 Galaxy Z Fold 3 代称)将在目前折叠屏手机的基础上增加 S Pen&#xff0c;而昨日公布的一份专利也侧面辅证了这一说法。此外&…

Blazor学习之旅(3)实现一个Todo应用

【Blazor】| 总结/Edison Zhou大家好&#xff0c;我是Edison。最近在学习Blazor做全栈开发&#xff0c;因此根据老习惯&#xff0c;我会将我的学习过程记录下来&#xff0c;一来体系化整理&#xff0c;二来作为笔记供将来翻看。本篇&#xff0c;我们通过一个简单的Todo示例应用…

JavaScript 省市级联效果

为什么80%的码农都做不了架构师&#xff1f;>>> JavaScript 省市级联效果 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">2 <html xmlns"http…

20分钟完成Mac上的 LNMP 环境部署,优雅·高效开发(Docker方式)

一、前言 对于很多开发者来说&#xff0c;突然转到在 mac 系统开发&#xff0c;可能会非常难受&#xff0c;主要有以下几个原因 1、mac 上安装软件程序坑多&#xff0c;比如安装 PHP、Nginx&#xff0c;会存在很多使用 linux 或 windows 时没有遇到过的坑 2、对 mac 系统不熟…

可编程交换时代就在这里

在第一批网络处理器推出20年后&#xff0c;我们正在向完全可编程数据平面迈进&#xff0c;网络运营商在虚拟化方面的努力推动了这一趋势的发展。 大多数物理网络系统正在被运行在网络核心和边缘的服务器上的虚拟网络功能&#xff08;VNF&#xff09;取代。这些服务器一般采用通…

调试 不弹出 小米_时隔六年,小米NFC碰碰贴复活,碰一下自动亮灯、联网、投屏...

有朋友问我&#xff0c;NFC除了刷门禁、刷公交、离线支付外&#xff0c;还能干什么&#xff1f;实际上NFC的应用场景远不止于此&#xff0c;今天就带大家开开眼界。今年是小米十周年&#xff0c;各种酷玩新品不断&#xff0c;其中“小米碰碰贴2”就是一款便宜又好玩的产品。小米…

微信小程序把玩(三)tabBar底部导航

为什么80%的码农都做不了架构师&#xff1f;>>> tabBar相对而言用的还是比较多的&#xff0c;但是用起来并没有难&#xff0c;在app.json中配置下tabBar即可&#xff0c;注意tabBar至少需要两个最多五个Item选项 主要属性&#xff1a; 对于tabBar整体属性设置&…