1.django的url到底是什么

  就是路径 ,看成django的目录 ,每个目录对应个视图函数 ,当然一个url仅能对应一个函数

2.url的格式

  url(正则表达式,views函数名,参数,别名)

  这里的正则表达式有个问题就是可能会匹配到多个路径 ,匹配的方式是从上到下匹配即停 ,所以正则一定要严谨防止截胡

  斜线' / '末尾加上会好很多,开头不用加

#urls.py
from app01 import views #加载应用的地址函数模块
from app02 import views as app02views  #这里一个问题就是不同应用的同名文件可以使用as来取别名
urlpatterns = [
url(r'^admin/$', admin.site.urls),
url(r'^admin/add/', admin.site.urls),
url(r'^admin/del/', admin.site.urls),
url(正则表达式,views函数,参数,别名),
]

3.路由分发

  场景: 当app过多所有的url都写在项目目录下的urls.py肯定是不行 ,所以要在每个app下都创建一个urls.py分发到各个app下即可 ,使用的是include函数做路由分发

#/项目目录下/urls.py
from django.conf.urls import url,include
from django.contrib import admin
from app1 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^app1/', include('app1.urls')),
] #/app1/urls.py
from django.conf.urls import url
from app1 import views urlpatterns = [
url(r'^press/list', views.presslist),
url(r'^press/del', views.pressdel),
url(r'^press/add', views.pressadd),
url(r'^press/edit/', views.pressedit),
]

4.分组与命名分组

  分组是在做什么? 我们传参可以使用get中的url携带参数 ,我们还能用分组直接获得参数传给视图函数 ,方便了不少呢

  1).分组(肯定是正则的分组, 一组一个参数 ,参数仅仅能传递str类型)

#urls.py中

  url(r'^press/del/(\d+)/', views.pressdel),    #使用正则匹配一个分组

#views.py中
    def pressdel(request, del_id):           #接收url中的位置参数
models.presslist.objects.get(pk=del_id).delete()
return redirect('/app1/press/list')
#html中
   <a>href="/app1/press/del/{{ obj.pk }}/"><i class="fa fa-remove" aria-hidden="true"></i></a>    #点击时可以触发url

  2).命名分组 ,和分组的区别就是使用的是关键字参数 ,可以不考虑顺序传递参数了

#urls.py中

  url(r'^press/del/?P<del_id>(\d+)/', views.pressdel),    #使用正则匹配一个分组

#views.py中
def pressdel(request, del_id):           #接收url中的位置参数
models.presslist.objects.get(pk=del_id).delete()
return redirect('/app1/press/list')
#html中
  <a>href="/app1/press/del/{{ obj.pk }}/"><i class="fa fa-remove" aria-hidden="true"></i></a>    #点击时可以触发url

  3).命名分组之默认值分组 ,默认值分组的意义是什么? 访问不带参数时的默认值 ,如下面的情况

#urls.py文件
url(r'^blog/page/$', views.blog),      #访问首页没有参数的时候 ,视图函数中num=9999
url(r'^blog/page/(?P<num>[0-9]{1,2})', views.blog),  #访问带页码的参数时 ,视图函数会使用分组中的num值
#views.py
def blog(request,num=''):

5.路由的别名

  场景: 重新规划了一下urls中的正则匹配地址 ,此时视图函数与模板中写死的跳转就都变了 ,那么改动实在太多了 ,使用路由别名! 每个url的正则无论如何变化 ,他的别名都不会变化

  1).静态别名 ,就是url中没有携带参数(反向解析就是仅关注别名 ,别名后面如何不用管这就是反向解析)

    视图函数中使用reverse()函数解析 ,模板中使用{% url '别名' %}解析

# urls.py文件
url(r'^halias/$', views.halias, name='hs'),
url(r'^ralias/$', views.ralias, name='rs'), # views.py文件的redirect
def halias(request):
return render(request, 'test.html') def ralias(request):
return redirect(reverse('rs')) # html文件
< a href = "{% url 'hs' %}" > 刷新操作 < / a >

  2).动态别名 ,就是url中夹带了参数 ,反向解析的时候有点不同 ,其中分为参数为位置参数或者是关键字参数

####位置参数解析
#urls.py文件
url(r'^halias/([0-9]{1,2})/(..)/$', views.halias,name='hs'), #在views.py文件redirect(reverse)
def halias(request,c1,c2):
if c1 == '':
return redirect(reverse('hs',args=('','op')))
return render(request,'test.html',{'c1':c1,'c2':c2}) #在html文件
<a href="{% url 'hs' '12' '12' %}">刷新操作</a>
####关键字参数解析
#urls.py文件
url(r'^halias/([0-9]{1,2})/(..)/$', views.halias,name='hs'), #在views.py文件redirect(reverse)
def halias(request,c1,c2):
if c1 == '1':
return redirect(reverse('hs',kwargs={c1:'34',c2:'op'}))
return render(request,'test.html',{'c1':c1,'c2':c2}) #在html文件
<a href="{% url 'hs' c1='12' c2='12' %}">刷新操作</a>

6.路由命名空间

  场景: 反向解析虽然好用, 但是如果多个app下出现了重名的解析name模板与视图中怎么办?到底解析哪一个? 使用命名空间 ,在跟urls.py的文件中设定命名空间

#project/urls.py文件
urlpatterns = [
url(r'^app01/', include('app01.urls',namespace='ap1')),
url(r'^app02/', include('app02.urls',namespace='ap2')),
]
#html文件引入别名改动
<p>
<a href="{% url 'ap1:ns' 参数1 参数2... %}">命名空间测试刷新当前页</a>
</p>
#views.py重定向使用别名时
....
return redirect(reverse('ap1:cbs',arg...))
...

