路由的格式:

#路由配置的格式:
urls.py里面写 from diango.conf.urls import url urlpatterns = [
url(正则表达式,views视图函数,name) ]

一:无名分组

路由urls.py的配置

from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls), #没有参数
#\d+ 后面可以匹配一个或无穷个数字的访问格式:例如http://127.0.0.1:8000/test2/12345
url(r'^test2/\d+$', views.test2), #一个分组:(\d+),对应视图层就要1个参数接收对应分组
#(\d+) 也是匹配后面一个或无穷个数字的访问格式(但是括号本身还是一个参数,对应视图里面的视图函数要接收这个参数)
url(r'^test3/(\d+)', views.test3), #视图函数里面就可以直接拿到这个后面输入的参数值 #3个分组:([0-9]{4})..,对应视图层就要3个参数接收对应分组
url(r'^test4/([0-9]{4})/([0-9]{2})/([0-9]{1})/$', views.test4), # 加括号就可以拿到浏览器中输入的值 ]

相对上面路由,views.py视图里面的配置

from django.shortcuts import render,HttpResponse

# Create your views here.
def test1(request):
return HttpResponse('test1') #不需要传入参数
def test2(request):
return HttpResponse('test2') #需要传入1个参数
def test3(request,num):
print(num)
return HttpResponse('test3'+num) #需要传入3个参数
def test4(request,y,m,d):
print(y,m,d)
return HttpResponse('对于路由传入多个参数的响应: %s年 %s月 %s日'%(y,m,d))

注意的点就是:

  1.第一个参数,可以写一个正则表达式

  2.urls.py里面有多个路由条目,一旦匹配成功就不往下走了

  3.如果路由url里面分了几个组,响应的views视图函数里面就应该有几个参数来接收

  4.在settings里设置:APPEND_SLASH=False,请求时,浏览器不会自动补全斜杠,这样当你浏览器输入时后面没有加斜杠(与你url路由里面的不符就会报错)

settings.py里面关于APPEND_SLASH=False的说明

from django.conf.urls import url
from app01 import views urlpatterns = [
url(r'^blog/$', views.blog),
] 访问 http://www.example.com/blog 时,默认将网址自动转换为 http://www.example/com/blog/ 如果在settings.py中设置了 APPEND_SLASH=False,此时我们如果输入后面没有加斜杠http://www.example.com/blog 时就会匹配失败,提示找不到页面。

二:伪静态页面

有些.html结尾的网页大多数都是伪静态页面,就是为了百度seo收录(如果变动的百度的收录会特别低,百度数据库里面很难收录你的信息,收录权限比较低,为了让百度提高收录权限)

例如:其实后面的数字就是你访问某个网站具体资源对应的id

正常对应的动态访问地址: (这里是指举例,可能对应的字段名不一定是id)

静态网页与动态网页之间的转换简单实现:

#静态网页
url(r'^test5/(\d+).html', views.test5)

三:有名分组

 #有名分组:路由设置
url(r'^test6/(?P<year>[0-9]{4})/(?P<month>[0-9]{2}/(?P<day>[0-9]{1}))', views.test6), #视图设置:views.py
def test6(request,year,month,day,):
print(year,type(year))
print(month)
print(day)
return HttpResponse('有名分组,接收年月日三个参数')

有名分组注意点:

1.名字必须一致,否则报错,位置可以颠倒,如果分了两个组,必须用两个参数连接

2.有名分组和无名分组不要混用

3.有名分组可以用**kwargs接收,无名分组可以用*args接收

4.分组捕获的单数,都是str类型

5.可以设置默认值

*args接收多个无名路由 与 **kwargs接收多个有名路由:

无名路由分组:
url(r'^test4/([0-9]{4})/([0-9]{2})/([0-9]{1})/$', views.test4) 无名视图接收方式一:
def test4(request,y,m,d):
print(y,m,d)
return HttpResponse('对于路由传入多个参数的响应: %s年 %s月 %s日'%(y,m,d)) 无名视图接收方法二:
def test4(request,*args):
print(args,type(args)) #元组格式 #('2001', '10', '3') <class 'tuple'>
return HttpResponse('无名路由传入多个参数的响应') 有名路由分组:
url(r'^test6/(?P<year>[0-9]{4})/(?P<month>[0-9]{2}/(?P<day>[0-9]{1}))', views.test6), 有名视图接收方式一:
def test6(request,month,day,year):
print(year,type(year))
print(month)
print(day)
return HttpResponse('有名分组,接收年月日三个参数') 有名视图接收方法二:
def test6(request,**kwargs):
print(kwargs,type(kwargs)) #字典格式 #{'year': '2018', 'month': '12/4', 'day': '4'} <class 'dict'> return HttpResponse('有名分组,接收年月日三个参数')

