Django框架03

Django请求生命周期流程图

 

 

 

路由层之路由匹配

       1.路由自上而下进行匹配

  2.url(正则路径,视图函数内存地址,默认参数,路由别名)

  Django服务开启后,打开浏览器,输入url地址,向服务器发送请求,此时服务器拿到当前请求的url地址(例如:http://127.0.0.1:8801/index),Django通过对项目中的urls模块进行配置,对请求拿到的url地址进行解析,分发至对应的函数中,完成业务逻辑,实现功能。

  在urls模块中的 urlpatterns列表中存放着正则路径,视图函数地址,默认关键字参数(可选),路由别名(可选)。

       有一个url地址 http://127.0.0.1:8801/login,需要执行的是页面的登录功能,那么在对应的功能模块(app)的views存放着实现这个登录功能的login函数,那么有以下几种可以匹配到此功能的路由写法:

1、功能参数不需要传参

# url(r'^login$', views.login) 只能匹配login,不能匹配index/
# url(r'^login/$', views.login)能匹配login/,也能匹配login(先拿index匹配,如果失败,会添加/再次匹配)

在settings中添加APPEND_SLASH = False 会导致Django不会自动添加/,也可以将settings中将'django.middleware.common.CommonMiddleware'
注释掉

2、功能参数需要传参

#url(r'^login/$', views.login, {'num': 88888})   此处为关键字参数

#功能函数为如下:
def login(request,num):
    pass

路由正则:

复制代码
1.规定开始:^  |  规定结束:$
url(r'index', views.index) => /index/ | /aindex/ | /indexb/ | /aindexb/ 均能匹配
url(r'^index', views.index) => /index/ | /indexb/ 能匹配
url(r'^index/$', views.index) => /index/ 才能匹配

2.无名分组:^delete/(\d+)/(\d+)$
路由:url(r'^delete/(\d+)/(\d+)$', views.delete)
请求路径:/delete/1/2
视图函数:def delete(request, n1, n2) => n1可以拿到请求路径中的1,n2拿到2

3.有名分组:^delete/(?P<id>\d+)/(?P<num>\d+)$
请求路径:/delete/1/2
视图函数:def delete(request, id, num) => 只能用id,num变量接收1、2

注:路由正则不支持有名无名分组混用
复制代码

无名有名分组

在我们平时浏览网页的时候会发现在一些网址后后面后添加着一些数字(我们将这些页面称之为子页面,这些数字可能是为功能函数提供某个参数,或者是数据库中的某个数据的一个数据),例如:http:www.xxx.xxx/1/2,那么这种句子的匹配应该如何匹配呢,这就需要使用到有名无名分组了。

复制代码
# 无名分组:/testnoname/10/
url(r'^testnoname/(\d+)/$', views.testnoname)  
# def testnoname(request, var)  # var=10

# 有名分组:/testname/10/1/
url(r'^testname/(?P<num>\d+)/(?P<page>\d+)/$', views.testname)  
# def testname(request, page, num)  # page=1 num=10

# 注:不能混用
复制代码
复制代码
无名分组:
url(r'^login/(\d+)$',views.login)

#功能函数为:
def login(request,var):
    print(var)
    return render(request,'login.html')

#最终对应的url如下:http://127.0.0.1:8802/10/20,有名分组与其一致,不过在有名分组中多个参数,在功能函数中只按名字对应,位置前后不会影响
值的顺序。
复制代码

运行服务器,在浏览器中输入http://127.0.0.1:8802/login/10/这个地址之后,会成功跳转至登录页面,并且在login函数中传入10这个值。

复制代码
有名分组:
url(r'^login/(?P<num>(\d+))$',views.login)

#功能函数为:
def login(request,num):
    print(num)
    return render(request,'login.html')

#注意:有名分组中的num名字必须与函数中的参数名对应,否则会参数错误
复制代码

 

反向解析

复制代码
from django.shortcuts import reverse
在视图函数中通过reverse方法反向解析出真实的路径

# 1.不带分组:url(r'可能会变的真实路由', 视图函数, name='路由别名')
url = reverse('路由别名')

# 2.无名分组:url(r'可能会变的真实路由(带无名分组)', 视图函数, name='路由别名')
url = reverse('路由别名', args=(给无名分组赋值))

# 3.有名分组:url(r'可能会变的真实路由(带有名分组)', 视图函数, name='路由别名')
url = reverse('路由别名', kwargs={给有名分组赋值,key就是有名分组名})
复制代码

 

路由分发

复制代码
# 分担总路由的代码压力, 将每个app的自身路由配置交给app自己的ulrs.py来管理(分文件管理路由)

1.在每一个应用中建立自身的urls.py文件,语法同主路由
2.在主路由进行分发
from django.conf.urls import include
urlpatterns = [
    url(r'^app01/', include('app01.urls')),
    url(r'^app02/', include('app02.urls')),
]
# 注:主路由分发一定不能使用$正则语法 (错误eg: ^app01/$)
复制代码

名称空间

复制代码
主路由:
from django.conf.urls import include
urlpatterns = [
    url(r'^app01/', include('app01.urls', namespace='app01')),
    url(r'^app02/', include('app02.urls', namespace='app02')),
]

app01应用下路由
from django.conf.urls import url
from app01 import views
urlpatterns = [
    url(r'^test/', views.test, name='test')
]

app02应用下路由
from django.conf.urls import url
from app02 import views
urlpatterns = [
    url(r'^test/', views.test, name='test')
]

前端页面反向解析:{% url 'app01:test' %} | {% url 'app02:test' %}
视图函数reverse方法:url = reverse('app01:test') | url = reverse('app02:test')
复制代码

 

posted @   *sunflower*  阅读(66)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示