Django路由层解析

路由层(urls.py)

Django的路由层是用于将URL映射到视图函数的机制。它用于确定请求URL(HTTP请求)应该被哪个视图函数处理。

Django的路由层包括两个部分:

  1. URL模式:匹配请求URL,决定应该使用哪个视图函数来处理请求。
  2. URL配置:将URL模式与应用程序中的视图函数关联起来,以便Django知道如何处理请求。

URL模式通常使用正则表达式来匹配请求URL。例如,下面是一个简单的URL模式:

from django.urls import path
from . import viewsurlpatterns = [path('articles/<int:year>/', views.year_archive),
]

总体来说,Django的路由层提供了一种灵活而强大的方式来处理请求URL,并将它们连接到相应的视图函数。

路由匹配

一,路由匹配按照正则匹配,一旦正则能够匹配到内容会立刻执行对应的视图函数。不会再继续匹配了

在setting.py中

urlpatterns = [
url(r'^admin/', admin.site.urls),    
url(r'test',views.test),
url(r'testadd',views.testadd)      #第一个参数是一个正则表达式是访问后端静态资源的接口前缀]

          用户在浏览器中输入url时不加最后的斜杠,django会让浏览器默认自动加上斜杠
          可以在配置文件settings.py中指定是否开启该功能
          APPEND_SLASH = True     表示开启 django会让浏览器默认自动加上斜杠

          APPEND_SLASH = False   表示不开启

 无名分组

二,路由匹配url中的正则表达式分组:分组就是给一段正则表达式加括号

无名分组

匹配的时候会将括号内正则表达式匹配到的内容当做位置参数传递给对应的视图函数

在urls.py文件中

url(r'^test/([0-9]{4})/',views.test)

在view.py 视图函数中

def index(request,args):return HttpResponse('')

 有名分组

有名分组

将括号内正则表达式起一个别名,匹配的时候,会将括号内的有别名的正则表达式匹配到的内容当做关键字参数传递给对应的视图函数

在urls.py 路由中

url(r'^test/(?P<year>\d+)/',views.test)      # 起别名的方法:?P<别名>

在view.py 视图函数中

def index(request,year):...  

这里的视图函数中的第二个参数就是分组的名字

注意:无名有名能否混合不能使用。但是同一种命名方式 可以使用多个


url(r'^test/(\d+)/(?P<year>\d+)/', views.test),              #这是错的,有名无名不能混合使用。

url(r'^test/(\d+)/(\d+)/',views.test),                                #同一种命名方式 可以使用多个
url(r'^test/(?P<xxx>\d+)/(?P<year>\d+)/',views.test)   # 同一种命名方式 可以使用多反向

 反向解析

 反向解析:通过一些方法能够得到一个结果,该结果可以访问到对应的url

反向解析的作用

<p>要反向解析 才能拿到后端views中返回的html文件中的信息<a class="btn btn-primary btn-lg" href="{% url 'detail' %}" role="button">点我</a>
</p> 

方法先给路由与视图函数对应关系起一个名字。(前端和后端可以根据这个名字,通过一些方法能够得到一个结果,该结果可以访问到对应的url)

 在urls.py路由中 

url(r'^testadd/',views.testadd,name='add')

前端解析表示:无论testadd改成什么,在前端页面html,都能拿到 r'^...../' 中的东西

后端解析表示:无论testadd改成什么,在后端视图view.py文件中,都能拿到r'^...../'中的东西

前端解析

在html文件中

 {% url 'add' %}比如:<a href=''{% url 'add' %}''>11</a>

后端解析

在views.py文件中

 from django.shortcuts import reverseurl=reverse('add')   # _url是变量,reverse('add') 表示的是r'^...../'中的东西

无名分组反向解析 

在urls.py路由中

url(r'^testadd/(\d+)/',views.testadd,name='add') 

前端解析表示:无论testadd改成什么,在前端页面html,都能拿到 r'^...../' 中的东西 

后端解析表示:无论testadd改成什么,在后端视图view.py文件中,都能拿到 r'^...../' 中的东西 

前端解析

在html中 

{% url 'add'  1 %}# 注意:这里的数字,一般都是用户的Id 既是:user_obj.id  既是:{% url  '反向解析起的名字'  user_obj.id %}      比如:<a href=''{%url  'add'  11%}''>11111</a>

后端解析 

在views.py中 

from django.shortcuts import reverse_
url=reverse('add',args=(1,))# _url是变量,reverse('add') 表示的是 r'^...../' 中的东西,args=(1,) 接收的是数字,通常是数据的主键值,传给了(\d+)

                                                       

有名分组反向解析 

在urls.py中

url(r'^testadd/(?P<year>\d+)/',views.testadd,name='add')

前端解析表示:无论testadd改成什么,在前端页面html,都能拿到 r'^...../' 中的东西

后端解析表示:无论testadd改成什么,在后端视图view.py文件中,都能拿到 r'^...../' 中的东西

前端解析

在html中

 {% url 'add'  1 %}                                               {% url  '反向解析的名字'  user_obj.id %} 注意:(推荐用)这里的数字,一般都是用户的Id 既是:user_obj.id      比如:<a href=''{% url  'add'  11 %}''>11</a>或者:{% url 'add' year= 1 %}   # 标准的写法

后端解析

在views.py中

from django.shortcuts import reverseurl=reverse('add',args=(1,)) # _url是变量,reverse('add') 表示的是r'^...../'中的东西。args=(12,) 接收的是数字(通常是数据的主键值),传给了(\d+)_url=reverse('add',args=(edit_id,))# 注意:(推荐用)这里的数字,一般都是用户的Id 或者:    _url= reverse('add',kwargs={'year':12}) # 标准的写法

路由分发 

        当django项目比较庞大的时候 路由与视图函数对应关系较多,总路由代码太多冗长。考虑到总路由代码不好维护,所以django支持每个app(应用)都可以有自己的urls.py

总路urls不再做路由与视图函数的对应关系 而仅仅只做一个分发任务的操作:

        根据请求的不同识别出当前请求需要访问的功能属于哪个app,然后自动下发到对应app里面的urls.py中 ,然后由app里面的urls.py做路由与视图函数的匹配

注意:

        不仅如此每个app除了可以有自己的urls.py之外 还可以有自己的static文件夹templates模板文件


应用场景:

        基于上面的特点,基于django分小组开发,会变得额外的简单。每个人只需要开发自己的app即可之后只需要创建一个空的django项目,再将多个人的app全部拷贝项目下,去配置文件注册,由总路由分发一次即可。

使用方法:需要导入一个分发的模块 :from django.conf.urls import include

总路由 

在urls.py文件中方法一、
from django.conf.urls import url,includefrom app01 import urls as app01_urls
from app02 import urls as app02_urlsurlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/',include(app01_urls)),
url(r'^app02/',include(app02_urls))
]方法二、简写from django.conf.urls import url,includeurlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls'))
]