有名路由、无名路由视图的2种接收方法

四:路由分发

路由分发:即目录中建了多个app文件,每个app里面都有自己的urls.py及views.py,这时候就要用到路由分发,先在总的路由里面匹配url地址的前面一部分,再指向每个app里面的url里面去找。

注意:总的urls.py里面url地址后面不能写$,如果写了匹配到时就会结束,不会继续往下面对应的app进行路由分发

第一步:总路由里面导入include模块  (哪里做分发就在哪里导入)

  from django.conf.urls import include

第二步:在相应的app里面也建立自己的urls.py文件  (回忆:manage.py startapp app02 命令方式创建app文件夹)

第三步:在总路由里面进行分发(建议不要改名字)

    方式一:  url(r'^app01/',include(urls)), 这种上面要实现做导入 例如:from app01 import urls

    方式二:url(r'^app01/',include('app01.urls')) (推荐使用这一种)

"""day05 URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url
from django.contrib import admin
from app01 import views
from django.conf.urls import url,include
from app02 import urls urlpatterns = [
url(r'^admin/', admin.site.urls), #路由的分发 #方式一:指定分发的二级路由 app02.urls,
#原理:例如http://127.0.0.1:8000/app02/test/ 这样一个请求先http://127.0.0.1:8000/app02 这部分做完匹配,后面/test/再去app02.urls里面找函数体
url(r'^app02/', include('app02.urls')), #分发给app02
#同理:分发给app01
# url(r'^app01/', include('app01.urls')), #方式二:注意实现要先导入路由对应的urls ,才能直接调用,例如:from app02 import urls
# url(r'^app01/', include(urls)), ]

第四步:在指定分发的app的urls.py里面urlpatterns不能变名字,里面url地址写法就一样了

重复上面的步骤可以分发多个路由

五:1.0与2.0区别

Django2.1版本的分发,用的是re.path模块相当与1.1的url,多了个path不支持正则

#主urls
from django.urls import path,re_path,include
from app01 import views from app01 import urls
urlpatterns = [
  # re_path(r'^app01/',include('app01.urls')),#行
  # re_path(r'^app01/&',include('app01.urls')),#不行
  # path('app01/',include('app01.urls')),#行 
  #path('app01/', include(urls)), #不支持正则 ] #在app01里面创建urls
from django.urls import path,re_path
from app01 import views
urlpatterns = [
re_path(r'^test/(?P<year>[0-9]{2})/$',views.url_test),
]

Django1.1用的是url

from django.conf.urls import url,include

#主路由的配置
urlpatterns = [
url(r'^admin/', admin.site.urls), #方法一:
# url(r'^app01/',include(urls)),
#方法二:
url(r'^app01/',include('app01.urls')) ] #app01里面urls.py的设置
from django.conf.urls import url,include
from app01 import views #这个视图views是app01自己的目录下面的
urlpatterns = [
url(r'^test01',views.test01) ]

path的应用:

1.可以指定参入参数的类型,(int只能匹配数字)

2.格式,<参数1:参数2>   参数1:转换器的名字   参数2:参数名

3.不支持正则,精准匹配

4.自定义转换器:(1)写个类  (2)导入register_converter (3)register_converter(test,'ttt') (4)path...

支持的5种类型转换:

str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式

int,匹配正整数,包含0。

slug,匹配字母、数字以及横杠、下划线组成的字符串。

uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。

path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?

自定义转化器:

注意regex、to_python、to_url 名字都是固定写法,不能改

%04d:是指输入的不够4位前面补0,例如输入1:会不全为0001

必须导入这个进行注册:

视图里面的配置:

六:反向解析

路由中的设置 ,命一个名: url(r'^index/', views.index,name='n1'),

urlpatterns = [
url(r'^admin/', admin.site.urls), #实现通过访问test能拿到index地址,完成时时跳转
url(r'^test', views.test),
#给index路由定义一个变量name,绑定给test函数
url(r'^index2222/',views.index,name='jiexi') ]

视图函数的设置:其他函数取绑定这个路由定义的名字,从而时时解析出

  from diango.shortcuts import reverse

  这样就拿到了对应绑定路由的地址

  url=reverse('n1')

#导入reverse模块
from django.shortcuts import render,HttpResponse,redirect,reverse 让test这个函数绑定index路由,实现当访问test网站时会自动跳转到index的网站(index地址的变化就没有影响了)
def test(request):
#这里通过名字jiexi可以直接拿到index地址
url=reverse('jiexi') #和urls视图里面定义的变量值一样 url(r'^test7/',views.test7,name='jiexi')
print(url) #输出的就是url(r'^index/',views.index,name='jiexi'),里面的写的地址的地址 /index/ # return HttpResponse('验证反向解析效果') #正常情况下跳转
# return redirect('/index/') 正常情况下跳转 #绑定了index路由里面定义的名字以后就可以,拿到了index的地址,就可以直接通过地址跳转
return redirect(url) #index的界面内容,实现在地址r'^index2222/'变动的情况下,外面也可以正常访问进来
def index(request):
return HttpResponse('index界面')

输出结果变化:

当输入test地址的时候:

点击回车,会自动跳转到index界面:

pycharm界面输出:

图解如下:

1.路由中,

2.在视图函数里:

  from diango.shortcuts import reverse

  这样就拿到了我反向解析出来的url

  url=reverse('n1')

3.在模板里用

  {% url 'n1'%}

实例2:带传参数的解析绑定的路由,就是如下举例:

总结:1 在html代码里{% url "别名" 参数  参数%}

   2 在视图函数中:

    2.1 url=reverse('test')

    2.2 url=reverse('test',args=(10,20))

图解如下:

路由设置:

视图设置:

效果就是点test输入的时候:

就会完成跳转到index:

4 带位置参数反向解析 url(r'^index/([0-9]{4})/([0-9]{2})', views.index,name='n1'),
视图:url=reverse('n1',args=(2012,12,))

模板:{% url 'n1' 2012 12 %}

5 带关键字参数反向解析 url(r'^index/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.index,name='n1'),
视图:url=reverse('n1',args=(2012,12,) ---可以
url=reverse('n1',kwargs={'year':2014,'month':12})-----也可以

模板:
{% url 'n1' 2012 12 %}----可以
{% url 'n1' month=12 year=2012 %}----可以
注意:按位置传,顺序是固定的

作用:修改路由中url的时候,其它地方不需要改动

七:名称空间

名称空间:(知道它,但是建议不同app的url里name不能重名,app的名字_name)
1 url(r'^app01/', include('app01.urls',namespace='app01')),
urlpatterns = [
url(r'^test',views.test3 ,name='test'),

]
url(r'^app02/', include('app02.urls',namespace='app02')),
urlpatterns = [
url(r'^test02',views.test3 ,name='test'),

]
2 在视图函数里:
url=reverse('app02:test')
print(url)
3 在模板里:
<a href="{% url 'app02:test' %}">点我跳到首页</a>

Diango路由控制的更多相关文章

  1. 【nodejs笔记3】Express基本用法,和路由控制,和模板渲染ejs

    1. 路由控制的工作原理 //routes/index.js中的代码//访问主页时,调用ejs模板引擎,渲染index.ejs模板文件,生成静态页面,并显示在浏览器中.router.get('/', ...

  2. angularJs模块ui-router之路由控制

    在你的应用中大多数状态都有与其相关联的 url,路由控制不是设计完成 state 之后的事后想法,而是开始开发时就应该考虑的问题. 这里是如何设置一个基本url. $stateProvider .st ...

  3. Router和History (路由控制)-backbone

    Router和History (路由控制) Backbone.Router担任了一部分Controller(控制器)的工作,它一般运行在单页应用中,能将特定的URL或锚点规则绑定到一个指定的方法(后文 ...

  4. golang自定义路由控制实现(二)-流式注册接口以及支持RESTFUL

        先简单回顾一下在上一篇的文章中,上一篇我主要是结合了数组和Map完成路由映射,数组的大小为8,下标为0的代表Get方法,以此类推,而数组的值则是Map,键为URL,值则是我们编写对应的接口.但 ...

  5. rest_framework之解析器、路由控制、分页

    解析器 我们都知道,网络传输数据只能传输字符串格式的,如果是列表.字典等数据类型,需要转换之后才能使用 但是我们之前的rest_framework例子都没有转换就直接可以使用了,这是因为rest_fr ...

  6. Django-restframework之路由控制、解析器及响应器

    django-restframework之路由控制.解析器及响应器 一 前言 本篇博客介绍 restframework 框架的剩下几个组件,路由控制有三种:传统路由.半自动路由及全自动路由:解析器是用 ...

  7. web应用/路由控制/视图函数/单表多表操作

    一. 1.wen应用:BS架构的应用程序,B是浏览器,S:server(实现了wsgi协议)+ application https://www.cnblogs.com/liuqingzheng/art ...

  8. $Django patch与put,视图组件,路由控制,响应器

    1 patch与put(幂等?回顾) PATCH 与 PUT 属性上的一个重要区别还在于:PUT 是幂等的,而 PATCH 不是幂等的.幂等是一个数学和计算机学概念,在计算机范畴内表示一个操作执行任意 ...

  9. 初步掌握node的路由控制

    1.1.2:node.js的路由控制 1.运行原理 在1.1.1节中,提到过app.js中app.get("/",routes.index)可以用以下代码取代: app.get(& ...

随机推荐

  1. 安装ubuntu出现BUG soft lockup的解决方法(16.04 14.04)

    对于16.04而言,当时用的是UtrISO 安装的,导致安装过程用会出现 “not a com32r image” 的错误,解决方法见上文的: boot: live 华硕Z9主板安装16.04以上系统 ...

  2. Azure 门户使用概览

    Azure 门户是管理 Azure 云平台的核心工具,用户可以在其中预配和管理 Azure 资源.本教程将帮助你熟悉Azure管理门户,包括一些关键功能的介绍,并演示了如何通过 Azure 门户创建虚 ...

  3. CentOS-语言设置

    查看所有的locale语言 # locale -a # locale -a|grep en 查看当前操作系统使用的语言 # echo $LANG 设置系统locale语言为中文环境(永久生效) # v ...

  4. 通过Java代码实现图片的放大和缩小

    本文介绍的例子在Android安卓手机上测试通过. 先看看效果吧.可以看到这个开发好的安卓应用有三个按钮:Zoom In缩小图片,Zoom Out放大图片和Save保存. 初始页面: 可以在左边边框自 ...

  5. SAP OData编程指南

    OData(Open Data Protocol)协议是一个开放的工业标准,用于定义RESTFul API的设计和使用.我的文章标题前加上SAP的前缀,只是为了表明这篇文章介绍的是Jerry在SAP项 ...

  6. 手写IOC框架

    1.IOC框架的设计思路 ① 哪些类需要我们的容器进行管理 ②完成对象的别名和对应实例的映射装配 ③完成运行期对象所需要的依赖对象的依赖

  7. CentOS配置主机名和主机映射

    1.修改本机主机名 vi /etc/sysconfig/network 修改hostname HOSTNAME=s0 2.配置主机映射 vi /etc/hosts 修改内容如下 192.168.32. ...

  8. iOS快速开发框架--Bee Framework

    Bee Framework是一款iOS快速开发框架,允许开发者使用Objective-C和XML/CSS来进行iPhone和iPad开发,由 Gavin Kwoe 和 QFish 开发并维护. 其早期 ...

  9. Python——基本运算符

    计算机不止可以进行加减乘除,还可以进行多种运算,比如算数运算,逻辑运算,赋值运算等 算数运算 以下假设变量:a=10,b=20 比较运算 以下假设变量:a=10,b=20 赋值运算 以下假设变量:a= ...

  10. 洛谷 P2735 电网

    https://www.luogu.org/problemnew/show/P2735 定理什么的最讨厌了,匹克定理?不会,也不想学. 粉色的为电网,将图中的电网我们将他构造一个矩形,然后蓝色和绿色的 ...