django:理解urls路由

最近在看django的官方文档,跟着文档敲第一个django应用,刚开始看到第一部分关于urls路由的设置时,脑子里冒出来许多问号

一时没转过弯来,它到底是咋转发路由的??如何通过我配置的路径来定位到指定视图的?

然后自己就反复试验了几次,又仔细看了文档中的描述(我的蹩脚英语不足以支撑看原版英文文档,看的英译汉,所以翻译后有些字眼确实不好理解,没内个味道了...)

OK,闲话到此为止,继续往下看

首先,我的django项目层级如下

mysite/urls.py 是根 URLconf 文件

polls/urls.py 是一个应用下的 URLconf 文件

在 polls/urls.py 中添加了路由

from django.urls import path

from . import views

urlpatterns = [
    path(‘‘, views.index, name=‘index‘),
]

然后在 mysite/urls.py 文件的 urlpatterns 列表里插入一个 include()

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path(‘polls/‘, include(‘polls.urls‘)),
    path(‘admin/‘, admin.site.urls),
]

第一种情况

官方文档有这样一句话:

每当Django遇到include(),它都会截断直到该时间点匹配的URL的任何部分,并将剩余的字符串发送到包含的URLconf中以进行进一步处理。

上面的这段话有2个关键点:截断已经匹配到的部分将剩下的部分继续送给include()指定的URLconf文件

然后按照如下步骤进行分析:

  1. 当在浏览器输入一段url,它会首先根据 mysite/urls.py  文件中 urlpatterns 包含的 path 匹配
  2. 例如输入url为:http://127.0.0.1:8000/polls/,那么它会以这串url中的 polls/ 进行匹配
  3. mysite/urls.py 文件中,发现 urlpatterns 内的第一个 path 就是polls/ ,匹配成功
  4. 截断这个url已经匹配的部分,所以 http://127.0.0.1:8000/polls/ 截断后只剩下空字符串 ‘‘
  5. 接下来就把空字符串 ‘‘ 继续送给 include(‘polls.urls‘) 包含的 URLconf 文件进行处理,这里的话,就是送给投票应用 polls 自己的 URLconf 文件来继续匹配这个剩下的空字符串 ‘‘
  6. 观察 polls/urls.py 中urlpatterns包含的 path,第一个 path 就是空字符串 ‘‘,匹配成功,所以最终这个url就映射到了这个空字符串对应的视图 index

所以如果访问 http://127.0.0.1:8000/polls/ 等价于访问 http://127.0.0.1:8000/polls/ + 空字符串

第二种情况

如果上面的空字符串不好理解,可以再换个url,例如url为 http://127.0.0.1:8000/polls/test/

mysite/urls.py 内容如下

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path(‘polls/‘, include(‘polls.urls‘)),
    path(‘admin/‘, admin.site.urls),
]

polls/urls.py 中内容如下

from django.urls import path

from . import views

urlpatterns = [
    path(‘‘, views.index, name=‘index‘),
    path(‘test/‘, views.index2, name=‘index2‘), # 添加了一个新路由,映射到index2视图
]

视图文件 polls/views.py 添加了一个index2()函数

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.

def index(request):
    return HttpResponse("hello, world")

def index2(request):
    return HttpResponse("测试匹配路由test")

按照如下思路进行分析:

  1. 在浏览器输入url:  http://127.0.0.1:8000/polls/test/,它还是先在 mysite/urls.py 文件中以后缀“polls/test/” 匹配路由,可以发现 polls/ 匹配成功
  2. 截断url后,剩下 test/ ,将其发送给投票应用 polls 的URLconf文件继续处理,也就是 polls/urls.py
  3. 观察 polls/urls.py 中 urlpatterns 包含的path,第一个path是 ‘‘,匹配失败;第二个path是 test/,匹配成功,所以这个url就映射到了其对应的视图,也就是 views.index2

访问url,结果如下,确实映射到了视图函数index2()对应的内容

第三种情况

一个django项目下可以有多个应用(app),上面的示例中只有一个应用polls

接下来再在这个项目新建一个应用,名称为blog

然后在blog下新建一个urls.py文件

blog/views.py 文件中添加一个视图

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.

def index(request):
    return HttpResponse("hello, welcome to blog")

blog/urls.py 文件中添加path

from django.urls import path
from blog import views

urlpatterns = [
    path(‘index/‘, views.index, name=‘index‘),
]

