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>
    

在这里插入图片描述

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

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

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

相关文章

科研上新 | 第4期:语言-音乐对比预训练;查找表实现的神经网络推理;大模型时代重新定义搜索框架

编者按&#xff1a;欢迎阅读“科研上新”栏目&#xff01;“科研上新”汇聚了微软亚洲研究院最新的创新成果与科研动态。在这里&#xff0c;你可以快速浏览研究院的亮点资讯&#xff0c;保持对前沿领域的敏锐嗅觉&#xff0c;同时也能找到先进实用的开源工具。 本期内容速览 …

什么是ajax,为什么使用ajax!

前言&#xff1a; 要学习一门新的、技术之前&#xff0c;首先我们要了解一下他是什么&#xff0c;为什么使用&#xff0c;有什么好处&#xff0c;该怎么理解。现在就从下文开始了解吧 什么是ajax: Ajax即“Asynchronous Javascript And XML”(异步JavaScript 和XML)&#xff0…

监控API的指标

监控服务器已经是常态了&#xff0c;但是监控API的表现是啥意思呢&#xff1f;还有监控指标&#xff1f;今天就来看看如何监控API。 正如监控应用程序以确保高质量性能一样&#xff0c;也必须监控API。 API是应用程序相互通信的管道。更具体地说&#xff0c;API提供了一种方法…

spring事务默认传播机制REQUIRED的试验(手动开启事务代码+feign远程调用)

transactional注解&#xff0c;默认啥都不指定的时候&#xff0c;我们使用的就是PROPAGATION_REQUIRED这种方式。 PROPAGATION_REQUIRED:业务方法需要在一个事务中运行&#xff0c;如果方法运行时&#xff0c;已处在一个事务中&#xff0c;那么就加入该事务&#xff0c;否则自…

C++20新特性解析:深入探讨协程库的实现原理与应用

C20新特性解析&#xff1a;深入探讨协程库的实现原理与应用 一、C20的协程库简介二、C20协程基础知识2.1、协程的基本概念和使用方法2.2、C20中的协程支持2.3、协程与传统线程的对比 三、C20协程库的实现原理四、C20协程库的应用实例总结 一、C20的协程库简介 C20引入了对协程…

特种印制电路技术

1特种印制电路技术现状、分类及特点 2006年&#xff0c;信息产业部(现工信部)电子信息产品管理司将高档PCB产品类型概括为HDI板、多层FPC、刚挠结合板、IC载板、通信背板、特种板材印制板、印制板新品种等种类。但直至目前&#xff0c;在印制电路设计与制造领域还没有形成特种…

软件测试|深入理解SQL RIGHT JOIN:语法、用法及示例解析

引言 在SQL中&#xff0c;JOIN是一种重要的操作&#xff0c;用于将两个或多个表中的数据关联在一起。SQL提供了多种JOIN类型&#xff0c;其中之一是RIGHT JOIN。RIGHT JOIN用于从右表中选择所有记录&#xff0c;并将其与左表中匹配的记录组合在一起。本文将深入探讨SQL RIGHT …

Python Selenium常见的报错以及措施

Python Selenium的常见报错主要包括以下几种&#xff1a; 1. NoSuchElementException: 当Selenium无法在DOM中找到元素时&#xff0c;会抛出此异常。这通常是因为元素不存在或者页面还未完全加载。 解决方法&#xff1a; 显式等待 隐式等待 越快越慢&#xff0c;越慢越快&#…

C#,冒泡排序算法(Bubble Sort)的源代码与数据可视化

排序算法是编程的基础。 常见的四种排序算法是&#xff1a;简单选择排序、冒泡排序、插入排序和快速排序。其中的快速排序的优势明显&#xff0c;一般使用递归方式实现&#xff0c;但遇到数据量大的情况则无法适用。实际工程中一般使用“非递归”方式实现。本文搜集发布四种算法…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第二天-Linux开发板外设练习题(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

并发(6)

