首页 > 其他分享 >第三章:路由层

第三章:路由层

时间:2023-01-02 01:33:06浏览次数:33  
标签:index 第三章 views url urls reg 路由

路由层

路由匹配

语法

# 路由层就是项目文件夹下的urls.py文件
# urlpatterns就是路由匹配路径
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^home/$', views.home)
]
"""他的查找顺序是从上往下找,匹配上任意一个就会立刻停止往下找,全部匹配不上就会报错"""

# Django1.x的路径语法格式
urlpatterns = [
    url(正则表达式,views视图函数,参数,别名),
]
  • 正则表达式:一个正则表达式字符串

  • views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串

  • 参数:可选的要传递给视图函数的默认参数(字典形式)

  • 别名:一个可选的name参数

  • 注意事项

    1. urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
    2. 若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)。
    3. 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
    4. 每个正则表达式前面的'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

相关文章

  • m认知无线电网络中频谱感知的按需路由算法matlab仿真
    1.算法概述         使用无线电用户的频率范围在9kHz到275GHz[3],由于无线通信环境中的干扰、信道衰落和无线电收发设备自身属性等的影响,大部分无线电设......
  • m认知无线电网络中频谱感知的按需路由算法matlab仿真
    1.算法概述使用无线电用户的频率范围在9kHz到275GHz[3],由于无线通信环境中的干扰、信道衰落和无线电收发设备自身属性等的影响,大部分无线电设备只能工作在50GHz以下......
  • C++ Primer第三章知识点(想起来啥记啥版)
    命名空间#include<iostream>//using声明,当我们使用名字cin时,从命名空间std中获取它usingstd::cin;intmain(){inti;cin>>i;//正确:cin和st......
  • 静态路由配置
    1、路由器的工作原理路由器属于网络层设备,能够根据IP数据包包头的信息,选择一条最佳路径,将数据包转发出去,以实现不同网段的主机之间的互相访问。路由器时刻维持着一张路由表,......
  • MAUI新生6.5-导航路由Navigation
    MAUI的Shell导航框架,也是以路由方式进行导航,并提供了两套导航方式,一是如前面章节所述的视觉层次结构,会自动建立导航路由,可以进行不同层次页面的导航切换;二是为页面手动注册......
  • 《程序是怎样跑起来的》第三章
    《程序是怎么跑起来的第三章》:计算机进行小数处理也有可能会出现问题,是在将二进制表示的小数转换为十进制时出现的错误,因为有些十进制的小数无法转换为二进制,也就无法用二......
  • 如何在PVE(Proxmox)中安装OpenWrt软路由?
    出处:https://www.928wang.cn/archives/1763.htmlhttps://blog.itwk.cc/post/pve_install_openwrt.html工具准备WinSCP或者XFTPOpenWrt镜像(自行寻找)安装好PVE的主......
  • 第144期:flutter的导航和路由
    封面图那些封控做核酸的日子,仿佛还在昨天。这几天核酸检测点撤掉之后,仿佛疫情根本没有发生过一样~导航和路由Flutter提供了一个完整的用于在屏幕之间导航和处理深层链接的系......
  • 华为路由器映射内部服务器到公网
    网络描述:客户内部有一台OA服务器,及提供外部使用,又供内部使用。在AR路由器上配置NATServer配置。拓扑如下:关键配置:AR1配置aclnumber2000 rule5permit interface......
  • Django路由层
    目录路由层1.路由匹配2.转换器详3.正则匹配4.正则分组5.反向解析路由层1.路由匹配django2.X及以上path第一个参数写什么就匹配什么django1.X第一个参数是正则表达式......