django路由层(二) 反向解析和名称空间

url命名和反向解析

根据名字动态获取到对应的路径

可以给每一个路由与视图函数对应关系起一个名字
这个名字能够唯一标识出对应的路径
注意这个名字不能重复是唯一的

应用场景


通过别名来传递路径给到前端或者后端,好处是更加灵活,因为是通过别名进行传递,所以只要修改源路径,其他的层都不需要更改,否则如果直接通过源路径传递,则耦合度较高,不够灵活,维护成本太高

无分组反向解析

第一步: 命名


url(r'^pre/', views.press_list, name='press_list')

第二步: 反向解析


在视图中使用

reverse(‘你给路由与视图函数对应关系起的别名‘)


from django.urls import reverse
reverse('press_list')           --->        '/pre/'

在模板中使用

{% url ‘你给路由与视图函数对应关系起的别名‘ %}


{% url 'press_list' %}

无名分组反向解析


第一步: 命名


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

>>>> app01.urls.py
 url(r'^index/(\d+)/(\d+)/$', views.index, name='index')

>>>> app01.views.py
from django.shortcuts import render, redirect, HttpResponse

def index(request, year, month):
    # return HttpResponse(reverse('index', args=(year, month)))
    return render(request, 'home.html', locals())

第二步: 反向解析


在视图层使用

`


from django.url import reverse
reverse('index', args=(year, month))        --->        /app01/index/2019/10/

在模板中使用

{% url ‘你给路由与视图函数对应关系起的别名‘ %}


{% url 'index' 2019 10 %}

有名分组反向解析


第一步: 命名


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

>>>> app01.urls.py
url(r'^home/(?P<year>\d+)/(?P<month>\d+)/$', views.home, name='home')

>>>> app01.views.py
from django.shortcuts import render, redirect, HttpResponse

def home(request, year, month):
    # return HttpResponse(reverse('home', kwargs={'year': year, 'month': month}))
    return render(request, 'home.html', locals())

第二步: 反向解析


在视图层使用


from django.url import reverse
reverse('home', kwargs={'year': year, 'month': month})  ---> /app01/home/2019/10

在模板层使用


{% url 'home' month=2019 year=10 %}

注意

针对有名分组与无名分组的反向解析统一采用一种格式即可

反向解析的本质:就是获取到一个能够访问名字所对应的视图函数


名称空间

即使不同的APP使用相同的URL名称,URL的命名空间模式也可以让你唯一反转命名的URL。

不使用名称空间,两个app出现同名的路由名字,则匹配到就会匹配,这样的话两个app访问的是同一个网页,并不是不同的

先创建一个新的app

[email protected] > startapp app02

注册app

settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',
    'app02.apps.App02Config',
]

案例1

urls.py

from django.conf.urls import url, include

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

app01.urls

from django.conf.urls import url
from app01 import views

urlpatterns = [
   url('^index/',views.index)
]

app01.views

def index(request):
    return HttpResponse('index1')

app02.urls`

from django.conf.urls import url
from app01 import views

urlpatterns = [
   url('^index/',views.index)
]

app02.views

def index(request):
    return HttpResponse('index2')

测试

输入 http://127.0.0.1:8000/app01/index/

输入 http://127.0.0.1:8000/app02/index/

两个url访问的都是app01下的index的内容,这种是有问题的,如果需要每个app访问的都是自己的网页内容,但是路由名字又和其他app里的是一样的,这种用名称空间解决

案例2

给两个app的URL路由关系创建一个名称空间

urls.py

from django.conf.urls import url, include

urlpatterns = [
    # 第一种写法
    # url(r'app01/', include("app01.urls", namespace="app01")),
    # url(r'app02/', include("app02.urls", namespace="app02")),

    # 第二种写法
    url(r'app01/', include(("app01.urls", "app01"))),
    url(r'app02/', include(("app02.urls", "app02"))),
]

app01.urls.py

