路由定义
路由是客户端访问的url路径与视图函数间的一一映射关系。Django中的路由关系在urls.py文件中,基本格式如下:
urlpatterns = [
url(regex,view, kwargs=None, name=None),
]
参数说明:
regex: 匹配url路径的正则表达式,比如r'^login/'
, 匹配以login/
开头的路径,当你在浏览器地址栏输入http://127.0.0.1/login/
时,会调用login映射的视图函数来处理请求。几点提醒,
1. 为了避免转义,正则的前面最好加上r
;
2. 路径前默认都有前导的反斜杠/
,我们在正则中就不需要再加了,比如r'login/'
就可以,而不用r'^/login/'
;
3. 如果我们访问127.0.0.1:8000/login
,login
后未加反斜杠/
,将会重定向至127.0.0.1:8000/login/
,这时因为默认设置APPEND_SLASH = True。另外,任何未在setting.py文件中定义的配置都由django.conf.global_settings 提供
4. 在进行url路径匹配时,只要匹配成功一个,就不在向下匹配。
view: 映射的视图函数
name: 可以为视图函数定义别名,这个稍后介绍。
配置根目录:
我们必须为项目配置根目录,即当用户访问的url不带路径时,必须有相应的视图函数处理并返回响应,而不是错误页面。加入下面的路由:
url(r'^$', view)
当匹配路径为空,调用指定的视图函数处理。
路径分组和视图函数传参
分组是正则中的操作,对正则表达式加括号,就可以实现路径分组。分组的目的是为了给视图函数传参。这里有两种分组方式,通过位置传参的简单分组,和通过关键字传参的命名分组。我们通过下面的栗子来介绍这两种分组方式。
1.新建一个项目learn, 并创建应用calc
, 在calc
的视图函数中定义一个计算加法的函数add
:
from django.http import HttpResponse
# HttpResponse用于直接返回字符串响应
def add(request,a,b):
# add 函数除了第一个请求对象参数,还从urls.py中的路由接收另外两个参数用于求和
c = int(a) + int(b)
return HttpResponse('{a} + {b} = {c}'.format(a=a, b=b, c=str(c)))
2.在项目的urls.py中编辑路由映射:
2.1 简单分组:
from django.conf.urls import url
from django.contrib import admin
from calc import views as calc_views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^add/(\d+)/(\d+)/', calc_views.add),
# 简单分组:通过圆括号匹配两组数字,作为参数传给视图函数add
]
2.2 命名分组:
from django.conf.urls import url
from django.contrib import admin
from calc import views as calc_views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^add/(?P<c>\d+)/(?P<b>\d+)/', calc_views.add),
# 通过(?P<...>)命名分组, 将分组名a和b传给视图函数add中的关键字参数a和b,
# 分组名必须和关键字匹配:如果分组名为x,y 而视图的关键字是a,b,就会报错。
]
3.在浏览器地址栏输入http://127.0.0.1:8000/add/4/5/
,你将看到以下结果:
4.另外,如果不用分组,可以通过url中的query string查询字符串来提取数字,进行计算。
因此url需要使用查询字符串形式:
http://127.0.0.1:8000/add/?a=4&b=5
urls路由如下:
urlpatterns = [
url(r'^add/$', calc_views.add, name='add'),
]
视图函数中提取查询字符串:
def add