当前位置: 首页 > news >正文

2024--Django平台开发-Django知识点(四)

1.知识回顾

  • 创建项目:新项目、别人项目、新版版、老版本 + 项目目录(v1.0版本)

  • 路由系统

    • 常见路由编写加粗样式

      /index/             函数
      /index/<str:v1>     函数
      re_path(r'yy/(\d{4})-(\d{2})-(\d{2})/', views.yy),
      re_path(r'yy/(?P<v1>\d{4})-(?P<v2>\d{2})-(?P<v3>\d{2})/', views.mm),
      
      def yy(request,a1,a2,aa3):passdef mm(request,v1,v2,v3):pass
      
    • 路由的命名

      /index/             函数        name='xx1'
      /index/<str:v1>     函数        name='xx2'
      

      注意:权限的校验。

    • 路由底层的实现

      • 路由定义的本质

        urlpatterns = [# URLPattern.resolve   -> RoutePattern.matchURLPattern(RoutePattern("login/", name=None, is_endpoint=True), views.login, None, None),# resolve -> RoutePattern.matchpath('login/', views.login),  # resolvere_path(r'yy/(\d{4})-(\d{2})-(\d{2})/', views.yy),
        ]
        
      • 输入网址访问我们的网站:

        • 原生请求 -> 封装Request对象 /info/v1/

        • URLResolver.resolve

          resolver = URLResolver("/")
          resolver.resolvefor pattern in self.url_patterns:pattern=URLPattern对象.resolveURLPattern对象.RoutePattern对象.match   /info/v1/
          

答疑:path / re_path 有啥区别呀?

  • 表象:

    • path

      path('login/', views.login)
      path('other/<int:v1>/<str:v2>/', views.other)
      
    • re_path

      re_path(r'yy/(\d{4})-(\d{2})-(\d{2})/', views.yy)
      
  • 底层

    path = partial(_path, Pattern=RoutePattern)
    re_path = partial(_path, Pattern=RegexPattern)
    
    • path

      path('login/', views.login)
      path('other/<int:v1>/<str:v2>/', views.other)URLPattern(RoutePattern("login/", name=None, is_endpoint=True), views.login, None, None),
      
    • re_path

      re_path(r'yy/(\d{4})/', views.yy)URLPattern(RegexPattern("yy/(\d{4})/", name=None, is_endpoint=True), views.yy, None, None),
      

2.路由系统

2.1 常见路由

2.2 路由名称

2.3 路由底层实现

2.4 路由分发

在这里插入图片描述

研究django admin源码时:

在这里插入图片描述

namespace是什么?

  • 无namespace

    from django.urls import reverseurl = reverse("v2")
    print(url)
    
  • 有namespace

    from django.urls import reverseurl = reverse("namespace名称:v2")
    print(url)url = reverse("namespace名称:namespace名称:v2")
    print(url)
    

问题:什么叫反向生成?

path('login/login/login/login/', views.login, name='login'),

2.5 路由本质

2.5.1 关于导入和反射

  • 反射,以字符串的形式去操作对象中的成员。
  • 导入模块

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.5.2 include源码

