一、简单配置

1.参数

第一个参数是正则表达式(如果要精准匹配:‘^publish/$’),或者加斜杠('^publish/')

第二个参数是视图函数(不要加括号)

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^publish/', views.publish),
    url(r'^publishadd', views.publishadd),
]

这样的话,publish和publishadd就会分别对应到不同的函数,不会出乱子了

2.有名无名分组

注意有名分组和无名分组不要混用,无名分组必须要按位置传参

分组都要用括号括起来

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^publish/[0-9]{4}/$', views.publish),#匹配四位数字
    url(r'^publish/(?P<year>[0-9]{4})/(?P<month>[0-9]{4}/)', views.add),#有名分组,会进行传参,add函数里,形参变量必须是year,month
    url(r'^add/\d+/$',views.add),#匹配任意长度的数字
    url(r'^flash/([0-9]{4})/([0-9{2}])',views.flash)#进行分组,这是无名分组,分组后会按位置进行传参,传到视图函数views.flash里
]

3.反向解析

先在路由层urls命一个名

  1)无参数:url(r"^/publish/",views.publish,name='ddd')

  2)无名分组:url(r“^publishadd/([0-9]{4})/([0-9]{2})”,views.publish,name='ddd')

  3)有名分组:url(r'^publishadd/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})',views.publish,name='ddd')

  补充:在url写了name支持反向解析的,都是可以被redict的网站。

在模板层:

  1)无参数:{% url 'ddd' %}

  2)无名分组:{% url 'ddd' 2018 12 %}  在ddd后面直接传参

  3)有名分组:方式1:{% url ‘ddd’ 2018 12 %}按位置传参也可以

          方式2:{% url ‘ddd’ year=2018 month=12 %}

在视图层:

  from django.shortcuts import reverse

  在视图函数里:

  1)无参数:url=reverse(‘ddd’)

  2)无名分组:url=reverse('ddd',args=(2018,12))

  3)有名分组:url=reverse('ddd',args=(2018,12))还可以

          url=reverse('ddd',kwargs={'year':2018,'month':12})

注意:在视图层,反向解析后使用redict(url),而不是使用render。render后面接具体的html地址。

分组时,视图层的函数不要用*args和**kwargs去接收参数,因为分组一般不会太多,不建议使用这种方式

4.路由分发

随着项目越写越大,会创建出多个app,app下面会有urls,这时对路由进行分发,可以细分管理好项目。在每个app下创建urls.py文件

步骤:

  1)在总路由写相关配置

  from django.conf.urls import include

  url(r'^blog/',include('blog.urls'))

  url(r'^app01/',include('app01.urls'))

  2)在不同的app的urls里配置路由关系

  ****重点****总路由,不能加结束符$

5.名称空间

反向解析时,如果在不同app,例如app01里,设置了name='ddd',然后又在app02里,设置了name='ddd',这样反向解析时可能会出问题,因此牵扯到了名称空间。

这样,在总路由设置时,可以设置:

  url(r'^app01/',include('app01.urls',namespace='app01')),

  url(r'^app02/',include('app02.urls',namespace='app02'))

在设置了名称空间以后,在路由层views写方向解析时,要这么写

  url=reverse(‘app01:test’)

在模板层写反向解析:

  {% url ‘app01:test’ year=2018 month=12 %}

但是实际上名称空间一般不怎么用,有更好的方法。不同的app,在总路由的反向解析可以设置不同的名字

  url(r'^publish',views.publish,name='app01_test')这样直接设置不同的名字

6.伪静态

  路由:url(r'^book/(?P<id>\d+.html)',views.book)

  访问:http://127.0.0.1:8000/book/4.html

把动态的页面伪装成静态,方便搜索引擎收录,实际上数据可能是来自数据库,只是伪装成了静态。

7.配置error

当所有网址都匹配不上时,设置一个优雅404界面

url('',views.error)表示所有的都匹配到视图层的error函数

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^app02/', include('app02.urls',namespace='app02')),
    url(r'^login/', views.login),
    url(r'', views.errors),
]

注意,优雅404的路由写在最下层。因为路由的匹配规则是从上往下进行匹配。

8.静态和伪静态

动态网址伪装成静态网址,方便搜索引擎收录,要在url里进行配置

url(r'^book/(?P<id>\d+.html)',views.book)

这时访问网址时就可以输入http://127.0.0.1:8000/5.html

表面上看上去是静态网址,实际上是进行了路由匹配,网址还是动态的,这样就简单的做到了伪静态的效果。

实际上的伪静态技术要更为复杂

