前言

为什么我们url需要命名呢?url命名的作用是什么?我们先来看一个案例

案例

我们先在一个Django项目中,创建2个App,前台front和后台cms,然后在各自app下创建urls.py文件,创建成功后项目代码结构如下:



然后写入如下代码

# url_demo.urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('cms/', include('cms.urls')),
path('front/', include('front.urls')),
] # front.urls.py
urlpatterns = [
path('', views.index),
path('login/', views.login),
] # front.views.py
from django.shortcuts import render, redirect, reverse
from django.http import HttpResponse
def index(request):
username = request.GET.get('username')
if username:
return HttpResponse("front首页")
else:
return redirect('login/') def login(request):
return HttpResponse('front登录页面')

上面代码我们实现的功能是:访问首页,如果没有携带username,那么重定向到登录页面,我们现在在浏览器中输入127.0.0,1/front/,那么会自动重定向到login登录页面,浏览器上会返回front登录页面,我们可以从pycharm运行记录中看到

[14/May/2021 03:22:02] "GET /front/ HTTP/1.1" 302 0
[14/May/2021 03:22:02] "GET /front/login/ HTTP/1.1" 200 17

当我们在浏览器输入http://127.0.0.1:8000/front/?username=jkc,浏览器会返回front首页,此时,产品经理对你说:我们的登录url改一下,把login改成signIn,这时程序员A,就把urls.py中的loginviews中的重定向login/改成了signIn,改完后功能可以实现没问题,但是产品经理这几天反复的让A去改地址,那么程序员A每次都要去修改路由和视图2个地方,那么有没有什么方法可以只修改路由,答案肯定是有的,下面我我们来介绍

urls命名

我们就将front.urls.pyviews.py改成下面的代码

# front.urls.py
urlpatterns = [
path('', views.index, name="index"),
path('signIn/', views.login, name="login"),
] # front.views.py
def index(request):
username = request.GET.get('username')
if username:
return HttpResponse("front首页")
else:
return redirect(reverse('login'))

我们在路由地址中添加了一个name参数,代表路由的名字,然后在视图中使用反向解析函数reverse将路由地址解析成为login,意思是寻找路由名字为login的地址,这样处理,以后产品经理想改url地址,我们只需要修改url中的地址就可以了,因为视图中永远会反向解析到名字为login的路由地址。

 

为什么我们需要url命名

答:因为url是经常变化的。如果在代码中写死可能会经常改代码。给url取个名字,以后使用url的时候就使用他的名字进行反转就可以了,就不需要写死url了。

但是我们这样url反转的时候还会有问题,我们来看下面代码

# cms.urls.py
urlpatterns = [
path('', views.index, name="index"),
path('login/', views.login, name="login")
] # front.urls.py
urlpatterns = [
path('', views.index, name="index"),
path('signIn/', views.login, name="login"),
] # cms.views.py
def index(request):
username = request.GET.get('username')
if username:
return HttpResponse("cms首页")
else:
return redirect(reverse('login')) def login(request):
return HttpResponse('cms登录页面') # front.views.py
def index(request):
username = request.GET.get('username')
if username:
return HttpResponse("front首页")
else:
return redirect(reverse('login')) def login(request):
return HttpResponse('front登录页面')

我们在浏览器中输入127.0.0.1/cms/,最后发现路由重定向到了front的登录页面,可以通过pycharm中的控制台看到

[14/May/2021 05:50:37] "GET /cms/ HTTP/1.1" 302 0
[14/May/2021 05:50:37] "GET /front/signIn/ HTTP/1.1" 200 17

原因是cms和front都有相同的index路由,那么路由反转的时候,django无法辨别到底反转到哪个app下的index,此时我们就需要使用应用命名空间,在各自app的urls.py文件中添加app_name属性,值为App的名字,代码如下

# cms.urls.py
app_name = "cms" # 应用命名空间
urlpatterns = [
path('', views.index, name="index"),
path('login/', views.login, name="login")
] # front.urls.py
app_name = "front" # 应用命名空间
urlpatterns = [
path('', views.index, name="index"),
path('signIn/', views.login, name="login"),
] # cms.views.py
def index(request):
username = request.GET.get('username')
if username:
return HttpResponse("cms首页")
else:
return redirect(reverse('cms:login')) def login(request):
return HttpResponse('cms登录页面') # front.views.py
def index(request):
username = request.GET.get('username')
if username:
return HttpResponse("front首页")
else:
return redirect(reverse('front:login')) def login(request):
return HttpResponse('front登录页面')

上述代码我们从之前的基础上改成了reverse('front:login'),这样django就知道了我是反转frontapp下的路由名字为login的url

一个app,可以创建多个实例。可以使用多个url映射同一个app。所以这就会产生一个问题。以后在做反转的时候,如果使用应用命名空间,那么就会发生混淆。为了避免这个问题。我们可以使用实例命名空间。实例命名空间也是非常简单,只要在include函数中传递一个namespace变量即可。示例代码如下:

urlpatterns = [
path('cms1/', include('cms.urls', namespace="cms1")),
path('cms2/', include('cms.urls', namespace="cms2")),
]

此时我们浏览器访问127.0.01/cms2/,却重定向到了cms1的login页面,我们可以通过pycharm的控制台看到

[14/May/2021 06:53:07] "GET /cms1/ HTTP/1.1" 302 0
[14/May/2021 06:53:07] "GET /cms2/login/ HTTP/1.1" 200 15
[14/May/2021 06:53:12] "GET /cms2/ HTTP/1.1" 302 0
[14/May/2021 06:53:12] "GET /cms2/login/ HTTP/1.1" 200 15