7.url相关规范

  1)路由要在跟路由处完成分发 ,避免路由表过大

  2)路由分发时标注命名空间 ,防止不同app下有重名路由

  3)每个app下每条路由都要有别名 ,防止url变化引起大规模改动

django3-路由系统进阶的更多相关文章

  1. Django进阶(路由系统、中间件、缓存、Cookie和Session、Ajax发送数据

    路由系统 1.每个路由规则对应一个view中的函数 url(r'^index/(\d*)', views.index), url(r'^manage/(?P<name>\w*)/(?P&l ...

  2. day19 Dgango进阶 路由系统及 ORM 详解

    完成一个完整的网页服务,需要有以下: 再次回顾一下Django 的完成开发流程: 一些值的获取: 对于性别,为互斥属性: 爱好则为多选: 需要使用新的方法 getlist 来获取多个爱好: 单选下拉框 ...

  3. 简简单单的Vue3(插件开发,路由系统,状态管理)

    既然选择了远方,便只顾风雨兼程 __ HANS许 系列:零基础搭建前后端分离项目 系列:零基础搭建前后端分离项目 插件 路由(vue-router) 状态管理模式(Vuex) 那在上篇文章,我们讲了, ...

  4. python 全栈开发,Day112(内容回顾,单例模式,路由系统,stark组件)

    一.内容回顾 类可否作为字典的key 初级 举例: class Foo(object): pass _registry = { Foo:123 } print(_registry) 执行输出: {&l ...

  5. django框架--路由系统

    目录 一.路由系统理解 二.路由系统功能划分 三.路由表创建 创建工具 二级路由 路由别名 动态路由及重定向 四.自定义错误页面 五.图示路由系统在框架中的定位 六.路由系统的进阶想法 一.路由系统理 ...

  6. django基础篇02-url路由系统

    django的路由系统: 一.基本用法: 1.path('index', views.index), # 通过类的方式创建url映射 2.path('home', views.Home.as_view ...

  7. ASP.NET Core的路由[2]:路由系统的核心对象——Router

    ASP.NET Core应用中的路由机制实现在RouterMiddleware中间件中,它的目的在于通过路由解析为请求找到一个匹配的处理器,同时将请求携带的数据以路由参数的形式解析出来供后续请求处理流 ...

  8. ASP.NET Web API路由系统:路由系统的几个核心类型

    虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...

  9. ASP.NET Web API路由系统:Web Host下的URL路由

    ASP.NET Web API提供了一个独立于执行环境的抽象化的HTTP请求处理管道,而ASP.NET Web API自身的路由系统也不依赖于ASP.NET路由系统,所以它可以采用不同的寄宿方式运行于 ...

  10. .NET/ASP.NET Routing路由(深入解析路由系统架构原理)

    阅读目录: 1.开篇介绍 2.ASP.NET Routing 路由对象模型的位置 3.ASP.NET Routing 路由对象模型的入口 4.ASP.NET Routing 路由对象模型的内部结构 4 ...

随机推荐

  1. 你可能会忽略的 Git 提交规范

    一.为什么需要规范? 无规矩不成方圆,编程也一样. 如果你有一个项目,从始至终都是自己写,那么你想怎么写都可以,没有人可以干预你.可是如果在团队协作中,大家都张扬个性,那么代码将会是一团糟,好好的项目 ...

  2. ASP.NET Server对象

    Server.HtmlEncode() 执行文本代码Server.HtmlDecode()可以将代码显示 而不是执行它 但是ASP.NET会认为恶意 我们可以将aspx代码开头添加validateRe ...

  3. Mybatis+Spring框架整合

    1.整合思路 1.SqlSessionFactory对象应该放到spring容器中作为单例存在. 2.传统dao的开发方式中,应该从spring容器中获得sqlsession对象. 3.Mapper代 ...

  4. 【Gradle】Android Gradle 插件

    Android Gradle 插件 Android Gradle 插件简介 从Gradle角度来看,Android其实是Gradle的一个第三方插件,它是由Google的Android团队开发的.但从 ...

  5. 微信小程序——表单验证插件WxValidate的二次封装(二)

    在上一篇博客<微信小程序——仿jqueryValidate表单验证插件WxValidate的二次封装>中,我将WxValidate做了再次封装,简化了初始规则数据的构造,但是当有错误时页面 ...

  6. 【三】Gradle中的Task

    gradle中,最经常被使用的,一个task,一个是dependencies 1.Task声明 task默认是DefaultTask类, Task中有两个属性 group description,最佳 ...

  7. Fundebug前端异常监控插件更新至2.0.0,全面支持TypeScript

    摘要: 是时候支持TS了! Fundebug前端异常监控服务 Fundebug提供专业的前端异常监控服务,我们的插件可以提供全方位的异常监控,可以帮助开发者第一时间定位各种前端异常,包括但不限于Jav ...

  8. 团队项目-Alpha版本发布2

    这个作业属于哪个课程 课程的链接 这个作业的要求在哪里 作业要求的链接 团队名称 西柚三剑客 这个作业的目标 -Alpha2版本发布说明,给出测试报告,并进行总结 1. 团队成员的学号列表 团队成员 ...

  9. 5. IDEA使用

    一.IDEA项目结构 二.创建项目 三.快捷键 Alt + Enter // 导包,自动修正代码 ctrl + Y // 删除光标所在行 ctrl + D // 复制光标所在行,插在光标位置下面 ct ...

  10. CSS中层叠和继承的概念。

    继承 CSS的某些样式是具有继承性的,那么什么是继承呢?继承是一种规则,它允许样式不仅应用于某个特定html标签元素,而且应用于其后代.比如下面代码: 1 2 3 4 5 6 7 8 9 <ht ...