欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Django视图层之路由转发

程序员文章站 2024-03-12 23:56:21
...

路由转发

一.路由转发

通常,我们会在每个APP里创建各自的一个url.py路由模块,然后,从根路由出发,将APP所属的url请求全部转发到相应的url.py模块中。
我们先了解一些Django网站本身的URLconf根路由。

from django.url import path,include
urlpattterns =[
	path('community/',include('aggregator.urls')),
	path('contact/',include('contact.urls')),
]

路由转发使用的是include()方法,需要提前导入,它的参数是转发目的地路径的字符串,路径以圆点分割
django遇到include()时候,他会去掉URL中匹配的部分,并将剩下的字符串发送给include的URLconf做进一步处理,转发到二级路由去
另外一种转发其他URLconf的方式是使用一个path()实例的列表

URL调度器:
为了给应用设计URL,我们需要创建一个python模块,称为URLconf。这个模块是纯粹的python代码,包含URL模式到python函数的简单映射。

我们使用path()实例的列表是我们在APP的应用中具体写的,path()函数中,第二个位置的参数,变成了一个APP内的视图函数的实例列表,进行函数处理。这相当于把二级路由模块内的代码写到根路由模块里,不是很推荐。
同时,如果路由的前缀基本相同的时候,我们可以只需要声明共同的路径前缀一次,并将后面的部分分组转发到相应的路由上,即可。

from django.urls import path,include
from . import views
urlpatterns = [
	  path('<page_slug>-<page_id>/history/', views.history),
    path('<page_slug>-<page_id>/edit/', views.edit),
    path('<page_slug>-<page_id>/discuss/', views.discuss),
    path('<page_slug>-<page_id>/permissions/', views.permissions),
]
#转换为:以下简单形式。
urlpatterns = [
	path('<path_slug>-<page_id>/',include([
		path('history/',views.history),
		path('edit/',views.edit),
		path('discuss',views.discuss),
		path('permissions/',views.permissions),
		]))
]

二.捕获参数

目的地URLconf会受到来自父URLconf捕获的所有参数。然后将变量传递给include()指定的URLconf,在进一步传递给对应的视图。

三.想视图传递额外参数

URLconf具有一个钩子,允许你传递一个python字典作为额外的关键字参数给视图函数。(字典具有键值对)

from django.urls import path
from. import views
urlpatterns = [
	path('blog/<int:year>/', view.year_archive,{'foo':'bar'}),
#在上面的例子中,对于/blog/2005/请求,将调用django.views.year_archive(request,year=2005',foo = 'bar').理论上你可以在这个字典里传递任何你想要的传递的东西,但是,URL模式捕获的明明关键字参数和在字典中传递的额外参数可能具有相同的名称,这样会发生冲突,将**使用字典的参数来代替捕获的参数**
]

四传递额外的参数给include()

类似上面的,也可以传递额外的参数给include(),参数会传递给include指定的urlconf中的每一行

django中传递参数给视图函数的方式主要分为以下两种方式:URL传参和非URL传参。第一种基于Django的URLconf配置,可以通过URL路径将对应的匹配参数传到视图函数中;而另外一种就是属于HTTP请求携带的参数了。请求参数可以放到URL中以?格式加到URL最后面,也可以将参数放到请求body中,最后同意由视图函数中的request参数保存并存到视图函数中。

动态URL传参

在URL路径部分可以作为动态参数,传递给视图函数。
from django.urls import path
from . import views
urlpatterns = [ path('articles/<int:year>/',views.year_archive),]
注意上面定义了三个动态URL的映射,每个动态URL会匹配一个或者多个参数,每个动态值使用<>符号匹配,采用type:name
正则表达式URL匹配和前面的普通动态URL匹配有一个非常重要的区别,基于正则表达式的URL匹配一旦成功,就会直接跳转到视图函数,但是普通的URL匹配则会找到最长匹配的动态URL,然后再进入相应的视图函数去处理。
而这个就是支持正则表达式的re_path()方法和普通匹配格式的path()方法的区别

URLconf传递额外参数

类似上面,也可以传递额外参数给include()。参数会传递给include指向的urlconf的每一行。
注意:只有当你确定被include的URLconf中的每个视图都接受你传递给它的参数的时候才有意义。

# project/urls.py
from django.urs import path
urlpatterns = [
	path('blogs',include(inner),{'blog_id:3})
]
# APP_inner.py/url.py
from django.urls import path
from . import views
urlpatterns = [
	path('archive/',views.archive),
	path('about/',views.about),
]
#等同于以下配置
#djangoproject.url.py
from django.urls import path
from mysite import view
urlpatterns=[
	path('blog/',include('inner')),
]
#inner.py
from django.url import path
urlpatterns = [
	path('archive/',views.archive,{'blog_id':3}),
	path('about/',views.about,{'blog_id':3}),
]
相关标签: django