首页 > 其他分享 >路由层

路由层

时间:2023-08-01 17:33:35浏览次数:32  
标签:匹配 views url test path 路由

url函数的使用(支持正则表达式)

Django1中使用的是url:

  url('test',views.test)

  url函数第一个参数是支持正则表达式的,如果匹配到一个路由就不再往下匹配,直接执行相对应的函数。

 正是因为支持正则,在匹配到testadd也会展示text的页面,因为在检测到test的时候就直接进入test对应的页面了

 当在后面加一个“/”时,在浏览器中输入test时,Django内部做重定向,一次匹配不行,url会自动加“/”,来再次进行匹配。

 

http://127.0.0.1:8000/test/

是django默认设置的,django会先拿着test去匹配,如果匹配不到,它会自动加一个斜杠再次去匹配

如何取消斜杠:

  在settings文件中,有:APPEND_SLASH =True,默认是True,也就是加/,True改为False即可取消/

以下方式是严格限制路由匹配,但是$有时候加,有时候不加:

 django2中使用的是path

path('test/', admin.site.urls)

path是不支持正则的,是精准匹配,输入的内容和路由地址是完全匹配。

re_path('^test/$', admin.site.urls)

此时的re_path是支持正则表达式的。

无名分组和有名分组

分组:给某一段正则表达式用小括号括起来

无名分组:

  就是将括号内正则表达式匹配的内容当作位置参数传递给后面的视图函数。

比如:

报错的原因:视图函数中少了一个参数来接受后面的数字

 

# 这是路由
url('^test/(\d+)', views.test)
# 这是视图
def test(request, xx):
    print(xx) # 123
    return HttpResponse("test")
url('^test/(\d+)/(\d+)$', views.test),
def test(request, xx, yy):
    print(xx, yy) # 123
    return HttpResponse("test")

有名分组:可以给正则表达式起一个别名

  就是将括号内正则表达式匹配的内容当作关键字参数传递给后面的视图函数。

例如:

url(r'^test/(?P<year>\d+)$', views.test), # 这是路由
def test(request, year): #这是视图函数
    print(year) # 2023
    return HttpResponse("test")

结果:

 

有名函数和无名函数是否可以一起使用

不要一起使用

但是有名无名单独可以使用多次

 无名函数使用多次,位置参数,args:

上面是视图,下面是路由

url(r'^test/(\d+)/(\d+)/(\d+)/(\d+)/', views.test),

def test(request,*args,**kwargs):
    print(args) 
    return HttpResponse("test")

 有名函数多次使用,关键字参数,kwargs:

url(r'^test/(?P<year>\d+)/(?P<month>\d+)/(?P<day>\d+)/$', views.test),

def test(request,*args,**kwargs):
    print(kwargs)
    return HttpResponse("test")

 

# django2中的用法:

re_path('^test/(\d+)/(\d+)/(\d+)/(\d+)/(\d+)/(\d+)/(\d+)$', views.test),
re_path('^testadd/(?P<year>\d+)/(?P<month>\d+)/(?P<month>\d+)/(?P<month>\d+)$', views.testadd)

反向解析

反向解析:

  可以给路由起一个名字,然后通过一个方法可以解析出这个名字对应的路由地址

先给路由和视图起一个别名:

url(r'^func_hhh/',views.func,name='123')
def func(request):
    return render(request,'func.html')

反向解析的两中方式:

后端反向解析:在views文件中导入reverse

print(reverse('123'))

前端反向解析

<a href="{% url '123' %}">123</a>

无名分组反向解析

写代码时应该在这里放的数字一般是数据的主键值

路由和视图写别名

前端解析

<a href="{% url 'test' 111 %}">点我</a>

后端解析:

print(reverse('test', args=(123, )))

有名分组的反向解析

前端解析:

中规中矩的写法:

<a href="{% url 'testadd' year=2023%}">点我</a>


print(reverse('testadd',kwargs={'year':2023, 'month':12}))

简便写法是和无名分组一样的书写方式

django2中的path函数支持的5种转换器

path('test/', admin.site.urls)
Django默认支持以下5个转化器:

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

urlpatterns = [  
    path('articles/2003/', views.special_case_2003),  
    path('articles/<int:year>/', views.year_archive),  
    path('articles/<int:year>/<int:month>/', views.month_archive),  
    path('articles/<int:year>/<int:month>/<slug>/', views.article_detail),  
  # path才支持,re_path不支持
  path('order/<int:year>',views.order),
]

路由分发

django的每一个应用都可以有自己的template文件夹urls.py

但是当路由多的时候,这个文件就会产生很多的路由地址,产生的问题就是理由比较臃肿,不太容易管理,也不容易排查错误。

我们针对每一个应用也可以有自己的路由文件,每一个应用下的路由我们称之为子路由。

因为每一个应用下没有urls.py这个文件,我们需要自己手动创建一个文件出来。

这个时候产生很多路由文件,匹配的时候先匹配总路由,然后由总路由分发到每个子路由这个时候总路由的作用就是分发了,总路就不再执行具体的视图函数,而是交给子路由。

创建一个新的应用:

注意:总路由的url千万不能加$符号

总路由方法一:

总路由:

  记住要导入模块,并且要重新命名

注意:总路由的url千万不能加$符号

总路由方法一:

 总路由:记住要导入模块,并且要重新命名

 

 总路由方法2: 

 方法2:用 .方法

 子路由:

 名称空间(别名冲突问题)

当多个应用出现了相同的别名,我们研究反向解析会不会自动识别应用前缀

正常情况下的反向解析是没有办法识别前缀的