from django.conf.urls import url
from app01 import views

urlpatterns = [
    url('^index/', views.index)
]

app02.urls.py

from django.conf.urls import url
from app02 import views

urlpatterns = [
   url('^index/',views.index)
]

app01.views.py

def index(request):
    return HttpResponse('index1')

app02.views.py

def index(request):
    return HttpResponse('index2')

原文地址:https://www.cnblogs.com/cjwnb/p/11790092.html

时间: 2024-10-09 23:13:16

django路由层(二) 反向解析和名称空间的相关文章

Django路由层与视图层、pycharm虚拟环境

一. Django路由层 路由层即对应项目文件下的urls.py文件.实际上每个APP中也可以有自己的urls.py路由层.templates文件夹及static文件夹.Django支持这么做,也为实际工作中一个项目多人协作完成提供了便利:即每个人单独建一个Django项目写一个APP,最后新建一个Django项目将所有APP汇总,然后settings中注册各个APP,再修改一下其他配置即可. 路由层大致内容如下: from django.conf.urls import url from dj

Django 路由层(urlconf)

Django 的路由层(URLconf) URL配置(conf)就像是Django所支撑的网站的目录; 本质就是:URL与调用该URL执行的视图函数的映射表; 通俗的讲:就是用户使用哪个url,URL(conf)就需要告诉服务器执行哪个程序代码. 一  路由配置的简单使用 path :不能使用正则 ,path('路径',views.方法) re_path :可以使用正则 ,re_path(r'正则表达式路径',views.方法) from django.urls import path,re_p

五十六、Django路由层与视图层

一.路由层 1.路由匹配规律 # 网站首页路由:url(r'^$',views.home) # 网站不存在页面:url(r'',views.error) urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^$',views.home), url(r'^test/$',views.test), url(r'^testadd/$',views.testadd), url(r'',views.error) ] # 注意:第一个参数是正则表达

Django 路由层,视图层,模板层

MVC与MTV模型 一.MVC Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求,其示意图如下所示: 二.MTV Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是: M 代表模型(Mode

Django路由层

Urls的正则匹配 路由层作用是url与视图函数的映射 特点1.匹配成功后 不再往下匹配 2.如果结尾没有/ 匹配失败后 加上/再走一次匹配列表,在settings.py中设置了 APPEND_SLASH=False 可以关闭 如何拿到完整url? 在视图函数中,request.path 可以拿到前缀路径 通过request.get_full_path() 可以拿到完整的路径 http://127.0.0.1:8000/test/hahah/?id=asda/ request.path>>&g

django url别名和反向解析 命名空间

url别名和反向解析 我们平时写的url名字都是死的,如果项目过大,需要项目中某个文件名改动一下,那么改动起来就不是一般的麻烦了,所以我们就在定义的时候给url起一个别名,以后不管哪个文件中运用都是用它的别名,这样就方便多了,你的路径名不管怎么改变都不会影响你的操作 如何给你url起别名 url(r'^home1/',views.home,name='home'), # 像这样,在url后边加一个name叫做home,之后再其他的文件中需要引用这个url就可以直接使用别名 url(r'^home

9.10 路由控制之反向解析--【别名】html和views两种方式实现

1.  在html里反向解析 给路径起别名,修改路径时,不用每个地方都修改. {% url 'Log' %}  : 就会去找别名为Log的URL,找到 "login/"后把"login/"发给客户端渲染. 二.在views函数里反向解析 原文地址:https://www.cnblogs.com/beallaliu/p/9822777.html

Python - Django - 命名 URL 和反向解析 URL

命名 URL: test.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>测试页面</title> </head> <body> <p>测试页面</p> <form action="/test/" method=&quo

django路由层(一)

Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 我们就是以这种方式告诉Django,遇到哪个URL的时候,要对应执行哪个函数. URLconf配置 基本格式: 示例: urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^test', views.test), url(r'^testadd