路由层(就时urls文件,那里配置一些列的路由和视图函数对应关系):
urlpatterns = [ url(r'^admin/',admin.site.urls), ]
1、简单路由配置 这里的url其实就是一个函数,第一个参数就传入一个正则表达式,第二个参数传入对应的视图函数 url(r'^user_list/',views.user_list),
2、无名分组 url(r'^user_list/([0-9]{4})',views.user_list), 主要是第一个参数就行改动,前面说了第一个参数传一个正则表达式,我们可以把自己想要的数据进行分组,然后 作为参数传入后面的视图函数中,所以在视图函数中记得接收传送过去的参数。就以上面的路由为例,那我视图该怎么写呢? def user_list(request,year): print(year) return HttpResponse('zhuyu') 这里视图函数中接收了那个参数,在路由层,一个路由分了几个组,视图函数记得接收相应的参数。还有就是这是位置传参, 所以接收的时候,也是按位置接收。 def user_list(request,*args): pass 这样写也是可以的!
3、有名分组 url(r'^user_list/(?P[0-9]{4})',views.user_list), 这里就是进行有名分组,将得到得到的数据赋值给一个变量,然后以year=2018的格式作为参数传到视图函数中,这里 同无名分组一样,视图函数那里记得接收传过来参数,但是参数名必须是year。 def user_list(request,year): print(year) return HttpResponse('zhuyu') 注意,这里的参数year一定要和urls那里的参数一样。
4、反向解析 url(r'user/',views.user), url(r'^user_list/',views.user_list,name='zhuyu'), url函数有四个参数,其中有一个name,就是给该条路由关系定义个名字 有什么用呢? 在你的视图函数或你的模板里肯定会用到一些url,那么r'^user_list/'发生了变化,是不是你的项目里用到该url 的地方是不是也要进行相应的改动,这样你的程序才会和之前一样。万一你的项目很大,很多地方用到该url,改起来 岂不是非常麻烦呢。 怎么用(分别在视图函数,模板中) 有了上面的疑问,那url函数中的name参数的作用就起到了作用 1、在视图函数中引用到反向解析 from django.shortcuts import reverse #先导入该函数reverse def user(request): url = reverse('zhuyu') print(url) #打印下url看下是什么东西 return redirect(url) def user_list(request): return HttpResponse('hello') 这里这样写了之后,路由层里url怎么变动,都不会影响该视图函数的重定向 2、在模板中引用到反向解析 点击 假如是这种情况呢? url(r'user/',views.user), url(r'^user_list/([0-9]{4})',views.user_list,name='zhuyu'), 还是老样子分别在视图函数和模板演示 1、视图函数中 def user(request): url = reverse('zhuyu',args=(2018,)) print(url) return redirect(url) def user_list(request,year): return HttpResponse('hello') 注意:args必须是一个元组形式 2、模板中 { % url 'zhuyu' 2018 %} 注意:url其实也是一个函数,传参的方法就是参数之间空格就行 那这种情况呢? url(r'user/',views.user), url(r'^user_list/(?[0-9]{4})',views.user_list,name='zhuyu'), 1、视图函数中 def user(request): url = reverse('zhuyu',kwargs=(year=2018,)) print(url) return redirect(url) def user_list(request,year): return HttpResponse('hello') 2、模板中 { % url 'zhuyu' year=2018 %}
5、路由分发 ROOT_URLCONF = 'book.urls' 假如都把路由与视图函数的关系全都写在一个文件里的话,这样你的文件就会特别乱。 我们不是有app的概念嘛,一个请求的url进来,先去总路由去匹配,成功匹配的话, 就继续将该路由分发那属于它app的urls路由关系映射中。 大致简记下: 你有两个app,一个app01,一个是app02,在这两个app一样也有一个路由和视图函数的关系 首先请求的url进去总路由中匹配,如果是app01开头,就把该请求的url继续分发到app01中 的路由关系中,进行匹配。 写写代码吧,首先你要有两个app,里面创建一个文件,写路由关系,文件名一般为urls 在你的总路由文件里,先要导入 from django.conf.urls import url,include urlpatterns = [ url(r'^app01/',include('app01.urls')) url(r'^app02/',include('app02.urls')) ] app02中urls配置 from django.conf.urls import url from app02 import views urlpatterns = [ url(r'^user/$',view.user) url(r'^user_list/$',view.user_list) ] 在浏览器输入:128.0.0.1:8000/app02/user 就会匹配到相应的视图
6、名称空间 名称空间一般和路由分发一起使用,之前不是有反向解析嘛,name='zhuyu',万一几个url都为name='zhuyu', 那么我是用zhuyu到底是用时的是哪个就分不清楚了,所以名称空间就十分有必要的 在include函数中,有个namespace参数,这就是给分发的路由设置个名字。 我们给app02设置 namespace=app02 1、视图函数中 def user(request): url = reverse('app02:zhuyu',kwargs=(year=2018,)) print(url) return redirect(url) 2、模板中 { % url 'app02:zhuyu' year=2018 %}
7、伪静态 伪静态从名字来看:它是一个伪装的静态网页,那么就是一个多态网页了。 你可以url写成html,那么百度会默认以为是静态网页,收入到数据库中,这样是你的网页可能比其他网页先匹配到。