然后在根urlconf文件,也就是mysite/urls.py 文件中指定blog.urls模块

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path(‘polls-admin/‘, admin.site.urls),
    path(‘polls/‘, include(‘polls.urls‘)),
    path(‘blog/‘, include(‘blog.urls‘)),  # 指定blog.urls模块
]

这个时候如果在浏览器输入 http://127.0.0.1:8000/blog/index/

根据上面的经验,它会先定位到 blog/ ,然后到blog下的urls文件中继续匹配  index/ ,如果匹配成功,则映射到 blog/views.py 下定义的index视图

访问结果如下

如果修改 blog/urls.py 文件,把path中的 index/ 改为 index2/

from django.urls import path
from blog import views

urlpatterns = [
    path(‘index2/‘, views.index, name=‘index‘),

这个时候再访问 http://127.0.0.1:8000/blog/index/,就会报错了,因为这个时候是 index2/ 关联 index 视图,而 index/ 这个路径没有映射(关联)任何视图了,此时会报404

原文地址:https://www.cnblogs.com/hanmk/p/12656391.html

时间: 2024-11-05 15:29:53

django:理解urls路由的相关文章

Django基础(路由、模版、视图)

Django 路由控制 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行 1.)简单的路由配置 1 from django.conf.urls import url 2 3 urlpatterns = [ 4 url(正则表达式, views视图函数,参数,别名), 5 ] 正则表达式:一个正则表达式字符串 views视图函数:一个可调用

Django之url路由

Django之url路由 url路由介绍 url路由是关联url及其视图函数关系的过程. 作用就是使views里面处理数据的函数与请求的url建立映射关系 url路由配置 Django的url路由配置在settings.py文件中ROOT_URLCONF变量指定全局路由文件名称. 注意:默认创建项目的时候,就会配置好,如果想使用别的配置文件自行修改. Django的URL路由流程 Django查找全局urlpatterns变量(urls.py) 按照先后顺序,对URL逐一匹配urlpattern

Django进阶(路由系统、中间件、缓存、Cookie和Session

路由系统 1.每个路由规则对应一个view中的函数 url(r'^index/(\d*)', views.index), url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage), url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}), 2.根据app对路由规则进行一次分类 rl(r'^web/',include('web.urls')), 1.每个路由规则对应

Python开发【Django】:路由规则

Django请求生命周期: -->url对应关系(匹配) ->视图函数->返回用户字符串 -->url对应关系(匹配)->视图函数->打开一个HTML文件,读取内容 创建django project django-admin startproject mysite cd mysite python manage.py startapp cmdb mysite mysite --配置文件 -url.py -settings.py cd mysite cmdb -views

Django的URL路由

URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码 URL模式 urlpatterns = [ url(正则表达式, view函数, 参数, 别名), ] 参数说明 一个正则表达式字符串 一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串 可选的要传递给视图函数的默认参数(字典形式) 一个可选的name参数,接合模

Django基础--Django基本命令、路由配置系统(URLconf)、编写视图、Template、数据库与ORM

web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构. 使用框架可以帮你快速开发特定的系统. 简单地说,就是你用别人搭建好的舞台来做表演. 尝试搭建一个简单的web框架: 因为我们不希望接触到TCP连接.HTTP原始请求和响应格式,所以,需要一个统一的接口,让我们专心用Python编写Web业务. 这个接口就是WSGI:Web Server Gateway Interface. #---------------------myweb.py-------

Django入门2:路由系统

1.单一路由对应 url(r'^index/', views.index), # FBV url(r'^home/', views.Home.as_view()), # CBV 2.基于正则的路由 1 url(r'^detail-(\d+).html', views.detail), 2 3 url(^'^detail-(\d+)-(\d+).html',views.detail), 4 ''' 5 严格按照位置参数的顺序传入参数,如果在实际环境中,def detail(request,nid,

django之urls系统

Django的urls系统简介 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码. URLconf配置 基本格式: from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] 注意:

Django的多层路由

如果项目中只使用到了一个APP应用,完全可以避免使用多层路由,多层路由在项目里涉及到2个或多个APP时使用 所谓路由,简单来说,就是给项目路径分流. 比如有一个项目 webnet,下面使用到了两个应用程序 stu_sys 和 tea_sys,需要区分访问时 可以在各自的APP根目录新建urls文件夹,将自己下面的对应关系写入: 1 from django.conf.urls import url 2 from tea_sys import views 3 4 urlpatterns=[ 5 6