1. 如果没有使用reverse()之前的路由,只要在urls.py修改了匹配的pattern,那么很多地方调用了该url的代码都要修改,可谓是牵一发而动全身。 reverse()就是用来改善这种情况的。

 

2.Django配置 a.配置django工程:

django-admin startproject send_mail_prj
cd send_mail_prj
django-admin startapp app01

 

b.在项目的settings.py注册app01

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',  # 建议使用该方式注册,当然也可以直接是'app01'
]

 

c.在应用里创建urls.py文件

from django.conf.urls import url
from . import  views

# 定义该app_name变量为应用名字
app_name = 'app01'
urlpatterns = [
    url(r'register/$', views.register, name='register'),
    url(r'index/$', views.register, name='index'),                  # name是别名
    url(r'tiaozhuan/$', views.tiaozhuan, name='tiaozhuan')
]

 

d.在项目的urls.py文件中,include应用的url

from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
urlpatterns = [
    path('admin/', admin.site.urls),
    # 导入app.urls时 加入namespace是为了防止其他app.urls里面的name重复了
    # 后续reverse获取url时,通过reverse('namespace:name')
    url(r'^', include('app01.urls', namespace='app01')),
]

 

e.在应用视图中通过reverse()的方式来获取路由:

from django.shortcuts import render, redirect
from django.http import HttpRequest, HttpResponse
from celery_tasks.sms.tasks import sendEmail

from django.urls import  reverse


def register(request):
    # 发送邮件
    sendEmail.delay()
    return HttpResponse('hello')


def tiaozhuan(request):
    # app01是名称空间;
	 # index 是在urls.py 里面的别名 url(r'index/$', views.register, name='index'),
    path = reverse('app01:index')
    print(path)
    return redirect(path)

 

3.访问页面,测试实验 a.浏览器访问http://127.0.0.1/tiaozhuan 会跳转到http://127.0.0.1/index/

 

b.修改应用urls.py的路由patterns

from django.conf.urls import url
from . import  views

app_name = 'app01'
urlpatterns = [
    url(r'register/$', views.register, name='register'),
    url(r'home/$', views.register, name='index'),   # 修改为home
    url(r'tiaozhuan/$', views.tiaozhuan, name='tiaozhuan')
]

 

c.继续浏览器测试 浏览器访问http://127.0.0.1/tiaozhuan 会跳转至 http://127.0.0.1/home/

 

结论: 测试完成,即使路由的匹配模式修改了,也不影响通过reverse()调用的URL