子路由 

from django.conf.urls import url
from app01 import viewsurlpatterns = [url(r'^index/',views.index)]from django.conf.urls import url
from app02 import viewsurlpatterns = [url(r'^index/',views.index)]

虚拟环境 

虚拟环境就类似于一个纯净的python解释器环境就类似于你重新下载一个python解释器

我们想做到针对不同的项目 只安装项目所需要的功能模块,项目用不到的一概不装,来避免加载资源时的消耗

 如何创建虚拟环境

Django版本区别 

1. 路由文件
django1.x中使用的是url:支持正则
django2.x中使用的是path(不支持正则:精准匹配)和re_path(url):支持正则
path:但是它只支持五种转换器


Django默认支持以下5个转化器:

● str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
● int,匹配正整数,包含0。
● slug,匹配字母、数字以及横杠、下划线组成的字符串。
● uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
● path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

自定义转化器
2. 创建表关系
    django2中必须指定参数:on_delete:
    djanxo1中不用指定:级联更新级联删除

伪静态的概念(了解)

伪静态: 其实就是把动态页面改成像静态页面的样子


动态页面


    它不是在html页面中写死的,它是根据后端的数据变化而变化
    我们的页面上的数据是从数据库查询出来都是可以是动态页面
    
静态页面
    html
     css
案例
    https://www.cnblogs.com/bigsai/p/17827160.html # 这个就是伪装之后的页面


伪装成静态页面的目的


    为了更好的被各大搜索引擎抓大,静态页面是最容易被抓到的,有个别的网站就会做伪装,seo
    seo:优化关键词被容易搜索到
    sem: 广告(RMB)


怎么样去伪装  

  
    url(r'^v1/v2/test.html/$', views.test)

名称空间(了解)

# 第二种方式
url(r'^app01/', include('app01.urls', namespace='app01')),
url(r'^app02/', include('app02.urls', namespace='app02')),# 解析
res=reverse('app01:login', args=(11,22)) # /v1/v2/v3/home/1
res=reverse('app02:login', args=(11,22)) # /v1/v2/v3/home/1

END 


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

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

相关文章

【Verilog语法】

