Django_路由详
动态路由和动态参数捕获
动态路由:url支持正则表达式, 访问的url能够匹配成功就去执行对应的视图函数
捕获参数:
# 捕获参数,位置传参
url(r'^data/([0-9]{4})/([0-2][0-9])/',function)
# 关键字传参
url(r'^data/(?P<year>[0-9]{4})/(?P<day>[0-2][0-9])/',function)
视图函数中要给参数预留位置
路由分发
将不同功能的路由进行拆分, 将以某个匹配开头的路由分发到指定包去处理, 继续匹配后面内容
from django.conf.urls import include, url urlpatterns=[
url("^app01", include("app01.url")) # 这里写导入路径或者把url导入进来写在这里都可以
]
app01.urls
from django.conf.urls import include, url urlpatterns=[
url("nihao", func)
]
include - 返回的是个元组
def include(arg, namespace=None, app_name=None):
if app_name and not namespace:
raise ValueError('Must specify a namespace if specifying app_name.')
if app_name:
warnings.warn(
'The app_name argument to django.conf.urls.include() is deprecated. '
'Set the app_name in the included URLconf instead.',
RemovedInDjango20Warning, stacklevel=2
) if isinstance(arg, tuple):
# callable returning a namespace hint
try:
urlconf_module, app_name = arg
except ValueError:
if namespace:
raise ImproperlyConfigured(
'Cannot override the namespace for a dynamic module that provides a namespace'
)
warnings.warn(
'Passing a 3-tuple to django.conf.urls.include() is deprecated. '
'Pass a 2-tuple containing the list of patterns and app_name, '
'and provide the namespace argument to include() instead.',
RemovedInDjango20Warning, stacklevel=2
)
urlconf_module, app_name, namespace = arg
else:
# No namespace hint - use manually provided namespace
urlconf_module = arg if isinstance(urlconf_module, six.string_types): # 字符串类型的就导入进来
urlconf_module = import_module(urlconf_module)
patterns = getattr(urlconf_module, 'urlpatterns', urlconf_module)
app_name = getattr(urlconf_module, 'app_name', app_name)
if namespace and not app_name:
warnings.warn(
'Specifying a namespace in django.conf.urls.include() without '
'providing an app_name is deprecated. Set the app_name attribute '
'in the included module, or pass a 2-tuple containing the list of '
'patterns and app_name instead.',
RemovedInDjango20Warning, stacklevel=2
) namespace = namespace or app_name # Make sure we can iterate through the patterns (without this, some
# testcases will break).
if isinstance(patterns, (list, tuple)):
for url_pattern in patterns:
# Test if the LocaleRegexURLResolver is used within the include;
# this should throw an error since this is not allowed!
if isinstance(url_pattern, LocaleRegexURLResolver):
raise ImproperlyConfigured(
'Using i18n_patterns in an included URLconf is not allowed.') return (urlconf_module, app_name, namespace) def url(regex, view, kwargs=None, name=None):
if isinstance(view, (list, tuple)):
# For include(...) processing.
urlconf_module, app_name, namespace = view
return RegexURLResolver(regex, urlconf_module, kwargs, app_name=app_name, namespace=namespace)
elif callable(view):
return RegexURLPattern(regex, view, kwargs, name)
else:
raise TypeError('view must be a callable or a list/tuple in the case of include().')
反向解析和名称空间
反向解析的应用场景 : 在试图函数和模板中写了很多跳转的路由, 然后领导要求把urlpatterns里面改了,,, 改了这里相关的试图和html中的也要改,,,很容易漏掉
反向解析就为此而生
无参路由
首先要为路由设置一个名字
urlpatterns = [
url("aaaa", func, name="name")
]
在视图中使用
from django.urls import reverse reverse('name')
模板中使用
{% url "name" %}
有参路由
同上
urlpatterns = [
url("aaaa/(/d+)", func, name="name")
]
在视图中使用
from django.urls import reverse reverse('name', args=(1,)) # 无名参数, 按位置传
reverse('name', kwargs={"1":1}) # 命名参数, 按关键字传
在路由中使用
{% url "name" 1 %} # 按位置传
{% url "name" q1="1" %} # 按关键字传
名称空间
对于include其中的路由出现的同名现象, 不同功能中的路由可能是不同的人写的, 对于出现的同名的路由, 前面的那个会被替换.
urlpatterns=[
url("^app01", include("app01.url", namespace="app01"))
url("^app02", include("app02.url", namespace="app02"))
]
当设置了namespace时, 反向解析时必须用到
from django.urls import reverse
reverse('app01:name')
# 带参数的同上
路由中使用
{% url "app01:name" %}
Django_路由详的更多相关文章
- Ocelot简易教程(三)之主要特性及路由详解
作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9664977.html 上篇<Ocelot简易教程(二)之快速开始2>教大家如何快速跑起来一个 ...
- Vue 路由详解
Vue 路由详解 对于前端来说,其实浏览器配合超级连接就很好的实现了路由功能.但是对于单页面应用来说,浏览器和超级连接的跳转方式已经不能适用,所以各大框架纷纷给出了单页面应用的解决路由跳转的方案. V ...
- elasticsearch系列三:索引详解(分词器、文档管理、路由详解(集群))
一.分词器 1. 认识分词器 1.1 Analyzer 分析器 在ES中一个Analyzer 由下面三种组件组合而成: character filter :字符过滤器,对文本进行字符过滤处理,如 ...
- Express的路由详解
Express的路由详解 http://www.jb51.net/article/76203.htm
- [转载]Ocelot简易教程(三)之主要特性及路由详解
上篇<Ocelot简易教程(二)之快速开始2>教大家如何快速跑起来一个ocelot实例项目,也只是简单的对Ocelot进行了配置,这篇文章会给大家详细的介绍一下Ocelot的配置信息.希望 ...
- Flutter学习笔记(15)--MaterialApp应用组件及routes路由详解
如需转载,请注明出处:Flutter学习笔记(15)--MaterialApp应用组件及routes路由详解 最近一段时间生病了,整天往医院跑,也没状态学东西了,现在是好了不少了,也该继续学习啦!!! ...
- iOS路由详解
本文如题,路由详解,注定是一篇详细解释iOS路由原理及使用的文章,由于此时正在外地出差,无法详细一一写出,只能不定时的补充. 一.什么是iOS路由 路由一词来源于路由器,可以实现层级之间消息转发的功能 ...
- vue技术栈进阶(02.路由详解—基础)
路由详解(一)--基础: 1)router-link和router-view组件 2)路由配置 3)JS操作路由
- Angular6 学习笔记——路由详解
angular6.x系列的学习笔记记录,仍在不断完善中,学习地址: https://www.angular.cn/guide/template-syntax http://www.ngfans.net ...
随机推荐
- MR 实例
二次排序 点击复制代码:https://www.cnblogs.com/JBLi/p/10764535.html 将上面的代码改成两个 分区 展示的数据 相同的不在一个分区 怎么解决点击查看没有 ...
- Python——pyqt5——智能提示(lineEdit/conmbobox)
一.文本框智能补全 completer = QtWidgets.QCompleter(data) completer.setCompletionMode(QtWidgets.QCompleter.Po ...
- this.setData , that.setData , this.data.val三者之间的区别和作用
1.this.setData({ }) <view bindtouchmove="tap_drag" bindtouchend="tap_end" bin ...
- Java进程通信之映像文件共享内存
Java进程通信之映像文件共享内存 1. 共享内存 vs 进程通信 对UNIX系统来说,共享内存分为一般共享内存和映像文件共享内存两种.但windows实际上只有影像文件共享内存一种. 而说到进程通信 ...
- 第四届 CCCC 团体程序设计天梯赛 游记
我们可能是唯一一个去参加这个比赛的中学生吧(划掉) DAY -inf 一天教练给我们说有这么个比赛,要选人,于是就愉快的开展了一次打字比赛 说实话手真的要抽筋了 不过最后还好涉险过关 DAY -1 疯 ...
- BZOJ2882工艺
题目描述 小敏和小燕是一对好朋友. 他们正在玩一种神奇的游戏,叫Minecraft. 他们现在要做一个由方块构成的长条工艺品.但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工艺品最左边的方 ...
- 纠错式教学法对比鼓励式教学法 -----Lily、贝乐、英孚,乐加乐、剑桥国际、优学汇、北外青少
一.关于两种英语教学法的争议 在英语教学方面,主要有纠错式教学法(目前主要对应国内听说读写四位一体的教学法)和鼓励式教学法(目前对应国内听说为主的教学法),这两种教学方法其实是各有千秋,各有利弊的. ...
- python之路day09--函数
s='金老板啊'print(len(s)) #内置函数 s='金老板啊'# def my_len():# i=0# for k in s:# i+=1# # print(i)# print(my_le ...
- python+appium模拟手机物理按键操作
一句代码:driver.keyevent() 括号里填入的是手机物理按键的数字代号 driver.press_keycode() 括号里填入的是键盘按键的数字代号 手机物理 ...
- CC1310 笔记
GPIO控制: #include <ti/drivers/GPIO.h> GPIO_init() 函数会调用 结构体实例 GPIOCC26XX_config,把需要使用到的GPIO放一起, ...