一、 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服务器
三、 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}参数,有的时候业务需求要。