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,include urlpatterns = [ 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 url from app01 import views app_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请求做一条路由映射,从而是路由系统变得简洁。
最新文章
- 用机器名访问和用Localhost访问时在IE中的区别(备忘)
- maven的使用体验
- 转载--提高C++性能的编程技术
- 对想进入Unity开发新人的一些建议
- 什么时候该用NoSQL?
- Pyqt QListWidget之缩略图列表
- 如何解决Android的SDK与ADT不匹配问题
- Thinkphp分页时查询条件保存方法
- javaWeb--jsp &; jQuery
- 黑马程序员_static\访问权限\单例模式 大汇总
- m个相同苹果放的n个相同盘子中的算法
- ESP8266烧录配置
- P2648 赚钱
- Netty---入门程序,搭建Websocket 服务器
- eclipse中增加多个Tomcat
- java 复制Map对象(深拷贝与浅拷贝)
- ios Label TextFile 文本来回滚动 包括好用的三方
- Android编程 EditView 中如何设置最多可以输入的字符数量 属性 android:ems 与 android:maxLength 的区别
- 【题解】CF#855 G-Harry Vs Voldemort
- fragment用法
热门文章
- python:列表切片知识的总结
- Spring Taco Cloud——Controller的创建(含SpringMVC执行过程&;SpringBoot&;Spring三者解释及关联)
- 使用mpvue开发小程序教程
- 31.2 try finally使用
- 选择排序(C++,Java,Python实现)
- CH5701 开车旅行(倍增dp+set)
- AJ学IOS 之ipad开发Popover的基本使用
- 详解 ServerSocket与Socket类
- 视频+图文 String类干货向总结
- APP测试和WEB测试区别