Django(7)url命名的作用「建议收藏」

Django(7)url命名的作用「建议收藏」前言为什么我们url需要命名呢?url命名的作用是什么?我们先来看一个案例案例我们先在一个Django项目中,创建2个App,前台front和后台cms,然后在各自app下创建urls.py文件

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

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

案例

我们先在一个Django项目中,创建2个App,前台front和后台cms,然后在各自app下创建urls.py文件,创建成功后项目代码结构如下:
Django(7)url命名的作用「建议收藏」
然后写入如下代码

# 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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/165053.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • IDEA中使用eclipse快捷键「建议收藏」

    IDEA中使用eclipse快捷键「建议收藏」1.修改使用Eclipse风格的快捷键目的是习惯了使用eclipse的快捷键,在使用IDEA时不想重头记一套新的快捷键。按照下面的顺序操作File–>settings–>keymap–>在下来框中选中Eclipse选择Apply保存设置这样改完就是elipse风格的快捷方式了2.单独设置一部分比较主要的与eclipse中不一致的操作2

  • github 收藏_安全小案例分享

    github 收藏_安全小案例分享小案例GitHub地址收藏说明:平时用到的小案例会收藏到此处点击标题直接进入原创者位置并会标明作者js轮播图支持移动端制作人:hishionH5页面唤起APP/移动端网页打开APP作者:ihziluoh…

  • 170406回顾-SQL Server的smalldatetime类型比较[通俗易懂]

    170406回顾-SQL Server的smalldatetime类型比较[通俗易懂]在比较SQLServer的类型为smalldatetime字段时出现下面的错误:将expression转换为数据类型smalldatetime时出现算术溢出错误正确的比较方法如下:将long型转换为时间格式的字符串,再与smalldatetime类型的字段比较SELECT*FROMtablenameWHEREEditFlag>’2017/3…

  • 7-9 判断素数 (20分) 本题的目标很简单,就是判断一个给定的正整数是否素数。[通俗易懂]

    7-9 判断素数 (20分) 本题的目标很简单,就是判断一个给定的正整数是否素数。[通俗易懂]7-9 判断素数 (20分) 本题的目标很简单,就是判断一个给定的正整数是否素数。输入格式: 输入在第一行给出一个正整数N(≤ 10),随后N行,每行给出一个小于2 ​31 ​​ 的需要判断的正整数。输出格式: 对每个需要判断的正整数,如果它是素数,则在一行中输出Yes,否则输出No。输入样例: 2 11 111 输出样例: Yes No#include &l…

  • 视频监控中NVR录像机NTP校时配置(京准)

    视频监控中NVR录像机NTP校时配置(京准)NTP校时通过设置NTP服务器地址、NTP端口号和校时时间间隔,设备即按照设置每隔一段时间校时一次。NVR3.0界面路径:主菜单—系统配置—网络配置——NTP海康威视iVMS-4200校时、手动校时、定位校时、NTP校时四种方法任你选NVR4.0界面路径:系统管理—网络配置—基本配置—NTP注意:NTP校时,需要设备接入外网或者在局域网中有NTP软件组建NTP服务器。定位校时…

  • 增量表全量表拉链表区别_hive 增量数据更新

    增量表全量表拉链表区别_hive 增量数据更新一、概念增量表:记录更新周期内新增的数据,即在原表中数据的基础上新增本周期内产生的新数据;全量表:记录更新周期内的全量数据,无论数据是否有变化都需要记录;拉链表:一种数据存储和处理的技术方式,可以记录数据的历史信息,记录数据从开始一直到当前所有变化的信息。二、举例详解增量表:以页面访问数据表为例,假设该表从2020-06-01开始记录数据,按天更新,分区为dt。2020-06-01产生了三条访问数据,如下表:2020-06-02首页和商详页又产生了2条访问数据,该两条即为2020-06-

    2022年10月17日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号