总路由:

urlpatterns = [
   url(r'^app01/',include('app01.urls',namespace='app01')),
   url(r'^app02/',include('app02.urls',namespace='app02')),
]

子路由:

 解析时:

print(reverse('app01:ref'))
print(reverse('app02:ref'))
{% url 'app01:ref' %}
{% url 'app02:ref' %}

伪静态概念

静态文件 .html

http://127.0.0.1:8000/app01/index
https://www.cnblogs.com/fanshaoO/p/17592993.html # 其实就是伪静态之后的地址

 

伪静态的原因就是为了让搜索引擎增大seo的查询力度,言外之意就是让我们的页面能够更容易被搜索引擎搜索出来。

搜索引擎就是一个巨大的爬虫。

静态页面更加容易被搜索引擎抓到,称之为seo

seo就是优化产品使其更容易被找到

SEO---------------------->一般是通过技术手段等实现
SEM---------------------->它是需要收费的,其实就是广告

 虚拟环境

一般我们开发项目是一个单独的项目,使用一个单独的解释器环境

举例:

开发一个CRM系统:3.6

开发一个OA系统:3.7
开发一个商城系统:3.6

 

不是每个项目都使用一个解释器,每个项目单独使用一个解释器版本,这个解释器只安装这个项目使用到的模块

每开发一个项目就下载一个解释器,可以解决问题,但是没必要,可以通过蓄奴环境来解决这个问题,虚拟环境其实就是一个纯净版本的解释器,你不用每次都下载和安装

# 它就是一个文件夹形式存在的解释器

# 虚拟环境尽量不要创建,创建出来够你的项目使用就行了

# 虚拟环境还可以通过命令创建

 

标签:匹配,views,url,test,path,路由
From: https://www.cnblogs.com/Lucky-Hua/p/17596703.html

相关文章

  • 将解锁Wi-Fi 7满血 五千元内最强:小米万兆路由史低1499元
    想买高端路由器的了就别看Wi-Fi6了,国内推Wi-Fi7也不远了,小米推出的小米万兆路由不仅号称5000元内最强,而且官方承诺OTA升级支持Wi-Fi7,到时候就是满血状态了。小米万兆路由首发报价1799元,此前可以做到1599元,现在聚划算百亿补贴可以做到1499元,史低价了,推荐入手。参与方法就是在......
  • Vue进阶(幺叁捌):vue 路由传参的几种基本方式
    (文章目录)一、动态路由(页面刷新数据不丢失)methods:{insurance(id){//直接调用$router.push实现携带参数的跳转this.$router.push({path:`/particulars/${id}`,})}路由配置{path:'/particulars/:id',name:'particulars',......
  • 登录认证装饰器,flask配置文件,路由系统
    0登录认证装饰器#0装饰器的本质原理 -#类装饰器:1装饰类的装饰器2类作为装饰器#1装饰器使用位置,顺序#3flask路由下加装饰器,一定要加endpoint -如果不指定endpoint,反向解析的名字都是函数名,不加装饰器没有问题,就是正常函数index,detail-如果加了装饰器---》in......
  • 前端路由+原生JS实现SPA
    前端路由●路由:就是一一对应关系的集合●前端路由:就是一个url地址,对应哪个组件(页面)●前端路由的本质○根据地址栏变化(不重新想服务器发送请求),去局部更新不同的页面内容,完成前端业务场景切换●前端路由的思路○URL地址栏中的Hash值发生了变化○前端JS监听到H......
  • react路由6登录拦截
    自定义登录拦截组件://路由守卫//判断token是否存在,如果存在跳转页面,不存在返回登录页面import{Navigate}from'react-router-dom'constgetToken=()=>{returnsessionStorage.getItem("token")}functionAuthRouter({children}){//获取token......
  • react使用自定义animation实现水平效果的路由切换
    例如:A组件跳B组件 A组件:importReactfrom'react';import'./A.scss'import{useNavigate}from'react-router-dom';exportdefaultfunctionA(){letnavigate=useNavigate()return(<divonClick={()=>{l......
  • vue中使用provide和inject依赖注入组件之间进行父子组件传值(也适用于嵌套路由)
      父组件中:provide:function(){return{reload:this.reload//父组件中的方法}}子组件中:inject:['reload']使用:this.reload()//也可传入参数......
  • 路由工具
    ACL列表ACL访问控制列表,即用于流量的匹配与控制,但也能够用于匹配路由条目。前缀列表与AC的区别1)ACL无法匹配路由掩码2)ACL无法匹配精确的路由如:存在两个路由192.168.1.0/24,192.168.1.0/16如果用ACL只匹配192.168.1.0/16的话应该这么写:[AR1]acl2000[AR1-acl-basic-2000]rulepermit......
  • URL函数的使用(支持正则表达式)、分组、反向解析、Django2的转换器、路由分发、伪静态的
    url('test',views.test),url函数的第一个参数是支持正则表达式的如果匹配到一个路由,就不在往下匹配,直接执行路由对应的视图函数 http://127.0.0.1:8000/test/是django默认设置的,django会先拿着test去匹配,如果匹配不到,它会自动加一个斜杠再次去匹配 去浏览器器搜索textadd只......
  • Cilium系列-9-主机路由切换为基于 BPF 的模式
    系列文章Cilium系列文章前言将Kubernetes的CNI从其他组件切换为Cilium,已经可以有效地提升网络的性能.但是通过对Cilium不同模式的切换/功能的启用,可以进一步提升Cilium的网络性能.具体调优项包括不限于:启用本地路由(NativeRouting)完全替换KubeProxyI......