Django的MTV的模式三大层之一,视图层(url映射)基础(四)

Django视图层衔接了HTTP请求、后台程序以及前端HTML模板等内容,URLdispatcher(URL分布)映射配置又是Django整体项目的入口配置,即URLdispatcher是用来指定用户访问后台python处理函数的控制器。

1、正则表达式

在url映射的配置中,对于HTTP路径的配置就要使用到正则表达式。
正则表达式一般是用来匹配一段符合要求的字符串或者URL。
大家可以看这篇博文来学习正则表达式。
Python-强大的正则表达式,让你快速匹配字符串

使用正则表达式可以快速正确的匹配上符合要求的URL,避免URL映射失败或者错误。

注意注意注意:
Django2.0以后就可以不使用正则来匹配URL,但是在之前的版本是需要使用正则来匹配URL,并且目前2.0还没有弃用URL配置来=方式

2、一般URL映射

from django.urls import path
import app1.views
urlpatterns = [
    path('app1/', app1.views.helloword),
]

如上所示的urls.py文件,此文件是用来维护URL分布的,映射的实现就是在urlpatterns 列表中中完成。
path()

  • 第一个参数就是HTTP路径,
  • 第二个参数就是要映射的后台Python函数

Django对于一般的URL映射还有一种方式,即对URL中的参数经行命名设置,在给予不同的映射,这样对于开发者来说,可以对参数的实际意义清晰明了,具体示例如下:

import app1.views
urlpatterns = [
    path('year/2018', app1.views.today_2018),
    path('year/<int:year>',app1.views.year_today),
    path('month/<int:year>/<int:month>',app1.views.month_today)
]

上诉示例中后两个path()对参数经行了命名设置,在views.py中函数的编写形式就应该是year_today(request,year=xxxx)和 month_today(request,year=xxxx,month=xx)。

注意注意注意:

	当一个URL映射到多个函数时,Django会按**顺序排列**,即第一个匹配的为最终的映射函数。
	例如上述的year/2018时可以匹配第3和第4行两个映射,但Django最终判定的时第三行的映射,
	即调用today_2018()函数。

3、分布式URL映射

在django学习或者运用中,将会遇到一些大型的项目,一个项目含有多个APP,所有的映射都定义在项目的urls.py文件中,一方面会造成整体的映射路径混乱,另一方面不利于网站的维护。因此Djiango提供了另一个中映射------分布式映射,即映射可以编写在不同的urls.py文件中,然后通过**include()**函数经行分布式映射,例如:

"""
项目下的urls.py
"""
from django.urls import path,include
urlpatterns = [
			path('app1/',include('app1.urls')),
			path('app2/',include('app2.urls'))
]

app1应用下的urls.py

"""
app1应用下的urls.py
"""
import app1.views
urlpatterns = [
    path('year/2018', app1.views.today_2018),
    path('year/<int:year>',app1.views.year_today),
    path('month/<int:year>/<int:month>',app1.views.month_today)
]

app2应用下的urls.py

"""
app2应用下的urls.py
"""
import app2.views
urlpatterns = [
    path('year/2018', app2.views.today_2018),
    path('year/<int:year>',app2.views.year_today),
    path('month/<int:year>/<int:month>',app2.views.month_today)
]

上诉中,在不同的urls.py中可以映射本身APP的函数,当然也可以包含其他App的映射。
不同的应用对应不同的映射。

4、反向解析

Django中URL映射到后台视图函数的功能及方法非常丰富多变,但除此之外Django还提供反向解析功能,即视图函数解析出对应得URL。这项功能让开发者无需纠结于URL得绝对路径,直接使用映射名即可,大大提高了代码得可维护性。
(1)普通反向解析

import app2.views
urlpatterns = [
    path('year/2018', app2.views.today_2018,name='today_2018'),
]

在模板文件中调用{%url%}标签来调用反向解析,通过上述示例中的name参数将映射命名为’today_2018‘,然后再模板文件中先进行声明。如下:

<a href={% url 'today_2018'%}>显示2018年的情况</a >

其中再python中的反向解析是通过reverse()函数(views.py中)实现

from django.shortcuts import reverse
from django.http import HttpResponseRedirect
def _to_year(request):
    return HttpResponseRedirect(reverse('today_2018'))

上述模板反向解析的结果如下:

<a href='/year/2018'></a>

(2)带参数得反向解析
对于带参的反向解析,同样是先定义URL映射规则

urlpatterns = [
    path('year/<int:year>',app1.views.year_today,name='year_today'),
    ]
<a href={% url 'year_today'2019%}>显示2019年的情况</a >

其中再python中的反向解析是通过reverse()函数(views.py中)实现

from django.shortcuts import reverse
from django.http import HttpResponseRedirect
def _to_year(request):
    return HttpResponseRedirect(reverse('year_today',args=(2019,)))

其中reverse()函数中的args是用于设置URL中的参数。
上述模板反向解析的结果如下:

<a href='/year/2019'></a>

这里的反向解析,自我认知就是根据你的url来确定模板

希望这篇博文对你有用!
谢谢点赞评论!

猜你喜欢

转载自blog.csdn.net/qq_44936246/article/details/119937646