Django框架的路由配置及传参方法

本文详细介绍了Django框架中路由的配置方法,包括两种配置方式:使用`include`和`repath`。此外,文章还讨论了URL参数的传递,通过`path()`和`re_path()`函数,并探讨了不同转换器如`int`和`path`在处理路径参数时的作用和用法。最后,针对路径中特殊字符的影响,给出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Django框架的路由配置及传参方法

一、配置路由的两种方法:

1、

  • 首先在hello_app下创建一个子路由,命名为urls在这里插入图片描述

  • 在my_dj_demo中的urls导入include方法,添加path()函数第一个参数是路由器的名字,include()方法中需要传入的是子路由的路径

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('helloapp/', include('hello_app.urls'))
]
  • 将光标放在urls上,同时按CTRL键,urls变蓝,点击就会跳入子路由器的文件

    path函数有两个参数,参数1:路径(url),参数2:视图函数的函数名
    

2、repath()函数利用的是正则匹配,在这了repath()函数的作用是匹配到welcome/,所以无论是在welcome之前添加字符还是在/后面添加字符,只要‘welcome/’不被破坏,就不会影响原有的界面(下图是在子路由即hello_app/urls上做出的修改)

在这里插入图片描述

  • pycharm注释的快捷键:Ctrl+/

    如下则不能在welcome/前后随意添加字符

re_path(r'^welcome/$', welcome)
二、url传参

1、**path()**方式,

  • 在子路由中定义了一个path()函数,路径为cars/,包含两个参数名字和马力(车的属性),此时视图函数名为cars
urlpatterns = {
    # path函数有两个参数,参数1:路径(url),参数2:视图函数的函数名
    path('hi/', welcome),
    # path('welcome/', welcome),
    # re_path(r'^welcome/$', welcome)
    path('cars/<name>/<power>', cars)
    }
  • 在在子路由的views.py中添加cars的视图函数定义
# 视图函数可以接受url传递的参数
def cars(request, name, power):
    return HttpResponse("<h3>车:" + name + ", 马力:" + power + "</h3>")
  • 若此时在浏览器中仅仅输入/helloapp/cars/会显示404 not found因为我们定义的cars函数需要传递两个参数即name和power,这就是url传参(127.0.0.1表示本地计算机相当于localhost,8888表示端口号为8888

在这里插入图片描述

  • 接着我们来看日志信息:GET请求方式,/helloapp/cars/是请求路径(路径是从端口号后面开始的),HTTP/1.1请求方式,404是http的状态码,2328是传输信息的长度

在这里插入图片描述

2、**re_path()**方式

如果使用re_path()方式做路由捕获,注意!

  • 有多个参数时需要用()分组<>内的是这个组的名字
  • ?P是匹配模式
  • <>后面的是匹配规则,[a-z]表示规则是匹配a到z的字符,而*表示可以匹配多个
  • 最后的run是视图函数名(下图是在子路由文件中编辑)
re_path(r'run/(?P<name>[a-z]*)/(?P<speed>[0-9]*)', run)
三、路径选择器

1、int转换器

  • 首先在子路由的urlpatterns列表里添加一个path(),视图函数为add

在这里插入图片描述

  • 现在我们打开view.py,定义add函数

    def add(request, a, b):
        c = a + b
        return HttpResponse("<h3>计算结果:" + str(c) + "</h3>")
    
  • 然而运行时却出现了这样的问题:出入参数为2和3,加和后的结果却是23,问题出在没有对传入的参数进行转换,而是当作字符串拼接去处理的

在这里插入图片描述

  • 现在我们修改一下path(),在参数前面加上"int:",这是int选择器

    path('add/<int:a>/<int:b>', add)
    
  • 再次运行发现结果正确了

    在这里插入图片描述

2、path转换器

  • 我们首先仍然是在子路由的urlpattern类表中添加path函数,我们设定视图函数名为path_convert

    path('path/<msg>/', path_convert)
    
  • 我们在view.py文件中添加对视图函数path_convert()的如下定义:(再次强调,视图函数的第一个参数必须是请求对象,这里我们写成request)

    def path_convert(request, msg):
        return HttpResponse("接收到的内容是:"+msg)
    
  • 尝试运行第一次,url传参为"a",结果如下:

在这里插入图片描述

  • 运行成功!

  • 尝试运行第二次,url传参为"a/b",结果如下:

在这里插入图片描述

  • 结果分析:我们传递的参数是a/b,然而,浏览器把a变成msg了,而把b当成另外一个url地址了,所以找不到了(特殊字符”/“会有影响)

  • 解决办法:我们在msg前面加一个path转换器

    path('path/<path:msg>/', path_convert)
    
  • 运行结果如下:
    在这里插入图片描述

!这样就运行成功啦!

  • 我们在子路由urlpattern列表中进一步修改一下path(),添加了一个参数

    path('path/<path:msg>/<info>', path_convert)
    

    对view.py文件中的path_convert()视图函数定义如下:

def path_convert(request, msg, info):
    return HttpResponse("接收到的内容是:" + msg + "细节是:" + info)
  • 试运行第一次:(这里我们认为a/b作为传入msg的参数,而c作为传入info的参数)

在这里插入图片描述

​ - 试运行第二次:

在这里插入图片描述

<小结>:我们发现在添加了path转换器之后,无论添加多少个”/“都会作为msg被捕获,只有最后一个c是作为info

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值