zoukankan      html  css  js  c++  java
  • django之路由的理解

    一:路由

      简单的路由过程图:

      

      1. 路由的定义位置

      

      路由定义方式一:主路由和子路由分开定义

    主路由的定义 urls.py
    from django.conf.urls import url
    from django.contrib import admin
    from django.conf.urls import include
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^user/', include('user.urls'))
    ]
    
    子路由的定义 user/urls
    from django.conf.urls import url
    from . import views  # 导入对应的视图函数名字,以后视图函数会越来越多。
    
    urlpatterns = [
        url(r"^index/$", views.index),
    ]

      路由的定义方式二:不在user目录中手动urls.py,而是将所有的路由都定义在主路由中。

    from django.conf.urls import url
    from django.contrib import admin
    import users.views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^user/index/$', users.views.index)
    ]

    二:路由的解析顺序

      Django接收一个请求时,从主文件的urls中的urlpatterns列表中从上至下顺序寻找路由,如果遇见include,进入里面继续寻找子路由。

      但是:因为由上至下,所以会造成上面的路由覆盖下面的路由,导致下面的路由访问不到,举例说明

    from django.shortcuts import render
    
    # Create your views here.
    
    from django.http import HttpResponse
    
    def index(request):
        """
        :return:
        """
        return HttpResponse("中国,你好")
    
    
    def index_test(request):
        
        return HttpResponse("专门测试路由屏蔽,看是否能被访问到")

      修改user中的urls中的urlpatterns列表

    from django.conf.urls import url
    
    from . import views  # 导入对应的视图函数名字,以后视图函数会越来越多。
    
    urlpatterns = [
    
        # url函数接收正则,和视图函数的引用。127.0.0.1:8000/index就能访问视图函数index的返回值hello django
        url(r"^index/$", views.index),
        url(r"^index_test/$", views.index_test)  # 测试是否被覆盖
    
    ]

      访问 127.0.0.1:8000/user/index_test:路由没有被覆盖

      上下互换 index和index_test也不会被覆盖:原因是$,终止符

      假设去掉终止符$:看看情况如何

    from django.conf.urls import url
    
    from . import views  # 导入对应的视图函数名字,以后视图函数会越来越多。
    
    urlpatterns = [
    
        # url函数接收正则,和视图函数的引用。127.0.0.1:8000/index就能访问视图函数index的返回值hello django
        url(r"^index", views.index),
        url(r"^index_test", views.index_test),
        # url(r"^index/$", views.index),
    
    ]

      结果:再也不能执行到index_test的视图函数中去:去掉斜杠了和$,匹配到第一个index就停止了,直接进入index中去了。

       但是不去掉斜杠,依然可以进入视图

    from django.conf.urls import url
    
    from . import views  # 导入对应的视图函数名字,以后视图函数会越来越多。
    
    urlpatterns = [
    
        # url函数接收正则,和视图函数的引用。127.0.0.1:8000/index就能访问视图函数index的返回值hello django
        url(r"^index/", views.index),
        url(r"^index_test/", views.index_test),
        # url(r"^index/$", views.index),
    
    ]

      结果:可以执行到index_test视图函数中去

      说明 /  有类似于$一样的终止的功能,到底是不是呢?

      解释:加斜杠的url(r"^index_test/", views.index_test),能保证路径的唯一性。

      用户访问 index_test 或者 index_test/ 网址,均能访问到index_test视图。

      即使你输入的网址是127.0.0.1:8000/user/index_test django框架还是将网址显示为:127.0.0.1:8000/user/index_test/

      

     因此:必要的时候还是以$结尾,即使不以$结尾,也要以/结尾,以免发生路由覆盖的问题。

     三:反向解析

      # 没搞懂

  • 相关阅读:
    PAT (Advanced Level) Practice 1054 The Dominant Color (20 分)
    PAT (Advanced Level) Practice 1005 Spell It Right (20 分) (switch)
    PAT (Advanced Level) Practice 1006 Sign In and Sign Out (25 分) (排序)
    hdu 5114 Collision
    hdu4365 Palindrome graph
    单链表查找最大值、两个递增的链表合并并且去重
    蓝桥杯-最短路 (SPFA算法学习)
    蓝桥杯-最大最小公倍数
    Codeforces-470 div2 C题
    蓝桥杯-地宫取宝
  • 原文地址:https://www.cnblogs.com/meloncodezhang/p/11716895.html
Copyright © 2011-2022 走看看