目录 31.JUC框架包含几个部分&#xff1f; 32.Lock框架和Tools包含哪些核心的类&#xff1f; 33.JUC原子类有哪些核心的类&#xff1f; 34.JUC线程池有哪些核心的类&#xff1f; 35.线程安全的实现方法有哪些&#xff1f; 31.JUC框架包含几个部分&#xff1f; 主要包含&am…

SpringCloud-高级篇(十三)

前面的主从集群可以应对Redis高并发读的问题&#xff0c;Redis主从之间可以做同步&#xff0c;为了提高主从同步时的性能&#xff0c;单节点Redis的内存不要设置太高&#xff0c;如果内存占用过多&#xff0c;做RDB的持久化&#xff0c;或者做全量同步的时候&#xff0c;导致大…

LDD学习笔记 -- Linux错误码

LDD学习笔记 -- Linux错误码 EACCES(Permission Denied) 13EEXIST(File Exits) 17EINVAL(Invalid Argument) 22ENOENT(No Such File or Directory)ENOMEM(Out of Memory)EIO(Input/Output Error) 5ENOSPC(No space Left on Device)ENOTTY(Not a Typewrite)EPIPE(Broken Pipe)EI…

使用邮箱发送验证码前端完成登录

前言 在前一篇使用C#发送邮箱验证码已经完成使用.net core web api写了完成往登录邮箱发送验证码的接口。现在就用前端调用接口模拟登录功能。 接口 public class ApiResp{public bool Success { get; set; }public int Code { get; set; }public int count { get; set; }pu…

元数据管理平台对比预研 Atlas VS Datahub VS Openmetadata

大家好&#xff0c;我是独孤风。元数据管理平台层出不穷&#xff0c;但目前主流的还是Atlas、Datahub、Openmetadata三家&#xff0c;那么我们该如何选择呢&#xff1f; 本文就带大家对比一下,这三个平台优势劣势。要了解元数据管理平台&#xff0c;先要从架构说起。 正文共&am…

【北邮国院大四上】Business Technology Strategy 企业技术战略

北邮国院电商大四在读&#xff0c;本笔记仅为PPT内容的整理与翻译&#xff0c;并不代表本课程的考纲及重点&#xff0c;仅为本人复习时方便阅读与思考之作。 写在前面 大家好&#xff0c;欢迎来到大学期间的最后一门课程&#xff0c;本门课程是中方课&#xff0c;所以很庆幸的…

【Apollo】阿波罗使用占位符 #{} 的异常分析

文章目录 1. 前言2. 复现3. 分析3.1 Value 注解3.2 根因 4. 后记5. 参考资料 1. 前言 出于线上 hotfix 报文请求模板的考虑&#xff0c;新增一个阿波罗配置&#xff0c;取值形如&#xff1a; 发布配置一段时间后&#xff0c;刚好需要重启服务&#xff0c;最终造成服务宕机&a…

在Ubuntu22.04上安装WordPress

WordPress是当今最简单、最强大的博客和网站建设工具。据统计全球大约有40% 以上网站是使用WordPress&#xff0c;这是个巨大的数字也侧面证明了WordPress的强大和普遍性。因此&#xff0c;如果你正在寻找一款高效、实用、可靠的CMS工具来构建网站&#xff0c;那么WordPress无疑…

关于HAL库外部中断的开关流程

通过HAL库配置好外部中断后&#xff0c;会生成如下代码&#xff1a; static void MX_GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStruct {0}; /* USER CODE BEGIN MX_GPIO_Init_1 */ /* USER CODE END MX_GPIO_Init_1 *//* GPIO Ports Clock Enable */__HAL_RCC_GPIOD_CLK_…

self-attention(上)李宏毅

B站视频链接 word embedding https//www.youtube.com/watch?vX7PH3NuYW0Q self-attention处理整个sequence&#xff0c;FC专注处理某一个位置的资讯&#xff0c;self-attention和FC可以交替使用。 transformer架构 self-attention的简单理解 a1-a4可能是input也可以作为中…