简单的路由配置
实例1
创建应用app1,新建一个路径index,修改urls.py文件
from django.contrib import admin
from django.urls import path
from app1 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
]
新建index视图函数
from django.shortcuts import render, HttpResponse
# create your views here
def index(request):
return HttpResponse('INDEX')
访问首页:
网页显示效果如下:
访问这种路径http://127.0.0.1:8000/index/xiao ,网页提示404错误。
path相当于在路径里自动加上了^和$,如果要使用其他的正则匹配,可以使用re_path
实例2
如果想要网页加上路径,动态显示年份,怎么做呢?
这个时候,需要用到正则分组。当re_path检测到分组时,会将分组的值传给视图函数
如果是无名分组,则作为位置参数传入;如果是有名分组,作为关键字参数传入
urls.py
urlpatterns = [
path('admin/', admin.site.urls),
# path('index/', views.index),
re_path('^index/$', views.index), # index(request)
re_path(r'^articles/2003/$', views.special_year), # special_year(request)
re_path(r'^articles/(d{4})/$', views.article_year), # article_year(request,分组匹配的值)
]
views.py
def article_year(request,year):
return HttpResponse(year)
访问url:http://127.0.0.1:8000/articles/2080/
网页效果如下:
新增url,获取月份,修改urls.py
urlpatterns = [
path('admin/', admin.site.urls),
# path('index/', views.index),
re_path('^index/$', views.index), # index(request)
re_path(r'^articles/2003/$', views.special_year), # special_year(request)
re_path(r'^articles/(d{4})/$', views.article_year), # article_year(request,分组匹配的值)
re_path(r'^articles/(d{4})/(d{2})/$', views.article_month), # article_month(request,value1,value2)
]
新增article_month视图函数,它必须接收2个额外的参数,否则报错
def article_month(request,year,month):
return HttpResponse('{}-{}'.format(year,month))
访问url:http://127.0.0.1:8000/articles/2080/10/
网页效果如下:
访问url:http://127.0.0.1:8000
网页提示404
这样用户体验不好,怎么办呢?在index下面,加入以下的url规则
re_path('^$', views.index)
再次访问页面,输出:
小结
- Django2中使用path和re_path,Django1中使用url
- 不需要捕获参数时用path,需要捕获参数时用re_path和url
- 无名分组使用位置参数传入视图函数,有名分组作为关键字参数传入
- url前不需要加一个前导符^,因为每个url都有
- 正则表达式前面建议加上'r',表示这个字符串时'原始的',不需要转义
路由分发
背景
一个Django项目里有多个APP,共用一个url容易造成混淆,且不便于维护,一个APP的url出现问题可能造成整个url.py文件的崩溃,因此可以通过路由分发让每个APP拥有自己单独的url,方便后续的维护管理
实现
url.py里面的说明
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
第一步:导入include方法,
在urls.py导入include
from django.urls import path,re_path,include
第二步:创建urls
在app1的目录下创建urls.py,将urls.py的内容复制过去,修改
from django.contrib import admin
from django.urls import path,re_path,include
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
re_path('^$', views.index),
re_path('^index/$', views.index), # index(request)
path('app1/', include('app1.urls')), # 表示把app1/下面的url都分发给app1.urls这个文件处理
]
再访问http://127.0.0.1:8000/index/,提示404
因为路由分发了,访问时,必须加上应用名http://127.0.0.1:8000/app1/index/
再增加一个应用app2,总的代码如下:
总的urls.py
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('app1/', include('app1.urls')), # 表示把app1/下面的url都分发给app1.urls这个文件处理
path('app2/', include('app2.urls')), # 表示把app2/下面的url都分发给app2.urls这个文件处理
]
app1下面的urls.py
from django.contrib import admin
from django.urls import path,include
from app1 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
]
app2下面的urls.py
from django.contrib import admin
from django.urls import path,include
from app2 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
]
app1下面的views.py
from django.shortcuts import HttpResponse
# Create your views here.
def index(request):
return HttpResponse('index in app1')
app2下面的views.py
from django.shortcuts import HttpResponse
# Create your views here.
def index(request):
return HttpResponse('index in app2')
##小结 - 路由分发的目的是使url`解耦`,便于管理 - 在总的urls.py里使用include,在各个APP目录下创建单独的urls.py - 分发后访问需要加上APP的名字