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