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.bodyrequest.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.知识回顾 创建项目:新项目、别人项目、新版版、老版本 项目目录(v1.0版本) 路由系统 常见路由编写加粗样式 /index/ 函数 /index/<str:v1> 函数 re_path(ryy/(\d{4})-(\d{2})-(\d{2})/, views.yy), re_path(ryy/(?…...
可狱可囚的爬虫系列课程 09:通过 API 接口抓取数据
前面已经讲解过 Requests 结合 BeautifulSoup4 库抓取数据,这种方式在抓取数据时还是比较方便快捷的,但是这并不意味着所有的网站都适合这种方式,并且这也不是抓取数据的最快方式,今天我们来讲一种更快速的获取数据的方式…...
2. Spring Boot 自动配置 Mybatis 流程
1. Spring Boot 自动配置 Mybatis 自动配置过程中做了3个主要bean的创建及很重要的一些事情。 sqlSessionFactory、sqlSessionTemplate、MapperScannerConfigurer 等配置bean的创建。sqlSessionFactory:解析 xml配置文件,并将MappedStatement放入到Has…...
Nginx配置反向代理实例一
Mac 安装Nginx教程 提醒一下:下面实例讲解是在Mac系统演示的; 反向代理实例一实现的效果 在浏览器地址栏输入www.testproxy.com, 跳转到系统Tomcat主页面。 第一步:在系统的 hosts 文件进行ip和域名对应关系的配置。 Mac 系统修改Hosts文…...
训练自己的GPT2
训练自己的GPT2 1.预训练与微调2.准备工作2.在自己的数据上进行微调 1.预训练与微调 所谓的预训练,就是在海量的通用数据上训练大模型。比如,我把全世界所有的网页上的文本内容都整理出来,把全人类所有的书籍、论文都整理出来,然…...
etcd储存安装
目录 etcd介绍: etcd工作原理 选举 复制日志 安全性 etcd工作场景 服务发现 etcd基本术语 etcd安装(centos) 设置:etcd后台运行 etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管。etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册…...
如何彻底卸载Microsoft Edge浏览器
一、引语 随着微软推出全新的Edge浏览器,许多用户可能想要尝试或完全切换到其他浏览器。在这篇文章中,我们将向您介绍如何彻底卸载Microsoft Edge浏览器,以确保您的系统干净整洁。 二、通过系统设置卸载 1、首先,右键单击桌面上…...
Transformers 2023年度回顾 :从BERT到GPT4
人工智能已成为近年来最受关注的话题之一,由于神经网络的发展,曾经被认为纯粹是科幻小说中的服务现在正在成为现实。从对话代理到媒体内容生成,人工智能正在改变我们与技术互动的方式。特别是机器学习 (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接口取电芯片介绍和应用场景
随着科技的发展,USB PDTYPE-C已经成为越来越多设备的充电接口。而在这一领域中,LDR6328Q PD取电芯片作为设备端协议IC芯片,扮演着至关重要的角色。本文将详细介绍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 决定利用假期外出旅行,他们将想去的城市从 1 1 1 到 n n n 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同…...
Golang Web框架性能对比
Golang Web框架性能对比 github star排名依次: Gin Beego Iris Echo Revel Buffalo 性能上gin、iris、echo网上是给的数据都是五星,beego三星,revel两星 beego是国产,有中文文档,文档齐全 根据star数,性能,易用程度…...
【OCR】 - Tesseract OCR在mac系统中安装
Tesseract OCR 在Mac环境下安装Tesseract OCR(Optical Character Recognition)通常可以通过Homebrew包管理器进行。以下是安装步骤: 安装Homebrew 如果你还没有安装Homebrew,请访问 https://brew.sh/ 并按照页面上的说明安装。…...
了解不同方式导入导出的速度之快
目录 一、用工具导出导入 Navicat(速度慢) 1.1、导入: 共耗时: 1.2、导出表 共耗时: 二、用命令语句导出导入 2.1、mysqldump速度快 导出表数据和表结构 共耗时: 只导出表结构 导入 共耗时&…...
2024年第九届计算机与通信系统国际会议(ICCCS2024) ,邀您相约西安!
会议官网: ICCCS2024 | Xian China 时间: 2024年4月19-22日 地点: 中国西安 会议简介: 近年来,信息通信在不断发展,为计算机网络的进步与发展提供了先进可靠的技术支持。随着计算机网络与通信技术的深入发展,计算机通信技术、数…...
获取直播间的最新评论 - python 取两个list的差集
python 取两个list的差集 作用:比如我要获取评论区列表,先获取了一遍,这个时候有人评论了几条,我再获取一遍后,找出多的那几条 使用set数据类型来取两个列表的差集。差集表示仅包含在第一个列表中而不在第二个列表中…...
2023年度总结:但行前路,不负韶华
🦁作者简介:一名喜欢分享和记录学习的在校大学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755qq.com 🦉个人WeChat:Vir2021GKBS &#x…...
智数融合|低代码入局,推动工业数字化转型走"深"向"实"
当下,“数字化、智能化”已经不再是新鲜词汇。事实上,早在几年前,就有企业开始大力推动数字化转型,并持续进行了一段时间。一些业内人士甚至认为,“如今的企业数字化已经走过了成熟期,进入了深水区。” 但事…...
初学者的基本 Python 面试问题和答案
文章目录 专栏导读1、什么是Python?列出 Python 在技术领域的一些流行应用。2、在目前场景下使用Python语言作为工具有什么好处?3、Python是编译型语言还是解释型语言?4、Python 中的“#”符号有什么作用?5、可变数据类型和不可变…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
解析“道作为序位生成器”的核心原理
解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制,重点解析"道作为序位生成器"的核心原理与实现框架: 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...