orm之路由层的更多相关文章

  1. (day51)三、ORM、路由层、版本差异、流程图

    目录 一.ORM关系建立 (一)ForeignKey(一对多) (二)ManyToManyField(多对多) (三)OneToOneField(一对一) 二.django请求生命周期流程图 三.ur ...

  2. django之表设计、路由层等

    图书管理系统表的设计 from django.db import models # Create your models here. class Book(models.Model): title = ...

  3. Django --- 路由层(urls)

    目录 1.orm表关系如何建立 2.django请求生命周期流程图 3.urls.py路由层 4.路由匹配 5.无名分组 6.有名分组 7.反向解析 8.路由分发 9.名称空间 10.伪静态 11.虚 ...

  4. django之路由层(反向解析)总结

    表关系的建立方式 表与表之间的关系就三种 一对一 OneToOne(to='') # to后面可以跟字符串的表名 也可以直接跟变量名表名(该表名必须在上面提前定义出来) 一对多 ForeignKey( ...

  5. django 路由层(反向解析)03

    目录 ORM表关系建立 Django请求生命周期流程图 urls.py 路由层 无名分组 有名分组 反向解析 无名分组的反向解析 有名分组的反向解析 以编辑功能为例 路由分发 名称空间 伪静态 虚拟环 ...

  6. Django之深入了解路由层

    目录 ORM表关系建立 一对一 一对多 多对多 Django 请求生命周期 url 路由层 路由匹配 无名分组 有名分组 反向解析 路由匹配条件无分组的情况的反向解析 无名分组情况的反向解析 有名分组 ...

  7. Django路由层与视图层

    表与表之间建关系 图书管理系统为例 书籍表 出版社表 作者表 三个表之间的关系: 考虑表之间的关系:换位思考 1.书籍和出版社是一对多,外键字段建立在书籍表中 2.书籍和作者是多对多, 需要建立第三方 ...

  8. Django学习之路由层

    Django请求生命周期 - wsgi, 他就是socket服务端,用于接收用户请求并将请求进行初次封装,然后将请求交给web框架(Flask.Django) - 中间件,帮助我们对请求进行校验或在请 ...

  9. Django 路由层(urlconf)

    Django 的路由层(URLconf) URL配置(conf)就像是Django所支撑的网站的目录; 本质就是:URL与调用该URL执行的视图函数的映射表; 通俗的讲:就是用户使用哪个url,URL ...

随机推荐

  1. iOS - UITextView实现placeHolder占位文字

      iOS之UITextView实现placeHolder占位文字的N种方法 前言 iOS开发中,UITextField和UITextView是最常用的文本接受类和文本展示类的控件.UITextFie ...

  2. iOS - 转场动画

    苹果在 iOS7 定制了 ViewController 的切换效果 一 在iOS5和iOS6之前,ViewController的切换主要有4种 Push/Pop,NavigationViewCotnr ...

  3. MDU某产品OMCI模块代码质量现状分析

    说明 本文参考MDU系列某产品OMCI模块现有代码,提取若干实例以说明目前的代码质量,亦可作为甄别不良代码的参考. 本文旨在就事论事,而非否定前人(没有前人的努力也难有后人的进步).希望以史为鉴,不破 ...

  4. Objective-c官方文档 怎么使用对象

    版权声明:原创作品,谢绝转载!否则将追究法律责任.   对象发送和接受消息 尽管有不同的方法来发送消息在对象之间,到目前位置是想中括号那样[obj doSomeThing]:左边是接受消息的接收器,右 ...

  5. AD采样模块采集带模拟量真空表值的实验

    实验采用带模拟量,分辨率为1-5V,量程为0--101kpa的真空表 数据采集模块采用DAM-8021,  16位模块 算法描述如下: 真空表读数范围: 0到-101kpa 模拟量输出: 1-5V 一 ...

  6. 题目1010:A + B(字符串转数字)

    题目链接:http://ac.jobdu.com/problem.php?pid=1010 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...

  7. mysql innodb存储引擎优化

    innodb_data_home_dir 这是InnoDB表的目录共用设置.如果没有在 my.cnf 进行设置,InnoDB 将使用mysql的datadir目录为缺省目录.如果设定一个空字串,可以i ...

  8. 惠普hp服务器通过iLO接口远程安装操作系统

    我们以hp proliant sl210t的机器为例,我们在配置好iLO接口的远程管理后,我们便可以通过iLO进行操作系统的安装 关于惠普服务器的iLO配置,可参笔者的另一篇文章<关于hp pr ...

  9. Instrumentation 两种方法 premain Agent

    由于jvm内部的限制Instrumentation 只能修改方法体 不能动态添加删除方法(安全第一吧!!!!) Premain 对于使用命令行接口的实现,可以将以下选项添加到命令行来启动代理: -ja ...

  10. python转化字符串形式的json

    在使用python对字符串形式的json进行 json.loads() 的操作时,遇到了:JSONDecodeError: Invalid \escape,提示\无法excape,可以通过以下方式将字 ...