Django中的路由配置简介
Django中的路由配置简介
路由配置(URLconf)就是Django所支撑网站的目录。其实,我们利用路由交换中的“寻址”的概念去理解Django的路由控制会简单很多,它的本质就是URL与要为该URL调用的视图函数之间的映射表,我们就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码去相应的执行。而本文就按照这样一个思路为大家简单介绍一下Django中基本的“寻址”过程,而对于“反向解析”、2.0版本新加入的path方法及自定义的转换器等知识点暂不做介绍。
路由配置
简单的路由配置
其实,我们在浏览器中输入的地址就可以当做是一个“路由”,它告诉程序用什么去寻找我们需要的页面,而程序运行起来后,默认不改变端口的情况下http://127.0.0.1:8000/是固定不变的,我们可以把这里当做是Django应用的“核心节点”。我们在这个“核心节点”下面再加上自己想要访问的“地址”,就可以访问程序已经设计好的应用里面去了。
因为Django程序在创建之始为我们添加了一条默认的路由“admin”,所以如果我们新建好一个django项目后什么也不写,按照默认的配置运行程序的话,在浏览器的地址栏输入http://127.0.0.1:8000/admin就可以访问Django自带的admin页面。
自定义简单的路由
我们这里用Django的2.0及以上版本,所以我们在全局(就是跟项目同名的包)的urls.y文件中需要引入re_path方法。然后,在这个全局的urls.py文件中写入:
from django.urls import path,re_path
from app01 import views
urlpatterns = [
path('admin/',admin.site.urls),
path('login',views.login),
#路由配置————哪一个路径由哪一个视图函数去处理
#调用的时候会自动传一个request参数,如special_case_2003(request)
re_path(r'^articles/2003/$',views.special_case_2003),
]
这里需要注意的是,Django2.0版本的re_path跟1版本的url功能一样,这里为了实现正则匹配所以常用re_path方法;若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。 每个正则表达式前面的'r' 是可选的但是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义
上面代码中from app01 import views说明我们写的这些路由是交给应用app01中的views视图函数去处理的。
我们在应用app01的views.py文件中写如下代码:
from django.shortscuts import render,HttpResponse
def special_case_2003(request):
return HttpResponse('special_case_2003')
注意上述函数中的形参request,所有的请求信息都在这个request中!这个形参一定要写!
最后我们在浏览器中输入http://127.0.0.1:8000/articles/2003就可以看到返回的结果special_case_2003了。
这里需要注意的一点是,如果我们的路由中有“分组”的话,相应的视图函数中要增加形参。比如,路由中这样写:
re_path('^articles/2003/([0-9]{4})/([0-9]{2})/$',views.month_article)
那么我们在视图函数中要额外加两个形参:
def month_article(reqest,year,month):
return HttpResponse('year:'+year+'month:'+month)
有名分组
由上面的例子我们知道:有分组的情况下我们需要在视图函数中增加相应的形参个数,但是,默认情况下这些形参是有顺序要求的,比如上面的year与month。也就是说视图函数的第二个形参不管叫什么它都代表的是正则表达式[0-9]{4}匹配出来的数字,而第三个形参则永远表示[0-9]{2}匹配到的数。
如果我们不想这么死板,想要让year的位置不管在哪里,它都表示{0-9}[4]匹配到的数字。这就用到了“有名分组”
我们需要在每一个分组的前面加 ?P<name> 这个name是这个分组的名字,注意不要重复,然后在views.py文件中对应的函数里,形参的名字与这里分组的名字对应上即可,而且形参的顺序没有要求了。
比如上面匹配年月的例子我们用有名分组可以这么改:
re_path('^articles/2003/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.str)
views中str函数这样写:
def str(request,month,year):
return HttpResponse('year:'+year+'month:'+month)
这样不论形参year的位置在哪里,他都得到[0-9]{4}匹配的数据。
分发
上面的代码存在一个“耦合”的问题,因为在实际的项目中,我们是将各个应用的路由与视图函数分开来处理的,这样程序的可维护性与可扩展性将大大的提高,而上面的代码是将所有的逻辑写在了“全局”的urls.py文件中,如果我们今后要对程序进行扩展的话,这个urls文件中的“路由”会根据需求毫无节制的剧增,这势必为我们维护代码的工作产生很大问题。
而利用“分发”我们可以很好的解决这个问题。
所谓“分发”,通俗的来讲其实就是我们将整个项目的的路由分配到不同应用中作为“子路由”,而全局包中的urls.py文件作为“核心”节点只要告诉用户:你想要访问的站点在哪个应用中,然后在相应的应用中的“子路由”中去找就行了。
因此,分发首先要在“核心节点”对每个应用进行“绑定”(注意先要在每个应用中新建一个作为子路由的py文件,我习惯将它命名为"url.py"),例如我们项目中有两个应用,app01与app02,我们在两个应用中都新建了一个作为“子路由”的py文件,那首先应当在全局的urls中这样分配:
re_path(r'^app01/',include(('app01.url','app01'))),
re_path(r'^app02/',include(('app02.url','app02'))),
这里app01是应用的名字,.操作符后面的url是作为“子路由”的文件名称,而元组的第二个参数是这个子路由的“名称空间”,它相当于一个“房间号”,唯一的标识了这个“子路由”,注意名称空间的名字不可重复!
在全局分发完之后,我们就可以将“路由”写到每一个应用的“子路由”文件中去了!而“核心节点”只要保存“子路由”信息就可以了。但是在浏览器中访问的时候就要注意了,此时我们必须加上应用的名称才能访问具体的视图函数,因为我们做了分发。
还拿上面的例子来讲,如果我在全局做了分发,而“子路由”写进了app01应用的url文件中,那么我想查看视图函数的结果就得在浏览器中这样输入:http://127.0.0.1:8000/app01/articles/2003
Django中的路由配置简介的更多相关文章
- django中url路由配置及渲染方式
今天我们学习如何配置url.如何传参.如何命名.以及渲染的方式,内容大致有以下几个方面. 创建视图函数并访问 创建app django中url规则 捕获参数 路径转换器 正则表达式 额外参数 渲染方式 ...
- Flask中的路由配置
在Flask中也同样有django中的路由配置只不过没有djngo那么严格主要的参数有一下六个记住常用的就可以了 1.endpoint 反向生成url地址标志,默认视图函数名 2.methods ...
- Django 02 url路由配置及渲染方式
Django 02 url路由配置及渲染方式 一.URL #URL #(Uniform Resoure Locator) 统一资源定位符:对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是 ...
- 3/19 Django框架 url路由配置及模板渲染
3/19 Django框架 url路由配置及模板渲染 1.路由分配 URL(Uniform Resoure Locato):统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示, ...
- JavaEE开发之SpringMVC中的路由配置及参数传递详解
在之前我们使用Swift的Perfect框架来开发服务端程序时,聊到了Perfect中的路由配置.而在SpringMVC中的路由配置与其也是大同小异的.说到路由,其实就是将URL映射到Java的具体类 ...
- django 中的路由系统(url)
路由系统 根据Django约定,一个WSGI应用里最核心的部件有两个:路由表和视图.Django框架 的核心功能就是路由:根据HTTP请求中的URL,查找路由表,将HTTP请求分发到 不同的视图去处理 ...
- Django中media的配置
Django中media的配置 Django中media文件夹是我们文件(比如头像.文件.视频等)数据十分重要的存放处,这里以用户头像的上传以及media文件的访问为例为大家详细讲解下media的相关 ...
- Django基础--Django基本命令、路由配置系统(URLconf)、编写视图、Template、数据库与ORM
web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构. 使用框架可以帮你快速开发特定的系统. 简单地说,就是你用别人搭建好的舞台来做表演. 尝试搭建一个简单 ...
- Django中模板的用法简介
1. 模板系统的介绍 Django作为一个Web框架,其模板所需的HTML输出静态部分以及动态内容插入 模板由HTML代码和逻辑控制代码构成 Django框架的模板语言的语法格式: {{var_nam ...
随机推荐
- 深入学习Motan系列(二)——服务发布
闯关经验: 袋鼠走过了第一关,顺利搭建出了Demo,信心爆棚.不过之后,心想怎么去研究这个框架呢.查了一下,官方文档,好像没什么东西可以研究啊.后来,又搜了搜博客,因为这是微博的框架嘛,所以搜索时用百 ...
- python.numpy.std()计算矩阵标准差
>>> a = np.array([[1, 2], [3, 4]]) >>> np.std(a) # 计算全局标准差 1.1180339887498949 > ...
- 【mybatis源码学习】mybtias知识点
Mybatis技术内幕系列博客,从原理和源码角度,介绍了其内部实现细节,无论是写的好与不好,我确实是用心写了,由于并不是介绍如何使用Mybatis的文章,所以,一些参数使用细节略掉了,我们的目标是介绍 ...
- js语言中的新发现和一些总结
js中定义变量加var和不加var的区别 原创 2016年09月01日 10:17:33 标签: js 3658 这个问题其实我在面试的时候有被问到过,当时我记得我回答的很模糊,面试官看到我好像不太清 ...
- Python 给实例或者类动态绑定属性和方法
首页定义一个class,创建一个实例之后,我们可以给该实例绑定任何属性和方法,先定义class: class Student: def __init__(self, name, score): sel ...
- Day 38 HTML
HTML文档结构 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&qu ...
- 详解Linux查看实时网卡流量的几种方式(转)
转自https://www.jb51.net/article/112965.htm 假如Keepalived有10个VIP,怎么查看每个VIP的流量呢? 这里就可以使用sar命令查看网卡流量了.前提是 ...
- eclipse 视图打不开解决方法
遇到一个eclipse问题,查看方法调用者,或打开调用层次窗口失败,这时要查看一个方法的调用者只好通过全局搜索的方式.网上搜索报错关键词没找到答案,看了一下全局设置也没有想过的选项. 后想到一个ecl ...
- Hessian总结
一.简介: Hessian是一个基于Binary-RPC 实现的远程通讯library,基于 Http 协议进行传输.通过其自定义的串行化机制将请求信息进行序列化,产生二进制流.响应端根据 Hessi ...
- hiho一下 第165周#1327 : 分隔相同字符
题目要求: 时间限制:10000ms单点时限:1000ms内存限制:256MB 描述给定一个只包含小写字母'a'-'z'的字符串 S ,你需要将 S 中的字符重新排序,使得任意两个相同的字符不连在一起 ...