以后在做反转的时候,就可以根据实例命名空间来指定具体的url。示例代码如下:

def index(request):
username = request.GET.get('username')
if username:
return HttpResponse("cms首页")
else:
# 获取当前实例命名空间
current_namespace = request.resolver_match.namespace
return redirect(reverse(f'{current_namespace}:login'))

然后我们通过浏览器访问127.0.01/cms2/,结果就是正确的,我们可以通过pycharm的控制台看到

[14/May/2021 07:02:20] "GET /cms1/ HTTP/1.1" 302 0
[14/May/2021 07:02:20] "GET /cms1/login/ HTTP/1.1" 200 15
[14/May/2021 07:02:25] "GET /cms2/ HTTP/1.1" 302 0
[14/May/2021 07:02:25] "GET /cms2/login/ HTTP/1.1" 200 15

Django(7)url命名的作用的更多相关文章

  1. django额外参数的传递和url命名

    django额外参数的传递 path方法:path(route, view, kwargs=None, name=None) path方法可以传递入一个额外参数的字典参数(kwarg),字典里的值就会 ...

  2. Django路由系统---django重点之url命名分组

    django重点之url命名分组[参数无顺序要求]. settigs.py:增加STATICFILES_DIRS静态资源路径配置,名称为创建的文件夹名称 'DIRS': [os.path.join(B ...

  3. Django路由系统-URL命名&URL反向解析

    命名URL和URL反向解析 前言 起始样式,HTML中的href是写死的,不能更改,如下示例代码: # urls中 urlpatterns = [ url(r'^admin/', admin.site ...

  4. django中url路由配置及渲染方式

    今天我们学习如何配置url.如何传参.如何命名.以及渲染的方式,内容大致有以下几个方面. 创建视图函数并访问 创建app django中url规则 捕获参数 路径转换器 正则表达式 额外参数 渲染方式 ...

  5. Django的URL路由系统

    一. URL配置 URL配置就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图之间的映射表.你就是以这种方式告诉Django,对于哪个URL调用的这段代码. 基本格式 from ...

  6. Django之URL路由系统

    一 URL配置 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表.你就是以这 ...

  7. Django之url路由

    Django之url路由 url路由介绍 url路由是关联url及其视图函数关系的过程. 作用就是使views里面处理数据的函数与请求的url建立映射关系 url路由配置 Django的url路由配置 ...

  8. Django之url映射

    url映射的作用 根据Django的MTV模式,url的映射是根据用户输入或传送而来的url路径,来进行区分去执行相应的view函数来响应用户的操作. url映射的方式 Django项目的创建后,会自 ...

  9. Django中url使用命名空间的错误

    出的错误: 1. Reverse for 'llist' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) ...

随机推荐

  1. 热门跨平台方案对比:WEEX、React Native、Flutter和PWA

    本文主要对WEEX.React Native.Flutter和PWA几大热门跨平台方案进行简单的介绍和对比.内容选自<WEEX跨平台开发实战> (WEEX项目负责人力荐,从入门到实战,教你 ...

  2. 给Winform中的TabControl添加更现代的拖拽功能

    上周接到一个开发任务,大致是允许APP中的Tab拖动以成为一个独立Tab,脱离之前的TabControl,就是现在Web拖动标签页创建新窗口的功能,现在浏览器必备的功能,应该很简单,然而我司采用的Do ...

  3. HTML的基础语法

    区别于c语言这类高级语言,HTML不是编程语言,而好似一种描述型语言,用于描述网页中内容的显示方式. HTML标记以<>来进行标记.HTML中的标记按其是否成对出现,可以分为单标记和双标记 ...

  4. 在用free()函数释放指针内存时为何要将其指针置空

    在通过free()函数释放指针内存之后讲其指针置空,这样可以避免后面的程序对与该指针非法性的判断所造成的程序崩溃问题.释放空间,指针的值并没有改变,无法直接通过指针自身来进行判断空间是否已经被释放,将 ...

  5. 2018ICPC南京 A. Adrien and Austin

    题目: 题意:1-N个石子每次只能取连续的1-K个问输赢.(一开始以为只是个简简单单的巴什游戏,激动的提交了一发wr了,再读了一遍题才发现是只能取连续的) 题解:当n==0或者k==1&&am ...

  6. x64dbg 条件断点相关文档

    输入 字符格式 条件断点 Input When using x64dbg you can often use various things as input. Commands Commands ha ...

  7. toastr通知插件的使用

    /显示一个警告,没有标题 toastr.warning('My name is Inigo Montoya. You killed my father, prepare to die!') 显示一个成 ...

  8. Centos7安装nexus(maven私服)以及maven的相关配置

    一.nexus安装: 1.获取nexus下载地址: 查询nexus最新版本地址:https://help.sonatype.com/repomanager3/download 当前最新版本为nexus ...

  9. 用RUST写流媒体服务器实战——rtmp chunk 深入解析

    用RUST写流媒体服务器实战--rtmp chunk 深入解析 最近几个月断更了,把精力放在了新的开源项目上,一个用rust写的流媒体服务xiu. 实现过程中踩了不少坑,今天说下rtmp中的chunk ...

  10. 【1.0 Regular Expressions 正则表达式】

    [概念] RegEx 正则表达式是一种特殊的字符序列,可帮助您使用专门的模板语法,来匹配对应的匹配方法或字符串组 它们可用于搜索,编辑或操纵文本和数据 正则表达式通常用于验证输入和检索信息 比如我们要 ...