Django入门2:路由系统
1、单一路由对应
url(r'^index/', views.index), # FBV
url(r'^home/', views.Home.as_view()), # CBV
2、基于正则的路由
url(r'^detail-(\d+).html', views.detail), url(^'^detail-(\d+)-(\d+).html',views.detail),
'''
严格按照位置参数的顺序传入参数,如果在实际环境中,def detail(request,nid,uid)在定义时,参数的指定出现差错,则会导致下面的对参数的引用出现错误。
''' url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail),
'''
传参时确保了nid=第一个传入的位置参数,uid=第二个传入的位置参数。
'''
实例1:实现 ?nid={{ id }}的url:
from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login',views.login),
url(r'^index',views.index),
url(r'^detail',views.detail),
# url(r'^detail-(\d+).html',views.detail),
url(r'^home',views.Home.as_view()), #对应类Home的对应方法
]
urls.py:
USER_DICT={
'':{'name':'root1','email':'root@live.com'},
'':{'name':'root2','email':'root@live.com'},
'':{'name':'root3','email':'root@live.com'},
'':{'name':'root4','email':'root@live.com'},
'':{'name':'root5','email':'root@live.com'},
}
def detail(request):
nid=request.GET.get('nid',None)
detail_info=USER_DICT[nid]
return render(request,'detail.html',{'detail_info':detail_info})
views.py:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>详细信息</h1>
<h6>用户名:{{ detail_info.name }}</h6>
<h6>邮箱:{{ detail_info.email }}</h6>
</body>
</html>
detail.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <ul>
{% for k,v in user_dict.items %}
<li><a target=_blank href="/detail?nid={{ k }}">{{ v.name }}</a></li>
{% endfor %}
</ul> </body>
</html>
index.html:
实例2:实现url-{{ id }} 以这种方式用正则表达式取页面。
from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login',views.login),
url(r'^index',views.index),
# url(r'^detail',views.detail),
url(r'^detail-(\d+).html',views.detail),
url(r'^home',views.Home.as_view()), #对应类Home的对应方法
]
urls.py:
USER_DICT={
'':{'name':'root1','email':'root@live.com'},
'':{'name':'root2','email':'root@live.com'},
'':{'name':'root3','email':'root@live.com'},
'':{'name':'root4','email':'root@live.com'},
'':{'name':'root5','email':'root@live.com'},
}
def detail(request,nid):
# nid=request.GET.get('nid',None)
detail_info=USER_DICT[nid]
return render(request,'detail.html',{'detail_info':detail_info})
views.py:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>详细信息</h1>
<h6>用户名:{{ detail_info.name }}</h6>
<h6>邮箱:{{ detail_info.email }}</h6>
</body>
</html>
detail.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <ul>
{% for k,v in user_dict.items %}
<li><a target=_blank href="/detail-{{ k }}.html">{{ v.name }}</a></li>
{% endfor %}
</ul> </body>
</html>
index.html:
3、为路由映射设置名称
对URL路由关系进行命名, ***** 以后可以根据此名称生成自己想要的URL *****
url(r'^asdfasdfasdf/', views.index, name='i1'),
对应在index.html中:
<form action="{% url "i1" %}" method="POST"> url(r'^index/(\d+)/(\d+)/', views.index, name='i2'),
对应在index.html中:
<form action="{% url "i2" 1 2 %}" method="POST"> url(r'^index/(?P<pid>\d+)/(?P<nid>\d+)/', views.index, name='i3'),
对应在index.html中:
<form action="{% url "i3" pid=1 nid=9 %}" method="POST"> # 获取当前的URL
request.path_info # 在函数中生成URL
def func(request, *args, **kwargs):
from django.urls import reverse url1 = reverse('i1') # asdfasdfasdf/
url2 = reverse('i2', args=(1,2,)) # index/1/2/
url3 = reverse('i3', kwargs={'pid': 1, "nid": 9}) # index/1/9/
4、多级路由:根据app对路由规则进行分类
客户端请求先到project/urls.py中进行匹配,匹配到下面的各个app的app/urls.py中。
from django.conf.urls import url,include
from django.contrib import admin urlpatterns = [
url(r'^cmdb/', include("app01.urls")),
url(r'^monitor/', include("app02.urls")),
]
project/urls.py
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^login/', views.login),
]
app01/urls.py
from django.conf.urls import url,include
from django.contrib import admin
from app02 import views urlpatterns = [
url(r'^login/', views.login),
]
app02/urls.py
5、默认值
url(r'^index/', views.index, {'name': 'root'}),
def index(request,name):
print(name)
return HttpResponse('OK')
views.py
在url中添加额外的参数后,在对应的视图函数中必须设置相应的形式参数name。在执行该方法时会自动传入默认值‘root'作为实参。
6、命名空间
a. project.urls.py
|
1
2
3
4
5
6
|
from django.conf.urls import url,includeurlpatterns = [ url(r'^a/', include('app01.urls', namespace='author-polls')), url(r'^b/', include('app01.urls', namespace='publisher-polls')),] |
b. app01.urls.py
|
1
2
3
4
5
6
7
|
from django.conf.urls import urlfrom app01 import viewsapp_name = 'app01'urlpatterns = [ url(r'^(?P<pk>\d+)/$', views.detail, name='detail')] |
c. app01.views.py
|
1
2
3
|
def detail(request, pk): print(request.resolver_match) return HttpResponse(pk) |
以上定义带命名空间的url之后,使用name生成URL时候,应该如下:
- v = reverse('author-polls:detail', kwargs={'pk':11})
- {% url 'author-polls:detail' pk=11 %}
django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而是路由系统变得简洁。
Django入门2:路由系统的更多相关文章
- Django进阶(路由系统、中间件、缓存、Cookie和Session、Ajax发送数据
路由系统 1.每个路由规则对应一个view中的函数 url(r'^index/(\d*)', views.index), url(r'^manage/(?P<name>\w*)/(?P&l ...
- django 中的路由系统(url)
路由系统 根据Django约定,一个WSGI应用里最核心的部件有两个:路由表和视图.Django框架 的核心功能就是路由:根据HTTP请求中的URL,查找路由表,将HTTP请求分发到 不同的视图去处理 ...
- Django框架简介-路由系统
2.2 路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 你就是 ...
- Django的URL路由系统
一. URL配置 URL配置就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图之间的映射表.你就是以这种方式告诉Django,对于哪个URL调用的这段代码. 基本格式 from ...
- Django之URL路由系统
一 URL配置 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表.你就是以这 ...
- Django之URL(路由系统)用法
路由系统 路由系统概念 简而言之,路由系统就是路径和视图函数的一个对应关系.django的路由系统作用就是使views里面处理数据的函数与请求的url建立映射关系.使请求到来之后,根据urls.py里 ...
- Django中的路由系统:urls
Django的路由系统 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 你就是以这种方式告诉Django,对于这个URL调用 ...
- Django基础之路由系统
Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. ...
- django中admin路由系统工作原理
一.如图所示 from django.contrib import admin from . import models class zhangsan(admin.ModelAdmin): list_ ...
随机推荐
- 《Java基础复习》—规范与基础
参考书目<Java 编程思想>所以大家放心食用 一.注释规范以及API文档 1.注释 1.1三种注释方法 //注释内容 单行注释 /* 注释内容 */ 多行注释 /**注释内容*/ 文档注 ...
- 【数据库】MySQL数据库(二)
一.数据库文件的导出 1.在DOS命令行下导出数据库(带数据) mysqldump -u root -p 数据库名 > E:\wamp\www\lamp175\lamp175.sql 2.在DO ...
- TP字段加一操作
经常有需要对某个数据表的计数字段进行加减操作,我们来看下在ThinkPHP中的具体使用办法.最简单的,使用下面方法对score自动加1: M('User')->where('id=5')-> ...
- tcp长连接、短连接、连接池的思考
在基于tcp的 rcp实现方式中,有如下几种选择: 1. 长连接:同步和异步方式. 同步方式下客户端所有请求共用同一连接,在获得连接后要对连接加锁,在读写结束后才解锁释放连接,性能低下,基本很少采用, ...
- wireshark没有找到接口
今天安装wireshark,打开发现显示没有找到接口,网上搜索发现出现这种问题的都是win10,但是我的是win7 看了一下win10这种问题的原因是自带的winpcap不支持win10,应到http ...
- AJ学IOS(27)UI之iOSUIKit字符属性NSAttributedString概述
AJ分享,必须精品 UIKit字符属性NSAttributedString概述 字符属性 字符属性可以应用于 attributed string 的文本中. NSString *const NSFon ...
- GitHub 热点速览 Vol.16:化身蒙娜丽莎和乔布斯对话
摘要:妙趣横生,上周的 GitHub 热点的关键词.无论是让你化身为爱因斯坦开启会议脑暴模式 avatarify,还是和上周人人都是抠图师项目的同门项目 3D 照片修复:3d-photo-inpain ...
- unity3d的键盘和鼠标输入
一.键盘的输入 •GetKey,GetKeyDown,GetKeyUp三个方法分别获取用户键盘按键的输入 1. GetKey:用户长按按键有效: bool down = Input.GetKeyDow ...
- python编程语言是什么?它能做什么?
Python是一种全栈的开发语言,你如果能学好Python,前端,后端,测试,大数据分析,爬虫等这些工作你都能胜任. 当下Python有多火我不再赘述,,Python有哪些作用呢? 就目前Python ...
- 惊呆了,Servlet Filter和Spring MVC Interceptor的实现居然这么简单
前言 创建型:单例模式,工厂模式,建造者模式,原型模式 结构型:桥接模式,代理模式,装饰器模式,适配器模式,门面模式,组合模式,享元模式 行为型:观察者模式,模板模式,策略模式,责任链模式,状态模式, ...