Django的平常-路由层

Django的平常-2

路由层

咱们以前已经接触过路由层,只是咱们可能不知道他叫这个名字,实际上在Django里面路由层指的就是urls.py这个文件.前端

路由的概念是什么,咱们平时生活中接触最多的和路由有关的大概就是路由器了,那么路由器是干吗的?python

路由器是链接多个网络的硬件设备,在网络之间起到网关的做用,能够对不一样网络的网络之间的数据包进行处理和转发.正则表达式

Django里面的路由层与此做用有些相似,路由即请求地址和视图函数的映射关系,若是咱们把一个网站比喻成一本书的话,那么路由就是这本书的目录,也能够说是索引.django

urls.py里面配置的模板为:后端

# urls.py
from django.conf.urls import url    #这里导入url,要注意的是Django在版本为1.x的时候是用的url,可是在版本为2.x的时候用的是path,且用法不太同样,2.x版本的re_path的用法是彻底继承于url的,可是path不能,最大的区别就在于path不能用正则来匹配网址

urlpatterns = [
     url(regex, view, kwargs=None, name=None), # url本质就是一个函数
]
# regex:正则表达式,用来匹配url地址的路径部分,
    # 例如url地址为:http://127.0.0.1:8001/index/,正则表达式要匹配的部分是index/
# view:一般为一个视图函数,用来处理业务逻辑

# 举个栗子:
urlpatterns = [
    url(r'^admin/', admin.site.urls),   # 系统默认的
    url(r'test/$', views.test),  # 严格正则,必须一个字不差才能进去该网页
    url(r'^$', views.home),  # 网站首页,只有网站的首页不含任何后缀,因此一般用这种写法来转到网站首页
    # url(r'test/[0-9]{4}', views.test),    #正则匹配,数字,且必须是四位
    url(r'', views.errors)  # 自定义报错404页面,与网站首页不一样,这个定义必定要放在最后面,不能放在前面,否则会阻止下方url的判断
]

# 这里有几个注意事项:
1. url第一个参数是一个正则表达式
2. 一旦匹配上了,会马上执行对应的视图函数,再也不往下匹配
3. ^ 能够限制其开头,$能够限制其结尾,这是正则匹配里面的内容

还有一个小问题,其实有时候咱们在输入网址的时候,没有加最后面的左下划线,但是网页仍是跳转成功了,这是由于Django里面会有这个配置,在settings.py文件里面,在最后咱们能够定义一个网络

APPEND_SLASH = False
# 由于Django里面这个值默认为True,也就是默认会补齐,实际状况是补上左下划线再尝试一次,并非补齐的概念

好比,咱们在设置过这个选项以后,在输入如下网址 http://127.0.0.1:8000/indexapp

当前,前提是你已经设置过urls以及写了一个views函数名为index函数

咱们能够在网页F12的检查里面的network标签里看到两个请求,一个是index,一个是index/,网站

而index的请求状态码为301,也就是重定向,index/的状态码为200,这才是咱们最后看到的网页的结果

有名分组和无名分组

首先,分组,咱们知道分组的目的就是为了把有相同特质的事物分到一块儿,便于查找和管理,Django里面也是如此的,咱们把类似内容或者格式的网页分到一组,可让咱们更方便的管理网页.

那么在分组以后咱们应该怎么调用这些网页呢,好比咱们在http://127.0.0.1:8000/index/这个后缀下面创建了100个网页,从http://127.0.0.1:8000/index/1http://127.0.0.1:8000/index/100那么难道咱们须要在urls.py里面写一百条语句?

非也,此时咱们分组的重要性就体现出来了.分组能够完美解决这个问题,下面咱们就来介绍两种分组方式,无名分组和有名分组

无名分组

# 无名分组的方式大体以下
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),#这个是默认的,不用管
    
    # 下述正则表达式会匹配的部分为:index/数字/,匹配成功的分组部分会以位置参数的形式传给视图函数,注意,是位置参数,咱们在views.py里面接收参数的时候要注意格式,要定义成index(request,*args)
    url(r'^index/(\d+)/$',views.index), 
]
# 这样分组的状况下,咱们输入的网址,但凡前缀是http://127.0.0.1:8000/index/,后面加的一个纯数字的网址,均可以匹配进入index这个函数,而后执行