urlpatterns = [path('login/', views.login),path('api/', include("apps.base.urls")),path('api/', (import_module("apps.base.urls"),              # 模块对象 from app.base import urlsNone, None))
]
urlpatterns = [path('login/', views.login),path('api/', include("apps.base.urls")),path('api/', (import_module("apps.base.urls"),              # 模块对象 from app.base import urlsNone, None)),path('web/', ([path('v1/', www_views.login, name='v1'),path('v2/', www_views.login, name='v2'),], None, None)),
]

在path执行时,传入的参数种类:

  • 网址 + 函数

  • 网址 + (模块对象,None,None)

    urlpatterns = [...
    ]
    
  • 网址 + (列表,None,None)

2.5.3 path源码

  • 网址 + 函数

    path('login/', views.login),URLPattern(RoutePattern("login/", name=None, is_endpoint=True), views.login, None, None
    )
    
  • 网址 + (模块对象,None,None)

    path('api/', include("apps.base.urls")),
    path('api/', (import_module("apps.base.urls"),              # 模块对象 from app.base import urlsNone, None)
    ),URLResolver(RoutePattern('api/',name=None,is_endpoint=False),import_module("apps.base.urls"),              # 模块对象 from app.base import urlsNone,app_name=None,namespace=None
    )
    
  • 网址 + (列表,None,None)

    path('web/', ([path('v1/', www_views.login, name='v1'),path('v2/', www_views.login, name='v2'),], None, None)
    )URLResolver(RoutePattern('api/',name=None,is_endpoint=False),[path('v1/', www_views.login, name='v1'),path('v2/', www_views.login, name='v2'),], None,app_name=None,namespace=None
    )
    

所有URL用类和对象嵌套的形式实现:

from django.urls import path, re_path, include
from apps.www import viewsfrom django.urls import URLPattern, ResolverMatch
from django.urls.resolvers import RoutePattern
from importlib import import_module
from apps.www import views as www_views
from django.urls.resolvers import URLResolverurlpatterns = [URLPattern(RoutePattern("login/", name=None, is_endpoint=True),views.login,None,None),URLResolver(RoutePattern('api/', name=None, is_endpoint=False),import_module("apps.base.urls"),  # 模块对象 from app.base import urlsNone,app_name=None,namespace=None),URLResolver(RoutePattern('web/', name=None, is_endpoint=False),[path('v1/', www_views.login, name='v1'),path('v2/', www_views.login, name='v2'),],None,app_name=None,namespace=None)
]

2.5.4 路由匹配源码

1.请求来了

在这里插入图片描述

2.路由匹配

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.匹配过程

在这里插入图片描述

答疑:多个app的时候,路由分发到不同的app里,如果1个app,有100个路由,能不能按大类功能进行分组。

path('api/user/login/', views.login, name='login'),
path('api/user/logout/', views.login, name='login'),
path('api/user/order/', views.login, name='login'),
path('api/user/info/', views.login, name='login'),
path('api/user/ad/', views.login, name='login'),

2.6 关于网址之后的 /

  • APPEND_SLASH = True

    path('login/', views.login, name='login')http://127.0.0.1:8000/login/  成功http://127.0.0.1:8000/login   重定向,GEThttp://127.0.0.1:8000/login/   
    

    当我们直接访问网址或GET请求访问网址,都会成功,如果是POST请求有问题。

  • APPEND_SLASH = False

    path('login/', views.login, name='login')http://127.0.0.1:8000/login/   成功http://127.0.0.1:8000/login    失败path('login', views.login, name='login')http://127.0.0.1:8000/login/   失败http://127.0.0.1:8000/login    成功
    

    严格模式,自己定义是什么就以什么方式访问。

2.7 其他

在这里插入图片描述

3.视图

3.1 FBV和CBV

在这里插入图片描述

问题:你习惯用函数视图比较多还是类视图比较多。

  • 非前后端分离,FBV
  • 前后端分离、小程序API,CBV【django rest framekwork框架)

3.2 参数

  • request对象,读取请求相关所有的数据。

    request.method
    request.GET        ?name=123&age=123&age=199   =>  特殊的字典:{name:[123],"age":[123,1999]}
    reqeust.POST
    request.FILES
    request.path_info
    request.body
    
    request.resover_math
    request.session
    
  • v1,v2 或 *args,**kwargs,用于接收动态路由中的参数值

3.3 业务处理

3.4 返回值

from django.http import HttpResponse
from django.http import JsonResponse
from django.shortcuts import render, redirect# `构建` 响应体和响应头
# return HttpResponse("中国北京")
# return JsonResponse({"status": True, "name": "一夜白头"}, json_dumps_params={"ensure_ascii": False})
# return render(request, "demo.txt")
# return redirect("https://www.baidu.com") # 301/302

问题:那什么时候是301,什么时候是302?

class HttpResponseRedirect(HttpResponseRedirectBase):status_code = 302  # 临时重定向class HttpResponsePermanentRedirect(HttpResponseRedirectBase):status_code = 301  # 永久重定向
pythonav.com
5xclass.com 【运行】

4.HTML模板

希望数据 + 嵌套 HTML标签,返回给用户浏览器。

4.1 基本使用

  • 编写

    def demo(request):# 业务处理,获取到值user_list = ["一夜白头","星翼"]# 1.寻找demo.html,去哪里找? 优先DIRS,再去已注册APP的templates# 2.读取文件内容 + 参数 => 模板渲染(替换)【模板语法】# 3.封装到HttpResponse的请求体中# 4.后续给用户返回return render(request,"demo.html",{"v1":user_list})
    
  • 寻找

    INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.staticfiles',"apps.app01.apps.App01Config","apps.www.apps.WwwConfig",
    ]TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request',# 'django.contrib.auth.context_processors.auth',# 'django.contrib.messages.context_processors.messages',],},},
    ]
    

4.2 底层处理方式

在这里插入图片描述

namespace = {'name': 'wupeiqi', 'data': [18, 73, 84]}
code = '''def hellocute():return  "name %s ,age %d" %(name,data[0],) '''
func = compile(code, '<string>', "exec")
exec(func, namespace)
result = namespace['hellocute']()
print(result)info="""
def _execute():_buffer = []_buffer.append("<h1>")_buffer.append(name)_buffer.append("123")_buffer.append("</h1>")return "".join(_buffer)
"""
func = compile(info, '<string>', "exec")
exec(func, namespace)
result = namespace['_execute']()
print(result)

4.3 其他

1.继承

在这里插入图片描述

2.导入

在这里插入图片描述

3.常见问题和应用

  • 页面的title问题
  • 关于模板渲染的时机

在这里插入图片描述

4.4 自定义模板函数

  • app必须注册

  • 创建templatetags的文件夹

  • 任意创建文件,内容:

    from django.template.library import Libraryregister = Library()@register.simple_tag()
    def my_func(v1, v2, v3):return "哈哈哈哈" + v1 + v2 + v3@register.inclusion_tag("xo.html")
    def my_xo(num):return {"x1": [item for item in num if item > 22]}@register.filter
    def my_tt(a1, a2):return "哈哈哈" + a1 + a2
  • 调用

    {% load xxx %}
    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>Title</title>
    </head>
    <body>
    <div>{{ name }}</div>
    <div>{{ num }}</div>
    <div>{% my_func "一夜白头" "星翼" name %}</div>
    <div>{% my_xo num %}</div>
    <div>{{ "alex"|my_tt:"xxxx" }}</div>
    {% if "alex"|my_tt:"xxxx" %}<h1>真</h1>
    {% else %}<h1>家</h1>
    {% endif %}
    </body>
    </html>
    
  • 片段:xo.html

    <ul>{% for item in x1 %}<li>{{ item }}</li>{% endfor %}
    </ul>
    

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

相关文章:

2024--Django平台开发-Django知识点(四)

1.知识回顾 创建项目&#xff1a;新项目、别人项目、新版版、老版本 项目目录&#xff08;v1.0版本&#xff09; 路由系统 常见路由编写加粗样式 /index/ 函数 /index/<str:v1> 函数 re_path(ryy/(\d{4})-(\d{2})-(\d{2})/, views.yy), re_path(ryy/(?…...

可狱可囚的爬虫系列课程 09:通过 API 接口抓取数据

前面已经讲解过 Requests 结合 BeautifulSoup4 库抓取数据&#xff0c;这种方式在抓取数据时还是比较方便快捷的&#xff0c;但是这并不意味着所有的网站都适合这种方式&#xff0c;并且这也不是抓取数据的最快方式&#xff0c;今天我们来讲一种更快速的获取数据的方式&#xf…...

2. Spring Boot 自动配置 Mybatis 流程

1. Spring Boot 自动配置 Mybatis 自动配置过程中做了3个主要bean的创建及很重要的一些事情。 sqlSessionFactory、sqlSessionTemplate、MapperScannerConfigurer 等配置bean的创建。sqlSessionFactory&#xff1a;解析 xml配置文件&#xff0c;并将MappedStatement放入到Has…...

Nginx配置反向代理实例一

Mac 安装Nginx教程 提醒一下&#xff1a;下面实例讲解是在Mac系统演示的&#xff1b; 反向代理实例一实现的效果 在浏览器地址栏输入www.testproxy.com, 跳转到系统Tomcat主页面。 第一步&#xff1a;在系统的 hosts 文件进行ip和域名对应关系的配置。 Mac 系统修改Hosts文…...

训练自己的GPT2

训练自己的GPT2 1.预训练与微调2.准备工作2.在自己的数据上进行微调 1.预训练与微调 所谓的预训练&#xff0c;就是在海量的通用数据上训练大模型。比如&#xff0c;我把全世界所有的网页上的文本内容都整理出来&#xff0c;把全人类所有的书籍、论文都整理出来&#xff0c;然…...

etcd储存安装

目录 etcd介绍: etcd工作原理 选举 复制日志 安全性 etcd工作场景 服务发现 etcd基本术语 etcd安装(centos) 设置&#xff1a;etcd后台运行 etcd 是云原生架构中重要的基础组件&#xff0c;由 CNCF 孵化托管。etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册…...

如何彻底卸载Microsoft Edge浏览器

一、引语 随着微软推出全新的Edge浏览器&#xff0c;许多用户可能想要尝试或完全切换到其他浏览器。在这篇文章中&#xff0c;我们将向您介绍如何彻底卸载Microsoft Edge浏览器&#xff0c;以确保您的系统干净整洁。 二、通过系统设置卸载 1、首先&#xff0c;右键单击桌面上…...

Transformers 2023年度回顾 :从BERT到GPT4

人工智能已成为近年来最受关注的话题之一&#xff0c;由于神经网络的发展&#xff0c;曾经被认为纯粹是科幻小说中的服务现在正在成为现实。从对话代理到媒体内容生成&#xff0c;人工智能正在改变我们与技术互动的方式。特别是机器学习 (ML) 模型在自然语言处理 (NLP) 领域取得…...

判断两个对象某些字段的值是否相同

1、借助mybatis plus的方法 import com.baomidou.mybatisplus.core.toolkit.LambdaUtils; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda; import lombok.SneakyThrows; import o…...

TYPE-C接口取电芯片介绍和应用场景

随着科技的发展&#xff0c;USB PDTYPE-C已经成为越来越多设备的充电接口。而在这一领域中&#xff0c;LDR6328Q PD取电芯片作为设备端协议IC芯片&#xff0c;扮演着至关重要的角色。本文将详细介绍LDR6328Q PD取电芯片的工作原理、应用场景以及选型要点。 一、工作原理 LDR63…...

基于TI TPSXX系列 Buck电路应用计算-外围器件详细计算过程

TPS54202 Buck电路应用计算 1、电气特性2、内部框图3、典型应用电路4、设计需求5、计算EN引脚电阻6、FB引脚电阻估算7、查看反馈电压电压基准8、输入电容计算10、FB引脚反馈电阻计算11、功率电感计算12、输出电容计算13、前馈电容计算15、Layout布局TPS54202-中文版 1、电气特…...

NOIP2012提高组day1-T3:开车旅行

题目链接 [NOIP2012 提高组] 开车旅行 题目描述 小 A \text{A} A 和小 B \text{B} B 决定利用假期外出旅行&#xff0c;他们将想去的城市从 1 1 1 到 n n n 编号&#xff0c;且编号较小的城市在编号较大的城市的西边&#xff0c;已知各个城市的海拔高度互不相同&#xf…...

Golang Web框架性能对比

Golang Web框架性能对比 github star排名依次: Gin Beego Iris Echo Revel Buffalo 性能上gin、iris、echo网上是给的数据都是五星&#xff0c;beego三星&#xff0c;revel两星 beego是国产&#xff0c;有中文文档,文档齐全 根据star数&#xff0c;性能&#xff0c;易用程度…...

【OCR】 - Tesseract OCR在mac系统中安装

Tesseract OCR 在Mac环境下安装Tesseract OCR&#xff08;Optical Character Recognition&#xff09;通常可以通过Homebrew包管理器进行。以下是安装步骤&#xff1a; 安装Homebrew 如果你还没有安装Homebrew&#xff0c;请访问 https://brew.sh/ 并按照页面上的说明安装。…...

了解不同方式导入导出的速度之快

目录 一、用工具导出导入 Navicat&#xff08;速度慢&#xff09; 1.1、导入&#xff1a; 共耗时&#xff1a; 1.2、导出表 共耗时&#xff1a; 二、用命令语句导出导入 2.1、mysqldump速度快 导出表数据和表结构 共耗时&#xff1a; 只导出表结构 导入 共耗时&…...

2024年第九届计算机与通信系统国际会议(ICCCS2024) ,邀您相约西安!

会议官网: ICCCS2024 | Xian China 时间: 2024年4月19-22日 地点: 中国西安 会议简介&#xff1a; 近年来&#xff0c;信息通信在不断发展&#xff0c;为计算机网络的进步与发展提供了先进可靠的技术支持。随着计算机网络与通信技术的深入发展&#xff0c;计算机通信技术、数…...

获取直播间的最新评论 - python 取两个list的差集

python 取两个list的差集 作用&#xff1a;比如我要获取评论区列表&#xff0c;先获取了一遍&#xff0c;这个时候有人评论了几条&#xff0c;我再获取一遍后&#xff0c;找出多的那几条 使用set数据类型来取两个列表的差集。差集表示仅包含在第一个列表中而不在第二个列表中…...

2023年度总结:但行前路,不负韶华

​ &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x…...

智数融合|低代码入局,推动工业数字化转型走"深"向"实"

当下&#xff0c;“数字化、智能化”已经不再是新鲜词汇。事实上&#xff0c;早在几年前&#xff0c;就有企业开始大力推动数字化转型&#xff0c;并持续进行了一段时间。一些业内人士甚至认为&#xff0c;“如今的企业数字化已经走过了成熟期&#xff0c;进入了深水区。” 但事…...

初学者的基本 Python 面试问题和答案

文章目录 专栏导读1、什么是Python&#xff1f;列出 Python 在技术领域的一些流行应用。2、在目前场景下使用Python语言作为工具有什么好处&#xff1f;3、Python是编译型语言还是解释型语言&#xff1f;4、Python 中的“#”符号有什么作用&#xff1f;5、可变数据类型和不可变…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...