第三章 初探路由

第三章 初探路由

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应用开发实战》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值