有名分组

#有名分组以下
# 无名分组的方式大体以下
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),#这个是默认的,不用管
    
    # 匹配的方式和无名分组类似,可是,匹配成功的部分是以关键字参数的形式传输的,注意,是关键字参数,咱们在views.py里面接收参数的时候要注意格式,要定义成index(request,**kwargs)
    url(r'^index/(?P<year>\d+)/$',views.index),# 分组,取名为year
]

这里要强调一点的是,有名分组和无名分组不能混合使用,也就是说同一个URL里面,能够有多个有名分组,也能够有多个无名分组,可是不能同时包含有名分组和无名分组.

反向解析

在说反向解析以前,咱们要知道解析的概念,在Django里面,解析的概念就是咱们写好后端和前端,运行起来,前端把本身的代码翻译出来,当别人输入网址就自动跳转到这个界面,大概就是解析的概念,解析的关键在于经过正确的路径获取到一个对象,或者一个网址.

那么反向解析的概念也就出来了,反向解析就是咱们从一个别名,或者说是从一个对象来获取到其路径的这么一个过程,就叫作反向解析.反向解析在Django里面最大的便利在于咱们会给url起一个别名,而后经过这个别名来获取路径,这样无论咱们url后缀怎么改变,其他的代码都不用随之发生变化.

  • 这里要注意的一点是,咱们在给url起别名的时候,前面应该加上本身的应用名,这样在和别人合做完成一个比较大的项目的时候才不会出现函数冲突的状况

反向解析通常在三个地方会使用,即平时固定网址使用,或者在有名分组以及无名分组里面使用.

无分组的反向解析

首先,反向解析的前提是咱们要在urls.py里面的url里定义name属性

# 好比咱们给编辑页面起别名为app01_edit
# urls.py
url(r'^edit_user/', views.edit_user, name='app01_edit')

# 那么咱们须要在前端,也就是html页面里面这么写
# edit_uset.html
<a href="{% url 'app01_edit' %}">111</a>

# 而后,咱们须要在后端,也就是views.py里面写
from django.shortcuts import reverse
url = reverse('app01_edit')
# 这样能够直接解析出来一个对象,此时反向解析所有完成

无名分组的反向解析

# 和无分组有必定的区别

# 无名分组的反向解析

# urls.py
url(r'^edit_user/(\d+)/', views.edit_user, name='app01_edit')

# 那么咱们须要在前端,也就是html页面里面这么写
# edit_uset.html
<a href="{% url 'app01_edit' user_obj.pk %}">111</a>
# user_obj.pk 会取到该对象的主键

# 而后,咱们须要在后端,也就是views.py里面写
from django.shortcuts import reverse
url = reverse('app01_edit',args=(1,))

有名分组的反向解析

# 有名分组的反向解析

# urls.py
url(r'^edit_user/(?P<year>\d+)/', views.edit_user, name='app01_edit')

# 那么咱们须要在前端,也就是html页面里面这么写
# edit_uset.html
<a href="{% url 'app01_edit' user_obj.pk %}">111</a>

# 而后,咱们须要在后端,也就是views.py里面写
from django.shortcuts import reverse
url = reverse('app01_edit',kwargs = {'key':1})

路由的分发

随着项目愈来愈大,咱们的app数量也会随之增多,此时若是全部的url都写在项目主目录下的urls里,那么这个urls.py就会十分庞大,并且工总量也很大,同时不便于管理,结构也不清晰,因此咱们提出了路由分发这么一个概念,即每一个app都会有本身的urls.py,有本身的static,templates文件夹,这样每一个app均可以实现本身的功能,且彻底不会影响其余的app,因此咱们项目下的urls.py只须要做为一个中转站便可,只负责将请求分发到不一样的app中,而后由app中的urls.py完成路由与视图函数的对应关系.

这里咱们有一种很是简单的执行方法

# /urls.py

urlpatterns = [
    url(r'^app01/',include('app01.urls')),
    url(r'^app02/',include('app02.urls'))
]

# 这样咱们就能够把须要app01执行的请求转发给app01,须要app02执行的请求转发给app02
相关文章
相关标签/搜索