路由层
路由匹配
语法
# 路由层就是项目文件夹下的urls.py文件
# urlpatterns就是路由匹配路径
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^home/$', views.home)
]
"""他的查找顺序是从上往下找,匹配上任意一个就会立刻停止往下找,全部匹配不上就会报错"""
# Django1.x的路径语法格式
urlpatterns = [
url(正则表达式,views视图函数,参数,别名),
]
-
正则表达式:一个正则表达式字符串
-
views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
-
参数:可选的要传递给视图函数的默认参数(字典形式)
-
别名:一个可选的name参数
-
注意事项
- urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
- 若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)。
- 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
- 每个正则表达式前面的'r' 是可选的但是建议加上。
具体应用
urlpatterns = [
# Django1.x自带的
url(r'^admin/', admin.site.urls),
# 首页
url(r'^$', views.home),
# 其他页面
url(r'^login$', views.login),
# 404页面
url(r'', views.error)
]
输入url自动加斜杠
# 在输入url的时候会默认加斜杠
# Django内部自动帮你做重定向,一次匹配不行,url后面加斜杠再来一次
例如:访问 http://www.example.com/blog 时,默认将网址自动转换为http://www.example/com/blog/
# 如何关闭
在settings配置文件中加上
APPEND_SLASH = Flase # 他默认是为True
分组匹配
分组:就是把一段正则表达式用小括号括起来
无名分组
url(r'^index/(\d+)', views.index)
def index(request, xx):
print(xx) # 打印的就是正则 \d+ 匹配到的
return
# 无名分组就是将括号内正则表达式匹配到的内容当作位置参数传递给后面的视图函数
有名分组
# 可以给正则表达式起一个别名
# 将正则匹配到的 \d+ 命名为name并传给视图函数
url(r'^index/(?P<name>\d+)', views.index)
def index(request, name):
print(name) # 打印的就是正则 \d+ 匹配到的
return
# 有名分组就是将括号内正则表达式匹配到的内容当作关键字参数传递给后面的视图函数
注意
无名分组和有名分组不可以混用,但是一个分组可以使用多次
url(r'^index/(\d+)/(\d+)/(\d+)', views.index)
url(r'^index/(?P<name>\d+)/(?P<age>\d+)/(?P<hobby>\d+)', views.index)
反向解析
当url后面的正则表达式变化时,不用改前端和后端调用的接口名,他会自动识别,跟动态文件解析一个道理
"""反向解析的本质"""
通过一些方法得到一个结果,该结果可以直接访问对应的url触发视图函数
没有分组的反向解析
# 通过一些方法得到一个结果,该结果可以直接访问对应的url触发视图函数
# 先给路由与视图函数起一个别名,name后面就是别名,别名不可重复
url(r'^func', views.func, name='xxx')
# 反向解析
# 后端反向解析,需要借助reverse模块
from django.shortcuts import render, HttpResponse, redirect, reverse
url = reverse('xxx')
# 前端反向解析
<a href="{% url 'xxx' %}"></a>
"""当 url(r'^func', views.func, name='xxx') 中的func发生变化时不影响前端和后端的调用"""
无名有名反向解析
"""无名分组反向解析"""
url(r'^index/(\d+)/', views.index, name='ooo')
# 后端
reverse('ooo', args=(123,)) # 数字123表示正则 \d+ 可以匹配到的内容
# 前端
<a href="{% url 'ooo' 321 %}">点击进入index</a> # 数字321表示正则 \d+ 可以匹配到的内容
"""有名分组反向解析"""
url(r'^user/(?P<name>\d+)/', views.user, name='aaa')
# 后端
# 写法一:完完整整的写
url1 = reverse('aaa', kwargs={'name': 123})
# 写法二:简写
url2 = reverse('aaa', args=(123,))
# 前端
# 写法二:完整的写
<a href="{% url 'aaa' name=123 %}">点击进入user</a>
# 写法二:简写
<a href="{% url 'aaa' 123 %}">点击进入user</a>
写数字的地方一般用来传递数据的主键值,来进行数据的编辑和删除
url(r'^index/(\d+)/', views.index, name='ooo')
def index(request, index_id):
reverse('ooo', args=(index_id,))
{%for user_obj in user_queryset%}
<a href="{% url 'ooo' user_obj.id %}">编辑</a>
{%endfor%}
路由分发
# Django的每一个应用都可以有自己的templates文件夹、urls.py文件和static文件夹
# 正是基于以上特点,Django能够非常好的做到分组开发,每个人只写自己的app
# 作为组长,只需要将手下书写的app全部拷贝到一个新的Django项目中,然后再配置文件里面注册所有的app在利用路由分发的特点所有的app整合起来
# 当一个Django项目中的url特别多的时候,总路由urls.py代码非常冗余不好维护,这个时候也可以利用路由分发来减轻总路由的压力
# 利用路由分发之后,总路由不在干路由与视图函数的直接对应关系,而是做一个分发处理
# 识别当前url是属于那个应用下的,直接分发给对应的应用去处理
"""总路由(项目文件夹下的urls.py文件)"""
# 路由分发
# 方法一:
from django.conf.urls import url, include # 记得导入include
from app01 import urls as app01_urls
from app02 import urls as app02_urls
urlpatterns = [
url(r'^app01/', include(app01_urls)), # 只要前缀是app01打头,一律分发给app01处理
url(r'^app02/', include(app02_urls)) # 只要前缀是app02打头,一律分发给app01处理
]
# 方法二:推荐使用
from django.conf.urls import url, include # 记得导入include
urlpatterns = [
url(r'^app01/', include('app01.urls')),
url(r'^app02/', include('app02.urls'))
]
# 注意:总路由里面的url后面千万不要加$结尾
"""子路由(app下自己创建的urls.py文件)"""
# app01下的urls.py
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^reg/', views.reg)
]
# app02下的urls.py
from django.conf.urls import url
from app02 import views
urlpatterns = [
url(r'^reg/', views.reg)
]
名称空间
# 当不同app中的出现路由别名相同的情况,正常情况的反向解析是无法识别前缀的
# 我们可以在总路由加上名称空间:namespace
from django.conf.urls import url, include # 记得导入include
urlpatterns = [
# namespace后面写app的名字
url(r'^app01/', include('app01.urls', namespace='app01')),
url(r'^app02/', include('app02.urls', namespace='app02'))
]
# 加了名称空间后的反向解析
# app01下的urls.py
urlpatterns = [
url(r'^reg/', views.reg, name='reg')
]
# app02下的urls.py
urlpatterns = [
url(r'^reg/', views.reg, name='reg')
]
# 后端
reverse('app01:reg')
reverse('app02:reg')
# 前端
{% url 'app01:reg' %}
{% url 'app02:reg' %}
一般情况下,在有多个app的时候我们在起别名的时候会加上app的前缀,这样的话就不会存在app之间别名冲突的问题,例如app01_reg、app02_reg
伪静态(了解)
# 伪静态就是把动态网页伪装成静态网页
这样可以增加本网站的查询力度
并且增加搜索引擎收藏本网站的概率
# 怎样进行伪静态
urlpatterns = [
# 把后缀改为.html结尾的就可以
url(r'^reg.html', views.reg, name='reg')
]
标签:index,第三章,views,url,urls,reg,路由
From: https://www.cnblogs.com/liuhousheng/p/17019342.html