Verilog语法 1. Verilog语法1.1 拼接运算符1.2 运算符优先级1.3 注释1.4 关键字1.5 模块结构1.6 结构语句1.7 赋值语句1.8 条件语句1.9 状态机1.10 OSI七层模型 1. Verilog语法 1.1 拼接运算符 1.2 运算符优先级 1.3 注释 1.4 关键字 1.5 模块结构 1.6 结构语句 1.7 赋值语句 …

Java事务详解

一、事务的理解&#xff1a; 1、事务的特性&#xff1a; 1) 原子性&#xff08;atomicity&#xff09;&#xff1a;事务是数据库的逻辑工作单位&#xff0c;而且是必须是原子工作单位&#xff0c;对于其数据修改&#xff0c;要么全部执行&#xff0c;要么全部不执行。 2) 一致性…

同城小程序怎么运作 本地化生活小程序开发

同城小程序可以采取公域加私域的运营方式&#xff0c;进行运作。 在社交媒体平台上分享有趣的本地生活内容、社区动态&#xff0c;可以通过举办本地活动、合作推广等方式进行线下宣传&#xff0c;可以通过抖音本地化生活服务进行线下门店推广。 本地化生活小程序开发需要结合自…

22.构造一个关于员工信息的结构体数组,存储十个员工的信息

结构体问题。构造一个关于员工信息的结构体数组&#xff0c;存储十个员工的信息&#xff0c;包括员工工号&#xff0c;员工工资&#xff0c;员工所得税&#xff0c;员工实发工资。要求工号和工资由键盘输入&#xff0c;并计算出员工所得税&#xff08;所得税工资*0.2&#xff0…

Go的优雅退出

Go优雅退出/停机以前主要通过signal来实现&#xff0c;当然现在也是通过signal来实现&#xff0c;只是从go 1.16开始&#xff0c;新增了更加友好的API: func NotifyContext(parent context.Context, signals ...os.Signal) (ctx context.Context, stop context.CancelFunc) 该…

计算复杂性理论(一)图灵机

计算复杂性理论&#xff08;一&#xff09;图灵机 一台 k-带图灵机&#xff08;TM&#xff09;M 有 k-条带子。第一条带子称为输入带&#xff0c;用来存放输入数据&#xff0c;输入带是只读带。其余 k−1 条带子是工作带&#xff0c;既可以从工作带上读信息&#xff0c;也可以…

C# 并发编程

C# 并发编程 前言 对于现在很多编程语言来说&#xff0c;多线程已经得到了很好的支持&#xff0c; 以至于我们写多线程程序简单&#xff0c;但是一旦遇到并发产生的问题就会各种尝试。 因为不是明白为什么会产生并发问题&#xff0c;并发问题的根本原因是什么。 接下来就让…

Android Glide transform圆形图CircleCrop动态代码描边绘制外框线并rotateImage旋转,Kotlin

Android Glide transform圆形图CircleCrop动态代码描边绘制外框线并rotateImage旋转&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <FrameLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app&q…

优雅关闭TCP的函数shutdown效果展示

《TCP关闭的两种方法概述》里边理论基础&#xff0c;下边是列出代码&#xff0c;并且进行实验。 服务端代码graceserver.c的内容如下&#xff1a; #include "lib/common.h"static int count;static void sig_int(int signo) {printf("\nreceived %d datagrams\…

Jenkins简介及Docker Compose部署

Jenkins是一个开源的自动化服务器&#xff0c;用于自动化构建、测试和部署软件项目。它提供了丰富的插件生态系统&#xff0c;支持各种编程语言和工具&#xff0c;使得软件开发流程更加高效和可靠。在本文中&#xff0c;我们将介绍Jenkins的基本概念&#xff0c;并展示如何使用…

Vue3 源码解读系列(三)——组件渲染

组件渲染 vnode 本质是用来描述 DOM 的 JavaScript 对象&#xff0c;它在 Vue 中可以描述不同类型的节点&#xff0c;比如&#xff1a;普通元素节点、组件节点等。 vnode 的优点&#xff1a; 抽象&#xff1a;引入 vnode&#xff0c;可以把渲染过程抽象化&#xff0c;从而使得组…

区块链拆分

随着区块链技术的发展和普及&#xff0c;去中心化钱包逐渐成为数字货币领域的重要工具。去中心化钱包不仅具有高度安全性和隐私保护能力&#xff0c;还可以通过智能合约和开源技术实现定制化功能。本文将探讨去中心化钱包定制开发的基本概念、优势、流程和前景。 一、去中心化钱…