码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 探索Django路由规则(路由匹配、路由命名空间、HTML中的跳转与Django集成、路由传参以及后端重定向)


    路由管理:

    ​ 在实际开发过程中,⼀个Django 项⽬会包含很多的 app ,这时候如果我们只在主路由⾥进⾏配置就会显得杂乱⽆章,所以通常会在每个 app ⾥,创建各⾃的 urls.py 路由模块,然后从根路由出发,将 app 所属的 url 请求,全部转发到相应的 urls.py 模块中。⽽这个从主路由转发到各个应⽤路由的过程叫做路由的分发。

    在这里插入图片描述

    注册app:

    在这里插入图片描述

    TEMPLATES = [
        {
            "BACKEND": "django.template.backends.django.DjangoTemplates",
            "DIRS": [BASE_DIR / 'templates',] # 可以多个
            ,
            "APP_DIRS": True,
            "OPTIONS": {
                "context_processors": [
                    "django.template.context_processors.debug",
                    "django.template.context_processors.request",
                    "django.contrib.auth.context_processors.auth",
                    "django.contrib.messages.context_processors.messages",
                ],
            },
        },
    ]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    路由匹配:
    # 使⽤url给视图函数传参数 
    path('index/', index) 
    path('detail//', detail)
    
    # 给url取别名,那么在使⽤此url的地⽅可以使⽤别名。⽐如:
    path('index/', index, name='index')
    path('detail//', detail, name='detail')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    命名空间:

    ​ 在实际应⽤中,Django中可能存在多个应⽤程序,每个应⽤程序都可能有⾃⼰的路由模块。为了防⽌路由冲突, Django提供了命名空间(namespace)的概念。命名空间是⼀种将路由命名为层次结构的⽅式,使得在查询路由时可 以限定在该命名空间内。

    html跳转:
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>首页</title>
    </head>
    <body>
        <h2>首页</h2>
        <hr>
    
    {#      url路由  #}
    
    {#    路径是相对于 http://127.0.0.1:8000  注意跳转的/必须要加 的#}
    
        <a href="/user/userlist/">url路由的方式:进入用户列表页面</a>
        <hr>
    
    {#      反向解析#}
    {#     userlist 是path路由的name值#}
    {#    反向解析的方式:进入用户列表页面#}
    {#    
    #}
    {# 反向解析:带命名空间#} {# 一个子路由有一个命名空间,然后去子路由去找名称为userlist的映射#} <a href="{% url 'App:userlist' %}">反向解析带命名空间的方式:进入用户列表页面</a> </body> </html>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在这里插入图片描述

    在这里插入图片描述

    正向解析: 先有访问url地址,后进行路由映射,然后到html

    反向解析:先匹配路由名称,然后定位路由路径,进行路由函数映射

    注意:反向解析和命名空间的写法只能保留一种。

    {% url 'detail' stu.id %}
    {% url 'App:index' %}
    
    
    • 1
    • 2
    • 3
    路由传参:
    from django.urls import path, re_path
    from App.views import *
    
    urlpatterns = [
        # 首页
        path('index/', index),
        # 用户列表
        path('userlist/', user_list, name='userlist'),
    
        # 用户详情
        path('userdetail//', user_detail, name='userdetail'),
    
        # 多个参数
        path('userab///', user_ab_view, name='userab'),
        #  整数
        #  字符串
    
        path('userba///', user_ba_view, name='userba'),
        # 正则的写法: 以前的写法
        # re_path(r'userba/(?P\d+)/(?P\d+)/', user_ba_view, name='userba'),
    
    
    
    ]
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    from django.http import HttpResponse
    from django.shortcuts import render, redirect, reverse
    from App.models import *
    
    # 首页
    def index(request):
        return render(request, 'index.html')
    
    
    # 用户列表
    def user_list(request):
        # 获取所有用户数据
        users = UserModel.objects.all()
        return render(request, 'user_list.html', {'users': users})
    
    
    # 用户详情
    def user_detail(request, uid):
        print('uid:', uid)
        user = UserModel.objects.get(pk=uid)  # pk: primary key 主键
        return render(request, 'user_detail.html', {'user': user})
    
    
    # 多个参数
    def user_ab_view(request, a, b):
        return HttpResponse(f'a:{a} - b:{b}')
    
    # 要和路由中的参数名一致,名字对应赋值
    def user_ba_view(request, b, a):
        return HttpResponse(f'a:{a} - b:{b}')
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>用户列表title>
    head>
    <body>
        <h2>用户列表h2>
        <hr>
    
        <ul>
            {% for user in users %}
                <li>
                     反向解析:路由传参
                    <a href="{% url 'App:userdetail' user.id %}">
                        {{ user.name }} - {{ user.age }}
                    a>
                li>
            {% endfor %}
    
        ul>
    
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    App为命名空间的名字,userdetail是自己设置的路由名称,{% url 'App:userdetail' user.id %},user.id会作为参数传递个userdetail这个路由名称所对应的路由。


    views.py

    # 多个参数
    def user_ab_view(request, a, b):
        return HttpResponse(f'a:{a} - b:{b}')
    
    # 要和路由中的参数名一致,名字对应赋值
    def user_ba_view(request, b, a):
        return HttpResponse(f'a:{a} - b:{b}')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    urls.py

        # 多个参数  相当于关键字参数
        path('userab///', user_ab_view, name='userab'),
        #  整数
        #  字符串
    
        path('userba///', user_ba_view, name='userba'),
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    我们看看多个参数怎么传递呢?

    在这里插入图片描述

    但是这种路由的写法是django比较新的写法,下面是比较老的写法,使用正则表达式来进行约束。

    # 正则的写法: 以前的写法
    re_path(r'userba/(?P\d+)/(?P\d+)/', user_ba_view, name='userba'),
    
    
    • 1
    • 2
    • 3
    后端重定向:

    ​ Django路由反向解析是⼀个⾮常重要的功能,它可以让我们在代码中使⽤路由别名替代URL路径,在修改URL时避 免代码中的硬编码依赖,同时也可以提⾼可读性和可维护性。

    views.py

    from django.http import HttpResponse
    from django.shortcuts import render, redirect, reverse
    from App.models import *
    
    
    # 重定向
    def my_redirect(request):
        # 反向解析url :会先去找reverse('xx')中的名字,就是路由函数
        # return redirect(reverse('index'))
    	# return redirect(reverse('detail', args=[2]))
    	# return redirect(reverse('detail', kwargs={"id": 2})
           
         # /a/b 是绝对路径,相当于在端口下拼接   
        # return redirect('https://www.ifeng.com')
        # return redirect('/user/userlist/')
        # return redirect('/user/userdetail/2/')
    
        # 反向解析 对应命名空间下的路由名
        # reverse('App:userdetail', args=(1,)) => 'userdetail/1/'
        # 带命名空间的写法
        # return redirect(reverse('App:userdetail', args=(1,)))  # 位置参数传参
        return redirect(reverse('App:userdetail', kwargs={'uid': 2}))  # 关键字传参
        # 不带命名空间
        # return redirect(reverse('userdetail', args=(1,)))  # 位置参数传参
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    urls.py

        # 重定向
        path('myredirect/', my_redirect),
    
    • 1
    • 2

    注意:有namespace则在后面的html或者重定向或者反向解析都要使用命名空间来写,不然找不到。如果用了命名空间,后面的反向解析(包括视图函数和模板中)都要使用命名空间。

    技巧:

    在flask或者django中,都是使用模板语言,可以巧用tab提高编程速度。

    在这里插入图片描述

    在这里插入图片描述

    如果没有提示需要修改配置文件:

    在这里插入图片描述

    总结:

    本文深入剖析了Django框架中与路由相关的知识点,包括路由匹配、路由命名空间、HTML中的跳转与Django集成、路由传参以及后端重定向。这些概念和技巧是构建出高效、可扩展Web应用程序的关键要素。

    通过全面理解路由匹配机制,我们能够根据URL模式将请求准确地分发到对应的视图函数,实现灵活的路由控制。同时,通过合理使用路由命名空间,我们能够更好地组织和管理路由,提高项目的可维护性和可扩展性。

    在前端方面,我们介绍了如何将HTML中的跳转与Django集成,利用模板语言和URL反解析功能,轻松实现页面间的无缝跳转。而通过路由传参,我们可以在URL中传递参数,为视图函数提供所需的数据,实现个性化的页面渲染和处理。

    另外,后端重定向是处理用户请求的常见技术之一。通过后端重定向,我们可以根据特定条件将用户重定向到其他URL,实现页面跳转和流程控制,从而提升用户体验和应用程序的功能性。

    通过掌握Django路由解析与跳转的全面知识,我们能够构建出强大而稳健的Web应用程序。希望本文能够为你提供深入学习和实践的指导,助你在Django开发中更加熟练和自信。继续探索和应用这些技术,相信你将在Web开发的道路上取得更大的成就。

  • 相关阅读:
    DXP TreeList 目录树
    4 SpringMVC获取请求参数
    Java中该如何面向对象以及类的定义、使用和实例化
    Retrofit项目 - Android和Java的类型安全的HTTP客户端
    Vue3+Ts,利用vee-validate封装一个验证表单类似于Elementui el-form
    java-php-python-宠物医院管理系统计算机毕业设计
    【编程题】【Scratch四级】2019.12 打棒球
    Golang Gin框架搭建项目(六)Grpc服务
    IPv6通信实验
    sqlite的文件导入操作
  • 原文地址:https://blog.csdn.net/ak_bingbing/article/details/136243431
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号