第三章 初探路由
3.1路由定义相关规则
URL:统一资源定位符
完整的路由包括:路由地址,视图函数(类),可选变量和路由命名
3.1.1 Django2.x路由定义:
在app里新建urls.py文件,将属于该app的路由写在该urls.py文件。工作原理:
(1)运行项目时,Django从项目文件夹下的urls.py找到各个app定义的路由信息,生成完整的路由列表
(2)用户访问某个路由时,Django收到请求信息,从该请求中获取路由地址,并在路由列表里匹配对应的路由信息
(3)根据匹配到的路由信息执行对应的视图函数(或类),完成整个请求响应过程
#项目目录下的urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', include('index.urls')),
]
#app目录下的urls.py
from django.urls import path
#导入项目应用index
from index import views
urlpatterns = [
path('', views.index),
]
定义视图函数index:
app目录下的views.py
from django.shortcuts import render
# Create your views here.
def index(request):
value='a test'
print(value)
return render(request,'index.html'),
3.1.2Django1.x路由定义规则
Django1.X版本的路由定义规则由url函数定义。
^表示当前路由地址的相对地址。$表示当前路由地址的终止符。
#项目目录下的urls.py
from django.contrib import admin
from django.conf.urls import url
from django.urls import include
urlpatterns = [
url('admin/', admin.site.urls),
url('^index/$', include('index.urls')),
]
#app目录下的urls.py
from django.conf.urls import url
#导入项目应用index
from index import views
urlpatterns = [
url('^', views.index),
]
3.1.3路由变量设置
路由变量类型:
字符类型,整型,slug, uuid
(1)字符类型:匹配任何非空字符串,不含斜杠。默认为字符类型
(2)整形:匹配0和正整数
(3)slug:路由的解释性字符
(4)uuid:匹配一个uuid格式的对象,必须用‘-’,而且所有字母必须小写。
#app目录下的urls.py
from django.urls import path
#导入项目应用index
from index import views
urlpatterns = [
path('<year>/<int:month>/<slug:day>', views.myvariable),
#path('<str:year>/<int:month>/<slug:day>', views.myvariable),
]
#app目录下的views.py
from django.http import HttpResponse
from django.shortcuts import render
def myvariable(request,year,month,day):
return HttpResponse(str(year)+'/'+str(month)+'/'+str('day'))
路由的变量和视图函数的参数要一一对应。
除了在路由地址设置变量外,Django还支持在路由地址外设置变量。
#app目录下的urls.py
from django.urls import path
#导入项目应用index
from index import views
urlpatterns = [
#添加带有字符类型,整型,slug的路由
path('<year>/<int:month>/<slug:day>', views.myvariable),
#path('<str:year>/<int:month>/<slug:day>', views.myvariable),
path('', views.index,{'month':'2020/07/05'}),
]
#app目录下的views.py
from django.http import HttpResponse
from django.shortcuts import render
def myvariable(request,year,month,day):
return HttpResponse(str(year)+'/'+str(month)+'/'+str('day'))
def index(request,month):
return HttpResponse('路由地址之外的变量'+month)
以上路由函数path的第三个参数为字典,该参数只能在视图函数中读取和使用,字典的一个键值对代表一个参数,键代表参数名,值代表参数值。
视图函数的参数必须对应字典的键,如果有多个键值对,视图函数的参数也要一一对应。
3.1.4正则表达式的路由定义
from django.urls import re_path
#导入项目应用index
from index import views
urlpatterns = [
re_path('(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2}).html',
views.mydate)
]
?P:固定格式,P必须大写
:变量名
[0-9]{4}:正则表达式
3.2命名空间与路由命名
3.2.1命名空间namespace
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', include(('index.urls','index'),namespace='index')),
path('user/', include(('user.urls','user'),namespace='user')),
]
include()设有参数arg 和namespace,参数arg指向项目应用的urls.py文件,namespace 是路由的命名空间。include()中元组的个数必须为2.:include((‘index.urls’,‘index’),namespace=‘index’)
3.2.2路由命名name
根据匹配到的路由信息执行对应的视图函数(或类),完成整个请求响应过程
#app目录下的urls.py
from django.urls import path
#导入项目应用index
from index import views
urlpatterns = [
path('', views.index,name='index'),
]
3.3路由的使用
3.3.1在模板中使用
{%url ’namespace:name’ ‘xxx’ ‘xxx’ %}
templates/index.html文件中:
{% url ‘name’ ‘2020’ ‘07’ ‘05’%}
{% url ‘namespace:name’ ‘2020’ ‘07’ ‘05’%}
3.3.2在视图中使用:反向解析
reverse:通过路由命名或可调用视图对象生成路由地址
resolve:通过路由地址获取路由对象信息
#先使用reverse,再使用resolve
result=resolve(reverse('index:mydate',args=args))
print(result.kwargs)
print(result.url_name)
print(result.namespace)
print(result.view_name)
print(result.app_name)
3.3.3路由重定向
视图类重定向:RedirectView.as_view(url=‘index/’)
访问127.0.0.1:8000/turnTo,会自动跳转到127.0.0.1:8000/index
#app目录下的urls.py
from django.urls import path
#导入项目应用index
from index import views
from django.views.generic imnport RedirectView
urlpatterns = [
path('turnTo',RedirectView.as_view(url='index/'),name='turnTo'),
]
视图函数重定向:redirect(reverse(‘index:mydate’,args=[2020,07,05]))
访问127.0.0.1:8000/index,会自动跳转到127.0.0.1:8000/2020/07/05
#app目录下的views.py
from django.http import HttpResponse
from django.shortcuts import render
def mydate(request,year,month,day):
return HttpResponse(str(year)+'/'+str(month)+'/'+str('day'))
def index(request):
return redirect(reverse('index:mydate',args=[2020,07,05]))
参考书籍《Django web应用开发实战》