Django框架的url路由规则系统(七)

一、 urls.py的作用(项目目录下的urls.py为根配置)

1、 URL配置(URL conf)就像是Django所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表。以这样的方式告诉Django,对于那个URL调用那段代码。url的加载就是从根配置文件中开始。
2、注意事项:

  • 当一个请求来到时,首先先到项目目录下的urls.py(根URLconf模块)中,查找相应的路由规则。在urls.py中urlpatterns是一个列表,它里面的每个元素就是一个路由规则。
  • 根配置模块中,里面定义了urlpatterns变量。
  • urlpatterns里面含有django.urls.path,django.urls.re_path对象。
  • 按顺序运行每个url路由规则,在被第一个匹配的url的规则(模式)匹配后停止。
  • 一旦匹配成功,django导入并且调用给定的视图。
  • 如果中间出错误或则没有匹配到相应的路由规则,返回404。

二、url(路由规则)例子

1、在项目目录下urls.py文件中写路由规则


2、在项目目录创建了一个views.py文件

3、在地址栏中输入url来进行访问django服务器
注意:只有当你输入的url跟后台配置的url一致才会调用url对应的视图函数。当地址为:127.0.0.1:8000/test/python

三、 path方法的基本规则(重点):

1、示例:path('test/<xx>/',views.test)

  • 使用尖括号(<>)从url中捕获值。包含一个转化器类型(converter type),将匹配任何字符串,当然也包括了 / 字符。
  • 当前面的url匹配成功后就会调用后面的视图函数。

2、基本格式:path(route,view,kwargs=None,name=None)

  • route:是一个字符串形式的url规则。
  • view:是一个视图函数。
  • kwargs:是一个额外参数,传递给view,必须是一个字典形式。
  • name:url的命名。

3、在url中捕获参数

  • 在url规则中可以使用'<对应视图函数的参数>'就可以捕获url中的值,传递给相应的视图函数。

4、类型转化器

  • 主要将捕获的url转化为相应的类型。

四、path方法中支持的转换器

  • str
    匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式。
  • int
    匹配正整数,包含0。
  • slug
    匹配字母、数字以及横杠、下划线组成的字符串。
  • uuid
    匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
  • path
    匹配任何非空字符串,包含了路径分隔符。

五、转换器的使用

1、设置url路由规则:
path('test/<int:xx>/',views.test3)#指定被捕获的参数为整数类型。
2、在视图中将获取到的参数和参数的类型打印出来:

def test3(request,xx):

    print(xx,type(xx))

    return HttpResponse('hello %s'%xx)

注意:注意:xx名称必须要一致。
3、完整示例:

path('detail/<pk>-<slug>/', views.detail) #可以用-来连接,但是参数必须位置相同。
def detail(request, pk, slug):   
        return HttpResponse('这是第%s个学生,%s太坏了'% (pk, slug))

六、re_path方法的正则匹配

1、urls.py文件中的代码

re_path('^hello/$',views.test5),

re_path('^hello/(?P<yy>[0-9]+)/',views.test6),

2、views.py文件中的代码

def test5(request):

    return HttpResponse('这是用的re_path设置的')

def test6(request,yy):

    print(yy,type(yy))

    return HttpResponse('hello %s'%yy)

3、注意注意:

  • re_path(r'students/(?P<year>\d{4})/(?P<month>[0-9]|1[0-2])/', views.students),当分了组就要和位置参数一一对应,不分组和关键字参数一一对应。
  • django的url只搜索路径部分,跟参数以及请求方法无关。

七、项目目录下和app下的urls.py

1、一个url对应一个视图函数,但我们的视图越来越多时,url也就越来越多。

2、include的作用:一个project有一个总的urls.py,各个app也可以自己建立自己的urls.py,用include()函数在project的urls.py文件进行注册。

3、include使用的例子如下:

  • 项目目录下的主urls.py
from django.contrib import admin
from django.urls import path,include
from . import views
urlpatterns = [ path('admin/', admin.site.urls), path('book/',include('book.urls')),] 
  • 为APP中books里面的urls.py
from django.urls import path

from . import views

urlpatterns = [ path('index/',views.index), ] 
  • 为APP中books里面的views.py
from django.http import HttpResponse
def index(request):
return HttpResponse('这个book的首页!!')

八、kwargs参数的作用

1、kwargs传递一个Python 字典作为额外的参数传递给视图函数。

# 主urls.py文件
from django.contrib import admin
from django.urls import path,include
urlpatterns = [ path('admin/', admin.site.urls), path('book/',include('book.urls'),{'switch':'true'}),]

2、Kwargs为字典类型可以传递额外的参数到views中使用,include的时候需要统一给下面的url一些参数的时候可以用此参数。并且视图函数中可以通过关键字参数获取到。

# 为APP中books里面的views.py
from django.http import HttpResponse
import datetime
def index(request,**kwargs):
    if kwargs.get('switch') == 'true':
        print(datetime.datetime.now())
    return HttpResponse('这个book的首页!!') 

3、注意事项

  • 在path,re_path方法中,可以向视图函数传递一个kwargs字典参数。
    当kwargs中的key与url捕获的key一致的时候,以kwargs中的key为主。
re_path(r'students/(?P<year>\d{4})/(?P<month>[0-9]|1[0-2])/', views.students, kwargs={'swich': True})
ef students(request, year, month, swich):

        return HttpResponse('这是%s年%s月%s'% (year,month, swich))
  • 如果是在根配置urls.py中的话,即如下面所示:
urlpatterns = [ path('admin/', admin.site.urls), path('teacher/', include('teacher.urls'),kwargs={'swich': True})]

这样就会给teacher子应用的每条路由规则传一个{'swich': True}参数,有的时候业务需求要。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • 一、前言 在django程序中,可以通过urls.py文件对所有的url进行任务的分配,URL配置(URLconf...
    NewForMe阅读 542评论 0 0
  • 若能避开猛烈的狂喜,自然也不会有悲伤的来袭。   URL配置(URLconf)就像Django 所支撑网站的目录。...
    一个无趣的人W阅读 631评论 0 1
  • 一,url路由path及转化器 URL(uniform Resoure Locator)统一资源定位符,是对可以从...
    木叶望将阅读 2,303评论 0 1
  • URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应。在Djan...
    汪菲宇阅读 661评论 0 0
  • 仇靖下了朝,和术冕商谈水运之事,宫女慌慌张张的跑来禀告。 “陛下,尘公子被顾大人带走了!” “什么!”仇靖一愣,微...
    木南思阅读 416评论 1 1