路由可以简单理解就是
URL -> 函数名
例如:
/login1/ -> 函数名
urls.py文件中
urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^index/', views.index),
url(r'^index1/', views.index),
] #从下向下匹配,如果上面URL匹配成功下面就不进行匹配处理
如果要处理很多URL请求时,第一个处理方法,是每个URL写一个对应函数。这样效率不高,优处理方法是通过正则表达式处理:
路由关系中动态参数:
例子1:传递一个参数
urls.py文件中
urlpatterns = [ url(r'^login/(\d+)/', views.login),
]
views.py文件中接收时注意,传入随URL还有一个数字,所以要有两个参数。
def login(request,nid):
print(nid) #nid就是传入数字参数
request HttpResponse('OK')
例子2:传递多个参数
urls.py文件中
urlpatterns = [ url(r'^login/(\d+)(\d+)/', views.login),
]
views.py文件中接收时注意,传入随URL还有一个数字,所以要有多个参数。
def login(request,nid1,nid2):
print(nid1,nid2) #nid就是传入数字参数
request HttpResponse('OK')
例子3:根据名字传递参数
urls.py文件中
urlpatterns = [ url(r'^login/(?P<p1>\d+)/(?P<x2>\d+)/', views.login), ]
views.py文件中接收时注意,传入随URL形参数名称要对应。
def login(request,p1,x2):
print(p1,x2) # 就是传入数字参数
request HttpResponse('OK')
例子3:路由实现简单分页
views.py
USER_LIST = [] for item in range(94):
temp = {'id':item,'username':'alex'+str(item),'email':'email'+str(item)}
USER_LIST.append(temp) def index(request,page): page = int(page)
start = (page-1)*10
end = page * 10
user_list = USER_LIST[start:end]
return render(request,'index.html',{'user_list':user_list}) def detail(request,nid):
#详细页
nid = int(nid)
current_detail_dict = USER_LIST[nid]
return render(request,'detail.html',{'current_detail_dict':current_detail_dict})
urls.py
from django.conf.urls import url
from django.contrib import admin
from cmdb import views urlpatterns = [ url(r'^index/(\d+)', views.index),
url(r'^detail/(\d+)', views.detail),
]
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1 style="color: red">123</h1>
<h1>用户输入:</h1>
<form action="/index/" method="POST">
<input type="text" name="user" />
<input type="text" name="email" />
<input type="submit" value="提交" /> </form>
<h1>数据展示:</h1>
<table border="1">
<tr>
<th>ID:</th>
<th>用户名:</th>
<th>详细信息:</th>
</tr>
{% for line in user_list %}
<tr>
<td>{{ line.id }}</td>
<td>{{ line.username }}</td>
<td><a href="/detail/{{ line.id }}">查看详细</a></td>
</tr> {% endfor %}
</table> {#<script src="/statics/jquery-1.8.2.min.js"></script>#}
</body>
</html>
detail.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<ul> <li>
{{ current_detail_dict.id }}
</li>
<li>
{{ current_detail_dict.username }}
</li>
<li>
{{ current_detail_dict.email }}
</li> </ul> </body>
</html>
效果:
点入查看详细进入详细页detail.html
路由分发
在实现中遇到有多个app,每个app相互独立,在urls.py中要建立多个路由进行对应,效率不高。
改进方案,进行分级urls调置,第一级urls接收到,再转给 app内urls,进行分发
第一级urls.py
"""mysite URL Configuration The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.10/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url
from django.contrib import admin
from cmdb import views
from django.conf.urls import url, include urlpatterns = [
url(r'^web/', include('cmdb.urls')),
]
app内建立一个urls.py
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1 style="color: red">123</h1>
<h1>用户输入:</h1>
<form action="/index/" method="POST">
<input type="text" name="user" />
<input type="text" name="email" />
<input type="submit" value="提交" /> </form>
<h1>数据展示:</h1>
<table border="1">
<tr>
<th>ID:</th>
<th>用户名:</th>
<th>详细信息:</th>
</tr>
{% for line in user_list %}
<tr>
<td>{{ line.id }}</td>
<td>{{ line.username }}</td>
<td><a href="/web/detail/{{ line.id }}">查看详细</a></td>
</tr> {% endfor %}
</table> {#<script src="/statics/jquery-1.8.2.min.js"></script>#}
</body>
</html>
效果在网页输入web/index/1 这样通过web来明确访问那个app