Django回顾

发布时间 2023-11-28 16:16:32作者: 橙子先生呀

提问

# 0 把mysql 全都卸载---》5.7版本---》把5.6卸载
https://zhuanlan.zhihu.com/p/571585588
# 1 保证能够链接到你同桌mysql   192.168.1.252
1 关闭防火墙
   2 知道你同桌ip
   3 链接:mysql   navicate链接
   
   
# 2 保证你的django,你同桌可以访问
-http://127.0.0.1:8000/login/
   
   
# 3 搜http 有哪些主要版本,版本区别是什么
0.9
   1.1
   2.0
   3.0
   
# 4 常用请求头有哪些,响应头有什么
-Cookie
   -contentype
# 5 有哪些常用响应状态码

 

 

今日内容

1 http

#1 http 是什么
#2 http特点
#3 请求协议详情
-请求首行---》请求方式,请求地址,请求协议版本
   -请求头---》key:value形式
  -referer:上一次访问的地址
       -user-agenet:客户端类型
       -name:lqz
       -cookie:只要是当前域【https://www.cnblogs.com/】中有的cookie,当次请求就会携带
   -请求体:get请求一般没有请求体
#4响应协议详情
-响应首行:响应协议版本,响应状态码,响应描述
   -响应头:key-value形式    cookie带在响应头中---》浏览器会把它存到浏览器的cookie中
   -响应体:浏览器页面中看到的东西 ---》html标签
   
   
# 4 响应状态码

 


# 5 URL简介 统一资源定位符
统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它

###格式:协议://IP:端口(80)/路径?name=lqz&age=18
http协议,如果不写端口号--》默认是80

?之前的是请求路径,?之后的是请求数据部分




# 补充:
post 既能带在地址栏中数据,又能带在请求体中数据
   get请求一般都带在地址栏中
