Django框架核心机制详解:URL反向解析、路由分发与模板语法
本文深入解析Django框架的核心机制,涵盖URLconf映射原理、反向解析以简化路径维护、多应用路由分发策略、正则表达式分组传参(无名与有名)以及redirect重定向流程。同时详细讲解模板层中通过句点符访问列表、字典及对象属性的方法,并提供完整代码示例与执行逻辑分析,帮助开发者掌握Django后端开发关键技能。
本文整理了作者在学习Python Django框架过程中的详细笔记,包含测试代码的深度剖析以及最终的学习总结,内容详实,具有较高的参考价值。
URL配置(URLconf)相当于Django支撑网站的目录结构。其核心在于建立URL与对应视图函数之间的映射关系,即明确告知Django:当访问特定URL时,应执行哪段代码。
'''
urlpatterns = [
url(正则表达式, views视图函数,参数,别名),
]
参数说明:
一个正则表达式字符串
一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
可选的要传递给视图函数的默认参数(字典形式)
一个可选的name参数
'''
一、URL的反向解析
如前所述,URL中的正则表达式代表请求路径,系统根据路径匹配结果执行相应的视图函数。例如,当请求路径符合正则表达式定义时,系统将调用对应的login函数。

其中,login函数的具体实现如下:

login.html模板文件内容如下:

基于上述代码逻辑,当用户通过GET请求访问/login/路径时,系统执行匹配该路径的login()函数,并渲染login.html登录页面。当用户验证信息后点击提交按钮,系统将以POST形式再次请求/login/路径对应的login()函数。
然而,若需修改请求路径的正则表达式(即更换URL路径),则需同时更新URL配置中对应的正则表达式以及login.html中的提交路径。若项目中多处引用/login/路径,逐一手动修改显然效率低下且易出错。为此,引入反向解析机制,利用URL别名参数解决此问题,具体实例如下:


上述机制即为反向解析。无论URL中的请求路径如何变更,只要别名保持不变,程序中对该函数的请求均可通过别名进行反向解析,从而自动定位到正确的视图函数。
二、包含其他URLconfs
在Django项目中创建应用的命令为:
python manage.py startapp app01(app01为项目名)
Django项目初始化后,默认生成一个urls.py文件,用于映射不同请求路径对应的函数。但当项目中包含多个应用时,将所有应用的URL映射关系集中在此文件中会导致耦合度高、维护困难。此时,应在主urls.py文件中配置“包含其他URLconfs”,使各应用的URL映射关系独立存放于各自应用目录下的urls.py文件中,实现代码解耦。配置示例如下:

在此架构下,访问应用路径映射函数的示例如下:

三、正则字符串参数
1、无名分组
在正则表达式中使用一对括号可实现分组,并获取分组参数。示例如下:
url(r'^articles/(\d{4})/(\d{2})/$', views.articles2), #articles2(request,组1参数,组2参数)
当请求路径为http://127.0.0.1:8000/app01/articles/2004/12/且符合上述正则表达式时,系统将执行articles2(request, 2014, 12)函数。这意味着定义articles2函数时必须接收三个参数,映射过程按位置传参。函数实例如下:
def articles2(request,year,month): return HttpResponse(year+"---"+month)
2、有名分组
前述示例使用未命名的正则表达式组(圆括号)捕获URL值,并以位置参数传递给视图。更高级的用法是使用命名正则表达式组,以关键字参数形式传递值。在Python正则表达式中,命名组的语法为(?P<name>pattern),其中name为组名,pattern为匹配模式。
url(r'^articles/(?P<y>\d{4})/(?P<m>\d{2})/$', views.articles3) #articles3(request,y=对应参数,m=对应参数)
当请求路径为http://127.0.0.1:8000/app01/articles/2004/12/且符合上述正则表达式时,系统将执行articles3(request, y=2014, m=12)函数。定义articles3函数时必须接收三个参数,且参数名必须为y和m,映射过程按关键字传参。函数实例如下:
def articles3(request,y,m): #参数y和m必须与分组名一致,因为是按照关键字传参,位置随意 return HttpResponse(y+"-----"+m)
四、redirect函数
redirect()函数用于重定向,以下结合第一部分登录实例说明其执行过程:
第一次网页请求:
请求url: http://127.0.0.1:8000/login/ 请求类型:GET 无请求数据
login/-------> views.login------>login()
响应到一个login.html页面
第二次按钮提交:
请求url: http://127.0.0.1:8000/login.html/ 请求类型:POST 有请求数据 {"user":"alex","pwd":"123"}
login.html/-------> views.login------>login()
响应的return redirect("/index/")到浏览器,通知浏览器再发送请求:"/index/"
请求url: http://127.0.0.1:8000/index/ 请求类型:GET 没请求数据
index/ --->url(r'^index/', views.index),---->index()
响应一个index.html
通过分析上述流程可知,重定向函数在重定向过程中实际涉及两次响应:第一次响应告知浏览器重新发送请求至目标路径;第二次响应为浏览器发送重定向路径请求后返回的结果。
五、模板层
1、模板语法之变量
在Django模板中遍历复杂数据结构的关键是句点字符(.)。不同数据类型的数据通过句点符取值的方式如下例所示:
def index(request):
lis=[111,222,333]
dic = {"name": "alex"}
class Person():
def __init__(self,name,age):
self.name=name
self.age=age
def dream(self):
return ("dream.....")
alex=Person(name="alex",age=34)
egon=Person(name="egon",age=9000)
nacha=Person(name="nacha",age=3)
person_list=[alex,egon,nacha]
return render(request,"index.html",{"lis":lis,"dic":dic,"person_list":person_list})
index.html文件内容如下:
<body>
<hr>
<p>{{lis.2 }}</p> //通过索引取,结果:222
<p>{{ dic.name}}</p> //通过key取,结果:alex
<p>{{ person_list.1.name }}</p> //通过索引取到对象,通过对象属性取到属性值
<p>{{ person_list.1.age }}</p>
<hr>
{% for person in person_list %} //通过循环取到对象,根据对象属性取到属性值
<p>{{ person.name }},{{ person.age }}</p>
{% endfor %}
<hr>
{{ person_list.1.dream }} //可以取到对象的方法,前提是此方法不需要参数,且有返回值,且取值时不需要括号
</body>
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













