1.HTTP是什么
2.HTTP特点 详情见上篇
3请求协议详情
请求首行---请求方式,请求地址,请求协议版本
请求头---key:value形式
---referer:上一次访问的地址
---user-agent:客户端类型
-cookie: 只要是当前域[www.://www.baidu.com/]中有cookie 当再次请求会携带 (cookie是响应给的,浏览器会拿着cookie存到浏览器 ,当再次访问,都会携带给的cookie 过去 就会区分谁是谁)
-请求体一般都没有请求体
4 相应协议详情
响应首行: 响应协议版本,响应状态码,响应描述
响应头: key-value形式 cookie带在响应头中---浏览器会把它存到 浏览器中
响应体: 浏览器页面中 看到的东西 -----html标签
5.响应状态码
5.URL简介 统一资源定位符
统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它
格式:协议://IP:端口(80)/路径?name=lqz&age=18
http协议,如果不写端口号--》默认是80
?之前的是请求路径,?之后的是请求数据部分
POST既能带在 地址栏中数据,又能带在请求体中数据
get请求一般都带在地址栏中
补充:
请求一个网址
https://www.example.com/path/to/resource?param1=value1¶m2=value2
协议是HTTPS,主机民是 www.example.com 路径是/path/to/resourc 查询参数是 ?param1=value1¶m2=value2
携带数据到后端有哪几种方式?
1.带在地址栏中 域名+路径+参数
https://www.example.com/path/to/resource?param1=value1¶m2=value2
Django 从 request.GET request.get_full_path
hettp请求最终变成了 request对象 不同的名字是 django框架包装而成 比如flask框架会用refer
虽然都是request 但是 不同框架 封装自己不同类, 类里的方法不一样
3.带在请求头中
Django中哪里取 在requet.META ---取出请求头
服务响应给客户端数据
--响应头
-用的最多: 响应体
至于 Ajax
$.ajax({
path:/login/?name=lqz,
data:{}
})写成这样最终它会变成一个 http请求,写的path实际是请求路径,写的data就是请求体
————————————————————————————————————————————————————————————————————————————————————————————————————————————————
HTTP协议补充
基于TCP可靠传输 ——客户端-----》服务端
基于TCP的连接 ------》三次握手
客户端给服务端发送消息 ----》借助于TCP通道
服务端给客户端回消息 -----》借助于TCP通道
断开TCP的连接 -----》四次挥手 ———————而这是 0.9的版本 效率很低
客户端同时发送两个http请求 —————http主流1.1版本 keep-alive --时间--- 过了时间TCP就会断开
客户端----》服务端
建立tcp的链接---》三次握手
---第一次请求----
客户端给服务端发送消息---》借助于tcp通道
服务端给客户端回消息----》借助于tcp通道
---第二次请求----
客户端给服务端发送消息---》借助于tcp通道
服务端给客户端回消息----》借助于tcp通道
断开tcp的链接----》四次挥手
客户端同时发送5个http请求——————————http 2.x版本---->多路复用
客户端----》服务端
建立tcp的链接---》三次握手
tcp是流式协议---》一次带了一些数据 【请求1的数据,请求2的数据,请求3的数据,请求4的数据,请求5的数据 】
tcp的响应---》一次性带回来了
断开tcp的链接----》四次挥手
http 3.x版本---》使用udp+协议 保证了可靠
web框架
实质就是别人帮我们卸了一些基础代码,我们只需在固定的位置写固定的代码,就能实现一个web应用
python协议 wsgi协议
客户端浏览器 和python web框架之间 通信需要遵循这个协议
发出的是HTTP请求 ,符合wsgi协议的web服务器 django, flask request response
基于这个协议的 web服务器
-wsgiref:django框架默认就用它 (性能低,并发量低) 测试用
-uwsgi: C语言写的
-gunicorn: python写的
协议的规定: web服务器后面的 python框架一定是一个可调用的对象,必须接受两个参数(environ,start_response) environ是个字典 里面是http请求的东西
使用wsgiref写个web服务
from wsgiref.simple_server import make_server
def mya(environ, start_response):
print(environ)
start_response('200 OK', [('Content-Type', 'text/html')])
if environ.get('PATH_INFO') == '/index':
with open('index.html','rb') as f:
data=f.read()
elif environ.get('PATH_INFO') == '/login':
with open('login.html', 'rb') as f:
data = f.read()
else:
data=b'<h1>Hello, web!</h1>'
return [data]
可调用对象---》能加括号执行的对象
if __name__ == '__main__':
myserver = make_server('', 8011, mya) # 请求来了---》经过wsgiref---》调用后面的可调用对象--》传入两个参数(environ, start_response)
print('监听8011')
myserver.serve_forever()
Django
MVC与MTV模型 ----所有web框架其实都是遵循mvc架构
MVC 本来在一起的代码,拆到不同的位置
模型(M:数据层),控制器(C:逻辑判断)和视图(V:用户看到的)三层
他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求
MTV
M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
M就是原来的M
T 代表模板 (Template):负责如何把页面展示给用户(html)。
T就是原来的V
V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template
V+路由 是原来的C
路由控制
路由是什么?
URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行
请求路径和要执行的视图函数的对应关系
如何使用?
-path:准确路径,精准匹配---》以后基本都是path
-re_path---》就是原来的url---》正则匹配---》非常少
-放在列表中:urlpatterns = []--->列表中得数据,必须是 path或re_path执行完的结果
path详细使用
path('admin/', login)---》
等价于:_path(route, view, kwargs=None, name=None)
第一个参数:
准确路径,字符串
转换器: '<int:pk>' '<str:name>'
-127.0.0.1:8080/login/justin---->path('login/<str:name>', admin.site.urls),
-视图函数中 def login(request,name)
第二个参数: 视图函数的内存地址 不要加括号
-路由一旦匹配成功,就会执行 你写的这个视图函数(request),并且会把request对象传入
-如果有分组的参数[有名,无名],或者转换器的参数,都会被传递到视图函数中作为参数
-总结:放要放视图函数地址---》但是视图函数的参数:第一个是固定必须是request,后续的取决于写没写转换器,写没写有名无名分组
第三个参数:kwargs 是给视图函数传递默认参数
第四个参数:路径的别名---》后期使用反向解析得到该路径
re_path的详细使用
跟path除了第一个参数不一样,其他完全一样
第一个参数是:正则表达式 (不安全性很大)之所以支持正则的目的是为了分组出参数
path通过转换器能完成这个操作 - --几乎不用
反向解析--用在视图函数中,(模板中)
没有转换器的情况
path('login/', login,name='login')
res=reverse('login') #当时 定义路径传入的name参数对应的字符串
有转换器的情况:
path('login/<str:name>', login,name='login')
res=reverse('login',kwargs={name:lqz}) #当时 定义路径传入的name参数对应的字符串
生成这种路径:'login/lqz'
路由分发
为什么默认路由匹配就匹配到了 urls.py?
-setting.py 配置的
-ROOT_U?RLCONF='Django_demo02.urls '
一个app自己有自己的路由
-在app下创建urls.py
视图层
views.py ---目前写的是视图函数
视图函数必须写成这样
def 视图函数(request):
return 四件套
request对象
它是http请求(数据包---)字符串形式 ---拆分成了 django中的request都西昂
常用的:
requets.path || requets.method || requets.GET
requets.POST || requets.vody || requets.get_full_path()
requets.files ——————前端携带文件过来----转成了字典,根据文件的名字取到文件对象
不常用:
requets.cookie || requets.session || requets.content_type 提交的编码格式:urlencoded(form表单),json,form-data,text/pain(服务器默认的格式,一般不用)
requets.META:请求头中的数据
user-agent:HTTP_USER_AGENT
referer:
客户端ip地址: REMOTE_ADDR
用户自定义的
定义:name=lqz
取:request.META.egt('HTTP_NAME') 前面加HTTP_自定义转大写
——————————————————————————————————————————————————————————————————————————————————————
MySQl分组:
1. group by
① group by的含义:将查询结果按照1个或多个字段进⾏分组,字段值相同的为⼀组
② group by可⽤于单个字段分组,也可⽤于多个字段分组
group by + group_concat()
① group_concat(字段名)可以作为⼀个输出字段来使⽤,
② 表⽰分组之后,根据分组结果,使⽤group_concat()来放置每⼀组的某字段的值的集 合
group by + 集合函数
可以统计出每个分组的某字段的值的集合,那么我们也可以通过集合函数来对这个 值的集合 做⼀些操作
4. group by + having
① having 条件表达式:⽤来分组查询后指定⼀些条件来输出查询结果
② having作⽤和where⼀样,但having只能⽤于group by _____https://blog.csdn.net/weixin_64652936/article/details/123443391
get请求能携带请求体吗?
-地址栏中:get,post都能带
-请求体:post ,get能不能呢?
GET请求不能通过请求体携带数据,但可以通过请求头携带
环境变量干啥用的?
(1)设置参数
path环境变量的作用就是告诉系统,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到哪些目录下去寻找。而我们通常情况下配置的path变量,就是这个目录的完整路径。
简而言之,就是运行某个命令需要某些参数时,如果当前目录下找不到,则自动去环境变量中寻找。
(2)软件共用
很多朋友会在自己的计算机上安装双系统,例如C盘安装Windows XP,D盘安装Windows 7。可是某些软件往往只在Windows XP系统中安装,Windows 7系统中是无法正常使用的,比较麻烦却有效的方法是再安装一遍。当我们了解了环境变量中的用途后就可以很好解决双系统的软件共用问题。
(3)系统运行
为什么在Windows XP中安装了的软件在Windows 7下无法运行呢(绿色软件除外)?原因是安装软件时往往须要向系统目录中复制某些文件,而使用另外一个系统时会由于缺少这些文件而无法运行。因此,我们可以通过设置环境变量的方法来解决这个问题。
5 .0.0.0.0和localhost和127.0.0.1 有什么区别
标签:请求,补充,request,视图,---,path,login From: https://www.cnblogs.com/wzh366/p/17862426.html