# 补充:
-请求一个网址:
   https://www.cnblogs.com/liuqingzheng/articles
   域名(https://www.cnblogs.com)+路径(liuqingzheng/articles)
   -携带数据到后端:有哪几种方式?
  1 带在地址栏中 域名+路径+参数
       https://www.cnblogs.com/liuqingzheng/articles?name=xx&age=111
       django从:requets.GET    request.get_full_path
       2 带在请求体中---》http的请求体--》多种编码格式
      -json:后期会使用它多
           -urlencoded:form表单,默认
           -form-data:传文件
           django从:request.POST   request.body
           
      3 带在请求头中
  django中哪里取  request.META--->取出请求头
   -服务端响应给客户端数据
  -响应头中
       -用的最多:响应体
   
   
   $.ajax({
       path:/login/?name=lqz,
       data:{}
  })----->写成这样---》最终它会变成一个http请求,写的path实际是请求路径,写的data就是请求体

 

http协议补充

# http 基于tcp的---》可靠传输

#http协议 0.9版本
客户端----》服务端
建立tcp的链接---》三次握手
客户端给服务端发送消息---》借助于tcp通道
服务端给客户端回消息----》借助于tcp通道
断开tcp的链接----》四次挥手

# http 主流 1.1 ---》keep-alive---》时间---》过了时间---》tcp就会断开
客户端同时发送两个http请求
客户端----》服务端
建立tcp的链接---》三次握手
---第一次请求----
客户端给服务端发送消息---》借助于tcp通道
服务端给客户端回消息----》借助于tcp通道
---第二次请求----
客户端给服务端发送消息---》借助于tcp通道
服务端给客户端回消息----》借助于tcp通道
断开tcp的链接----》四次挥手



# http 2.x版本---->多路复用
客户端同时发送5个http请求
客户端----》服务端
建立tcp的链接---》三次握手
tcp是流式协议---》一次带了一些数据 【请求1的数据,请求2的数据,请求3的数据,请求4的数据,请求5的数据
tcp的响应---》一次性带回来了

断开tcp的链接----》四次挥手


# http 3.x版本---》使用udp+协议 保证了可靠

 

2 web框架

# 1 web 框架是什么---》别人帮咱们写了一些基础代码---》我们只需要在固定的位置写固定的代码--》就能实现一个web应用
Web框架(Web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法。web框架已经实现了很多功能,开发人员使用框架提供的方法并且完成自己的业务逻辑,就能快速开发web应用了。浏览器和服务器的是基于HTTP协议进行通信的。也可以说web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使用的方法,大大提高了开发的效率


# 2 python界有个协议 wsgi协议
客户端浏览器和         ---------------------->      python web框架之间通信需要遵循这个协议
发出来的是http请求    符合wsgi协议的web服务器         django,flask  requset response
   
   
   基于这个协议的web服务器
  -wsgiref:django框架默认就用它---》性能低,并发量低--》测试阶段使用
       -uwsgi:c语言写的
       -gunicorn:python写的
       
 
  协议到底怎么规定的:web服务器后面的  python框架一定是一个可调用的对象,必须接收两个参数(environ, start_response)--->environ它是个字典----》里面全是http请求的东西
   
   
# 3 使用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()

3 django

# 1 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
       
# 补充软件版本
3.6.小版本      后面小版本只做bug修改
   3.7.小版本
       
# 2 下载djagno   1.x 2.x 3.x   4.x
-统一都用:pip3 install django==3.2.20
  -卸载掉原来的--》装上这个
       -pip uninstall django  #卸载
       -pip3 install django==3.2.20
       -pip3 install django # 如果不指定版本就会装最新
       
       
   -会在python安装目录下的script文件夹多出一个可执行文件 django-admin
   -用来创建djagno项目的
   
   
   -命令创建
   django-admin startproject 项目名
   -使用pycharm创建---》本质也是在执行这个命令,编辑器帮咱们做了
   
   
   
# 3 django目录结构


# 4 启动项目
-python  manage.py runserver 0.0.0.0:8080
  -运行在127.0.0.1和0.0.0.0上的区别
    -pycharm中点击绿色箭头运行
   
   
# 5 请求声明周期

 

 

4 路由控制

# 1 路由是什么
URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行
请求路径和要执行的视图函数的对应关系

# 2 如何使用
-path:准确路径,精准匹配---》以后基本都是path
   -re_path---》就是原来的url---》正则匹配---》非常少
   
   -放在列表中:urlpatterns = []--->列表中得数据,必须是 path或re_path执行完的结果
# 3 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 是给视图函数传递默认参数
   第四个参数:路径的别名---》后期使用反向解析得到该路径
   
   
# 4 re_path的详细使用
跟path除了第一个参数不一样,其他完全一样
   第一个参数是:正则表达式
   后期用的很少,危险性大---》原来之所以支持正则的目的是为了分组出参数
   path通过转换器能完成这个操作--》于是--》这个几乎不用

   
# 5 反向解析--->用在视图函数中,用在模板中
-没有转换器的情况:
  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'
       
       
# 6 路由分发
-为什么默认路由匹配就匹配到了 urls.py ?
  -settings.py 有配置的
       -ROOT_URLCONF = 'django_demo02.urls'
       
   -一个app自己有自己的路由
  -在app下创建urls.py

5 视图层

# 1 views.py 这个文件---》目前写的是视图函数

# 2 视图函数必须写成这样
def 视图函数(request):
   return 四件套


# 3 request对象
-它是http请求(数据包---》字符串形式)---》拆分成了django中得request对象
   -常用的:
  request.path
       request.method
       request.GET
       requets.POST
       requets.body
       request.get_full_path()  # 方法
       request.files   # 前端携带文件过来---》转成了字典,根据文件的名字取到文件对象
     

   -不常用
      request.cookie
       request.session
       request.content_type  # 提交的编码格式:urlencoded(form表单),json,form-data,text/plain(一般不用,浏览器默认的格式)
       request.META: 请求头中得数据
      user-agent:HTTP_USER_AGENT
           referer:
           客户端ip地址:REMOTE_ADDR
           用户自定义的  
          定义:name=lqz
          取:request.META.get('HTTP_NAME')  # 前面加HTTP_ 把自定义的转成大写
       -request.user  # auth
       -request.is_ajax()  
 
# 4 四件套

#5 cbv
# 6 文件上传

 

 

作业

# 0 整理上课讲的内容到笔记
-http
   -web框架
   -django

# 1 回去看mysql分组
# 2 get请求能携带请求体吗?
-地址栏中:get,post都能带
   -请求体:post ,get能不能呢?
   get请求也是可以带请求体的,可以被servlet中的request.getInputStream ()获取
# 3 python解释器都卸载---》重装3.9---》django换成 3.2.20
统一装一个python3.9
   不要装的很深
   安装路径要加入到环境变量(自动加)
# 4 环境变量干啥用的
  
通过在环境变量里面加入所有软件的安装路径,当我们想运行某一软件时双击其快捷方式,此时,计算机除了在其当前目录下寻找该软件的.exe文件外,还会在环境变量中搜索软件的路径,找到,运行。
综上,Windows中的环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到电脑中指定的路径去找。用户通过设置环境变量,来更好的运行进程。

# 5 0.0.0.0和localhost和127.0.0.1 有什么区别

 

# 6 画出django请求生命周期

# 7 写个django项目---》中间件---》取出用户访问的 user-agent和ip地址,(sqlite,mysql)建个表,存到表汇总
id  user-agent  ip

# 8 使用echars,画出饼形图展示客户端类型的比例(极少数同学写)

补充

# 1 python 解释器安装完----》有几个重要的文件和文件夹
-根路径下  python.exe-->可以复制改名---》做多版本共存
   -scripts文件夹:pip命令在它下面,后期咱们会装 第三模块[可能会有可执行文件,可执行文件都放在这]
   -Lib:一对文件夹中有 py文件
  -python的解释器---》有些代码是用c写的  字典,列表
           --->有些代码是用python自己写的 :使用语言自己写自己:自举
           
       -内置的模块自举的代码
       -第三方包site-package---
 
请求声明周期