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.hqwc.cn/news/329447.html

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

相关文章

dnSpy调试工具二次开发1-新增菜单

测试环境&#xff1a; window 10 visual studio 2019 版本号&#xff1a;16.11.15 .net framework 4.8 开发者工具包 下载 .NET Framework 4.8 | 免费官方下载 .net 5开发者工具包 下载 .NET 5.0 (Linux、macOS 和 Windows) 利用git拉取代码(源码地址&#xff1a;Gi…

测试分类篇

小王学习录 测试分类按测试对象划分1. 界面测试2. 可靠性测试3. 容错性测试4. 文档测试5. 兼容性测试6. 易用性测试7. 安装卸载测试8. 安全测试9. 性能测试10. 内存泄露测试 按是否查看代码划分1. 黑盒测试2. 白盒测试3. 灰盒测试 按开发阶段分1. 单元测试2. 集成测试3. 系统测…

秒懂百科,C++如此简单丨第十五天:指针

目录 必看信息 Everyday English 前言 &#x1f4dd;了解指针 &#x1f4dd;定义指针 &#x1f4dd;分析指针 &#x1f4dd;运用指针 总结 必看信息 ▶本篇文章由爱编程的小芒果原创&#xff0c;未经许可&#xff0c;严禁转载。 ▶本篇文章被收录于秒懂百科&#xff0c…

代码整洁之道:一个提升代码可读性的小技巧

写在开头 如何写好代码&#xff0c;一千个人眼中有一千个哈姆雷特&#xff0c;但是我认为有一点的是写好代码的公理&#xff0c;不可撼动&#xff0c;即对代码可读性的追求。最近在工作中面对了太多可读性不佳的代码&#xff0c;使得对于旧有代码的维护和分析困难重重&#xf…

Vue3 watch 的使用,如何监听一个对象中的属性值的变化 vue3 + ts + vite

Vue3 watch 的使用&#xff0c;如何监听一个对象中的属性值的变化 由 vue2 转到 vue3 ts vite 之后都不会写这些玩意了。搜了下&#xff0c;找到了答案&#xff1a; vue2 的 watch <script>export default {watch: {$route.query.id(newValue){// 可以这样监听路由的…

双十一的祈祷【算法赛】

问题描述 双十一&#xff0c;不仅是购物狂欢节&#xff0c;更有 "光棍节" 之称。这源于 11:1111:11 由四个 11 构成&#xff0c;象征着单身。 作为大学生的小蓝也想经历甜甜的校园恋爱&#xff0c;于是他找到了爱神丘比特&#xff0c;向他祈祷能为自己带来一段邂逅…

IDEAVsCode常用插件

IDEA&VsCode常用插件 IDEA lombok、mybatisx 插件 Vscode Vetur —— 语法高亮、智能感知、Emmet 等&#xff0c;包含格式化功能&#xff0c; AltShiftF &#xff08;格式化全文&#xff09;&#xff0c;CtrlK CtrlF&#xff08;格式化选中代码&#xff0c;两个 Ctrl需…

【数据库】聊聊常见的索引优化-下

分页查询优化 主键排序 在实际的使用中&#xff0c;通过limit 10000,10 查询第10000记录到10010记录&#xff0c;mysql执行的时候是按照将前10010记录全部统计出来&#xff0c;然后剔除前10000条记录&#xff0c;选择后10条记录。这样来看的话&#xff0c;效率不高。 如果数据…

小微企业在银行信贷相关产品和机器学习建模案例_论文科研_企业调研

各银行小微企业贷款业务 互联网的时代&#xff0c;大量新信息技术的涌现和网络的无处不在&#xff0c;想要抢占这片金融天地&#xff0c;必须重视小微金融业务&#xff0c;小微企业是一直具有重大潜力的客户&#xff0c;商业银行、消金公司发展小微信贷业务可以拓宽自身客户群…

vue3 + TS + vite 搭建中后台管理系统(完整项目)

vue3 TS vite 搭建中后台管理系统&#xff08;完整项目&#xff09; 前言1、搭建步骤及方法2、集成多种插件功能&#xff0c;实现中后台按需使用3、新手学TS如何快速进入状态、定义TS类型4、layout搭建四款常见风格6、大屏搭建效果5、vue3Ts运营管理系统总结&#xff1a; 前言…

【Java】设计模式之保护性暂停

设计模式之保护性暂停 Guarded Suspension&#xff0c;这个设计模式&#xff0c;主要用在一个线程等待另一个线程的执行结果&#xff08;发请求等待响应&#xff09; 有一个结果需要从一个线程传递到另一个线程&#xff0c;传递只进行一次&#xff0c;用设计模式保护性暂停。 …

c语言的一些题(2024_1_7)

变种水仙花数 #include <stdio.h>int main() {int a 10000;for (; a < 100000; a){if ((a / 10000) * (a % 10000) (a / 1000) * (a % 1000) (a / 100) * (a % 100) (a / 10) * (a % 10) a)printf("%d ", a);}return 0; } //变种水仙花数 - Lily Num…