一、简单配置

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. Spring系列之访问数据库

    一.概述 Spring的数据访问层是以统一的数据访问异常层体系为核心,结合JDBC API的最佳实践和统一集成各种ORM方案,完成Java平台的数据访问. 二.JDBC API的最佳实践 Spring ...

  2. 多了解一下Chrome开发者控制台

    多了解一下Chrome开发者控制台 2017年10月14日 • Tools, Web前端 • 1.0k views • 暂无评论 作为一名前端开发者,Chrome内置的控制台是必须了解的,它拥有非常丰 ...

  3. thinkphp5.0 输入变量

    可以通过Request对象完成全局输入变量的检测.获取和安全过滤,支持包括$_GET.$_POST.$_REQUEST.$_SERVER.$_SESSION.$_COOKIE.$_ENV等系统变量,以 ...

  4. JS案例 - 可自动伸缩高度的textarea文本框

    文本框的默认现象: textarea如果设置cols和rows来规定textarea的尺寸,那么textarea的默认宽高是这俩属性设置的值,可以通过鼠标拖拽缩放文本框的尺寸. textarea如果设 ...

  5. UE和UI的区别

    UI:User Interface的缩写,是指用户界面,最普遍的应用是在软件开发中,主要是指程序的用户操作界面的设计,随着Web应用的普及,UI也应用在了Web的用户界面规划上了.网站用户界面(Web ...

  6. 题目1439:Least Common Multiple(求m个正数的最小公倍数lcm)

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

  7. 基本类型算法题目学习(EPI)

    1.关于奇偶校验的方法中,如何快速的求取一个64-bit的数字的奇偶校验位.(如果1的位数为奇数,则奇偶校验位为1,如果1的位数为偶数,则奇偶校验位为0) a.暴力枚举法采用一位一位进行计算,一位一位 ...

  8. CentOS 配置Rails开发环境

    1 安装mysql yum install -y mysql mysql-server 启动mysql $ /etc/init.d/mysqld start 设置root密码,删除test数据库等 / ...

  9. ELK到底是什么?那么多公司用!

    Sina.饿了么.携程.华为.美团.freewheel.畅捷通 .新浪微博.大讲台.魅族.IBM...... 这些公司都在使用ELK!ELK!ELK! ELK竟然重复了三遍,是个什么?   一.ELK ...

  10. dhroid - Perference

    SharedPreferences 是我们开发android使用很多的工具通常我们是这样使用的 SharedPreferences share=getSharedPreferences("n ...