Django路由控制

简单的路由配置

实例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/

网页显示效果如下:

访问这种路径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的名字
posted @ 2019-03-24 17:51  乘月归  阅读(243)  评论(0编辑  收藏  举报