Django 路由系统之动态路由

写在前面

首先我们要知道,在Django框架中有一个配置文件叫url.py,这个文件里面操纵的就是我们的路由系统。他是用于记录 Django 项目的 URL 映射关系,也就是说,这个文件里面实现了url和我们view.py文件中函数的对应关系。下面我们就来具体说下他们是怎么实现对应的

一、一一对应

在url.py文件中,使用这样的格式,就能实现url和view中函数的一一对应关系:如/login/->def login

urlpatterns = [
    # path('admin/', admin.site.urls),
    path('select_class/', views.select_class),
    path('add_class/', views.add_class),
    path('del_class/', views.del_class),
    ]

如上,我们就实现了如url select_class/和函数views.select_class的一一对应关系,我们在网站输入select_class/的url时,Django后台就会去view.py文件中找相对应的select_class函数,实现其功能后,再把返回的数据传递给前端,待前端页面渲染完毕后,展示在我们的浏览器上。

二、url里面加正则表达式

  • 单个正则

但通常情况下我们需要实现的功能仅靠url与函数一一对应是实现不了的,比如我们需要动态的去更改url,此时就需要在url里面添加正则表达式,再在对应函数中添加一个参数去接收正则表达式的部分。格式如/add-user/(\w+)/ -> def add_user(request, add_user)

# url.py
urlpatterns = [
    # path('admin/', admin.site.urls),
    path('select_class/(/w+)/', views.select_class),
]

# view.py
def select_class(request, s_c):
    print(s_c)
    class_list = mysql_oper.get_all_data("select id,title from class", [])
    return render(request, 'select_class.html', {'class_list': class_list})

如上,url.py文件中select_class/(/w+)/中的正则表达式中的值就会传递给view.py文件中select_class函数的s_c参数,此时在浏览器中输入select_class/任意数字字母下划线字符,后台就会去执行select_class函数,而执行的url就是select_class/任意数字字母下划线字符

  • 多个正则

到这里可能大家又要想,我url可以传一个正则表达式,可以传两个吗?答案是可以的

第一种:格式如/add-user/(\w+)(\w+)/ -> def add_user(request, add_user1, add_user2)。这里需要注意的是,正则表达式和函数中的参数必须是按顺序依次匹配的。即在url中填入的第一个正则表达式的字符传递给函数中第一个参数,url中填入的第二个正则表达式的字符传递给函数中第二个参数。当然我们在函数中也可以使用可变参数,这时url中的正则就会默认传递给相对应的可变参数中。如:/add-user/(\w+)(\w+)/ -> def add_user(request, *args,**kwargs)

第二种格式:/add-user/(?P<a1>\w+)(?P<a2>\w+)/ -> def add_user(request, a1, a2) 这样写后,就不需要一定按照顺序,系统会自动用P所对应的正则表达式去找函数中的a1形参,a2是同样的道理。当然我们在函数中也可以使用可变参数,这时url中的正则就会默认传递给相对应的可变参数中。如:/add-user/(\w+)(\w+)/ -> def add_user(request, *args,**kwargs)

需要注意的是,两种格式不能混合使用。比如不能像这种:/add-user/(\w+)(?P<a2>\w+)/ -> def add_user(request, a1) 这样就会提示找不到函数中的参数。即使是函数中使用可变参数作为形参也不行噢。

三、url后面的/和$

urlpatterns = [
    # path('admin/', admin.site.urls),
    path('select_class/', views.select_class)
    ]

我们还是拿上面这个代码例子来说,path函数参数里面的’select_class/‘如果最后没有’/’,会是什么情况呢?
其实这个url里面填写的字符串就相当于一个正则表达式。如果不填’/’,那么我们网站输入url时输入select_class可以匹配到views.select_class,输入select_classhjjasj也可以匹配到views.select_class。因为代码只判断匹配到了select_class就判定匹配成功。

所以如果我们需要填写’/’,另外还有一种方法是在结尾写死'$'以示结束,也是同样的道理,代码查询到'$',就会认为匹配到select_class就结束了,如果后面字符就会判定为匹配失败。

四、.html

上面我们说了,url里面其实是一个字符串,那我们就可以随便指定字符串的内容,用户在浏览器里面输入网址后,Django只需要判断这个url字符串和代码里面的url字符串是否匹配,如果匹配就执行函数。所以在上面的代码中,我们完全可以把url改为select_class.html,那为什么需要这么改呢?

加了.html的url渲染出来的网站叫静态网站,静态网站最大的特点是快,因为静态网站只要前端网页一访问,只需要去模板里面拿到数据就可以直接展示出来。而且静态网站的seo级别也是很高的。所以我们把代码里的url改为select_class.html,就可以造一个伪静态网站,就比一般的网站快很多。如下面代码,记得加'$'

urlpatterns = [
    # path('admin/', admin.site.urls),
    path('select_class.html$', views.select_class)
    ]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值