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/

      

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

     三:反向解析

      # 没搞懂

  • 相关阅读:
    Django基础之cookie
    Django基础之redirect()
    Django基础之render()
    Django基础之JsonResponse对象
    Django基础之response对象
    scrapy框架自定制命令
    数据分析案例-拉勾网招聘信息
    爬虫之单线程多任务异步抓取
    数据分析之matplotlib使用
    数据分析之numpy使用
  • 原文地址:https://www.cnblogs.com/meloncodezhang/p/11716895.html
Copyright © 2011-2022 走看看