• 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的名字
  • 相关阅读:
    python函数续
    模拟数据库查询操作
    文件处理
    字符编码
    python函数
    ACM-ICPC 2018 南京赛区网络预赛Skr
    bzoj3676: [Apio2014]回文串 pam
    Wannafly挑战赛23B游戏
    bzoj4804: 欧拉心算 欧拉筛
    bzoj3884: 上帝与集合的正确用法 扩展欧拉定理
  • 原文地址:https://www.cnblogs.com/zzliu/p/10588456.html
Copyright © 2020-2023  润新知