urls
urls.py文件是对请求的路由,通过访问不同路径进行不同的处理。
如前几篇文章中写的urls.py文件
from django.conf.urls import url
from django.contrib import admin
from demo import views #导入demo包下的views模块,后来添加的
urlpatterns = [
url(r'^admin/', admin.site.urls), #其中括号内第一个参数为匹配的内容,第二个参数为匹配后执行的方法
url(r'^login/$', views.login), #login的请求转发给views模块内的login函数处理,后来添加的
]
那么问题来了,如果要匹配的页面比较多,有几十上百,都写在这个脚本中会显得比较乱,不够简洁也不够直观。这时可以通过匹配一级路径,跳转到其他脚本来完成二级甚至三级路径的匹配。
下面看优化后的urls.py代码
from django.conf.urls import url, include #添加了一个include项
from django.contrib import admin
from demo import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/$', views.login),
url(r'^api/', include('demo02.urls')), #首先匹配到api这个一级路径,然后跳转到demo02.urls这个模块去继续匹配二级路径
]
先使用命令去创建一个名字为demo02的app
python manage.py startapp demo02
在demo02目录下新建一个urls.py文件
from django.conf.urls import url, include
from django.contrib import admin
from demo02 import views #导入demo02下的views模块
urlpatterns = [
url(r'^list.html', views.list), #匹配二级路径list.html,跳转到demo02下的views.py的list方法处理
url(r'^add.html', views.add), #匹配二级路径add.html,跳转到demo02下的views.py的add方法处理
url(r'^update.html', views.update), #匹配二级路径update.html,跳转到demo02下的views.py的update方法处理
url(r'^delete.html', views.delete), #匹配二级路径delete.html,跳转到demo02下的views.py的delete方法处理
]
demo02下的views.py内容
from django.shortcuts import render,HttpResponse
def list(request): #处理demo02下的urls.py中的list.html的请求
return HttpResponse('this list')
def add(request): #处理demo02下的urls.py中的add.html的请求
return HttpResponse('this add')
def update(request): #处理demo02下的urls.py中的update.html的请求
return HttpResponse('this update')
def delete(request): #处理demo02下的urls.py中的delete.html的请求
return HttpResponse('this delete')
然后启动项目,访问http://127.0.0.1:8000/api/list.html就会返回一个显示“this list”字符的页面,访问http://127.0.0.1:8000/api/ladd.html同理会显示“this add”。
整个流程就是当你访问http://127.0.0.1:8000/api/list.html这个页面时,项目下的utls.py首先会匹配到api这个一级路径,然后根据使用的include方法,跳转到demo02这个app下的urls.py,再次匹配到list.html这个二级路径,跳转到该app(demo02)下的views.py文件的list方法去处理该次请求,最后返回给客户端一个显示“this list”的页面。
如果需要从url中获取一些参数时,如页面翻到第几页等,这时可以在urls.py文件中配置正则匹配来获取该参数,下面看urls.py中的代码
urlpatterns = [
url(r'^blog/$', views.page),
url(r'^blog/page(?P<num>[0-9]+)/$', views.page), #括号中的?P<num>[0-9]+就是获取url中的参数,使用了正则匹配。?P是固定写法,<num>[0-9]+表示0-9的数字参数赋值给num这个变量,这样num就拿到了参数值,这个num是字符串类型
]
urls.py就拿到了这个参数,并且把它放到num这个变量中。views.py想要接收这个参数,需要在方法中添加一个参数。
注意:urls.py里拿到参数值的变量num类型为str,想要使用数字需要用int转换
views.py代码
def page(request, num="1"): #num这个参数来接收urls.py中变量的值,默认是1
pass