一、django URL 简介
django中的路由系统,使用urls中的urlpatterns进行配置,
urlpatterns = [
url(正则表达式, views视图函数,参数,别名),
]
参数说明:
一个正则表达式字符串
一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
可选的要传递给视图函数的默认参数(字典形式)
一个可选的name参数
它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。
二、注意事项及分组
django2.0以前的版本,使用的是url,而2.0版本开始,使用path和re_path方法路由:
path字符串直接路由,和re_path正则匹配路由,都将request对象作为第一个参数传递给视图views,
另外,re_path需要注意:
1、正则表达式最好以^开始、/$结束,结尾/是必须的,因为客户端URL传递至服务器端匹配前,会自动添加/表示正则内容结束,
2、正则表达式前的r字符是可选的,表示不对其中的内容进行转义,建议添加,
3、正则中用()分组,()包含起来的部分作为参数传递给views,需要注意接收(接收到的是字符串类型),可同时传递多个分组内容,
4、除了()直接简单分组,还可以使用(?P<name>****)进行命名分组,捕获的值作为关键字参数而不是位置参数传递给视图函数,
from django.contrib import admin from django.urls import path,re_path from app01 import views urlpatterns = [ # 默认路由 path('admin/', admin.site.urls), # 自定义路由 path('index', views.index), re_path('^articles/[0-9]{4}/$', views.year_archive), re_path('^articles/[0-9]{4}/([0-9]{2})/$', views.month_archive), re_path('^articles/[0-9]{4}/([0-9]{2})/([0-9]+)/$', views.date_archive), re_path('^articles/(?P<month>[0-9]{2})/(?P<day>[0-9]+)/$', views.date_detail), ]
from django.shortcuts import render from django.http import HttpResponse # Create your views here. def index(request): print(request.method) return HttpResponse('最简单的路由:非正则匹配,request对象作为第一个参数') def year_archive(request): print(request.method) return HttpResponse('正则匹配:需以/结尾,客户端url在匹配前会自动添加/表示正则结束,') def month_archive(request,month): print(request.method) print(month) return HttpResponse('正则简单分组:其中以()包含起来的部分作为参数传递给视图,需要接收') def date_archive(request,month,day): print(request.method) print(month) print(day) return HttpResponse(month+day) # 简单分组按顺序匹配传递的参数 def date_detail(request,day,month): print(request.method) print(month) print(day) return HttpResponse(month+day) # 命名分组根据指定名称匹配参数
三、路由分发
django的一个项目中,通常有多个应用app,不同的app彼此解耦,
项目较大时,可以将不同应用app的路由统一至应用中分发,即使用二级路由,
具体实现方式如下:
1、在项目urls中导入include方法,使用include方法将不同正则表达式对应的路由,分发至相应的应用,
re_path(r'^blog/',include('app01.urls')),
2、在各应用中新建urls.py文件,导入本应用的views,并指定具体路径:
re_path('name',views.name),
3、在本应用的views中,实现方法并使用
# app02.views from django.http import HttpResponse from django.shortcuts import redirect def key(request,user): print(request.method) return HttpResponse(user) def value(request): print(request.method) return redirect('/index') # app01.views from django.shortcuts import render,render_to_response def index(request): print(request.method) return render(request,'index.html') # 支持csrf的处理,避免跨站请求伪造,下面render_to_response不行 def name(request): name = 'lucy' return render_to_response('name.html',locals()) # locals()将本函数内的所有变量提供给模板语言使用
4、可以127.0.0.1:8000/blog/name的方式访问
浙公网安备 33010602011771号