<span> - Go语言中文社区

<span>


一.路由层之路由匹配

1.什么是路由

  • 路由可以看成是跟在 ip 和 port 之后的地址

image-20210316195939091

2.url( ) 方法

# 示例
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', views.login_func),
    url(r'^register/$', views.register_func),
]
  • url( ) 方法的第一个参数其实是正则表达式, 一旦第一个参数匹配到了内容直接结束匹配, 并调用对应的视图函数

3.路由匹配注意事项

  • 不需要在路由前面添加反斜杠 "/", 因为每个 url 自带
  • 建议在正则表达式之前添加原生字符 "r"
  • 每个由正则匹配成功并通过分组捕获的参数都会作为一个普通的Python字符串传递给视图函数
  • 如果路由结尾没有"/", 在第一次正则匹配机制没有匹配到想要的内容时, 会在匹配字符后加一个"/", 然后Django内部重定向在匹配一次

image-20210316201356011

4.取消自动添加斜杠 "/"

  • 上面测试了路由后面不添加"/"一共匹配了两次
  • 而自动添加斜杠这种操作是可以取消的
# setting.py 文件
APPEND_SLASH = False  # 默认 True 自动添加斜杠
  • 设置之后如果不添加斜杠就无法访问资源

image-20210316202018217

建议自动添加

二.分组命名匹配

1.无名分组

  • url( ) 方法中第一个参数正则表达式分组 : 给正则表达式前后加一个小括号

  • 会将括号内正则表达式匹配到的内容当做位置参数传递给后边的视图函数

url(r'^login/$', views.login_func)

# 无名分组 
url(r'^login/(d+)/$', views.login_func)
# 视图函数
def login_func(request,*args):
    print(args)
    return Httpresponse(args)

2.有名分组

  • 将正则表达式分组捕获到的内容定义一个名字
  • 会将括号内正则表达式匹配到的内容当做关键字参数传递给后面的视图函数
url(r'^login/$', views.login_func)

# 有名分组
url(r'^login/(?P<id>d+)/$', views.login_func)
# 视图函数
def login_func(request,**kwargs):
    print(kwargs)
    return Httpresponse(args)

3.无名有名是否可以结合使用

  • 不能结合使用
url(r'^login/(d+)/(?P<id>d+)/$', views.login_func)
# 官方说不能混着用, 混着用只能取到有名分组捕获的值
# 只要不混着用,有名分组和无名分组支持多个相同类型的传参
  • 可以单个重复使用
url(r'^login/(d+)/(d+)/$', views.login_func)
url(r'^login/(?P<id>d+)/(?P<id>d+)/$', views.login_func)

三.反向解析

1.什么是反向解析

  • 反向解析就是通过一些方法得到一个结果, 该结果可以直接访问对应的 url 并触发视图函数

2.反向解析的作用

  • 在使用一个 Django 项目时, 我们经常需要将一个 url 嵌入到生成的内容中去, 如果将这些 url 固定写死, 那么可扩展性很差, 并且一定程度上会产生过期的 url
  • 使用反向解析就是当路由频繁变化的时候, 让 html 界面上的连接地址做到动态解析

3.如何使用反向解析

  • 给路由与视图函数对应关系添加一个别名 (名字由自己指定, 只要不冲突即可)
# 路由层
url(r'^login/$', views.login_func,name='login_name')
  • 根据该别名可动态解析出一个结果, 该结果可以直接访问到对应的路由
# 前端中使用(模板层)
<a href="{% url 'login_name' %}">登入</a>

# 后端中使用(视图层)
from django.shortcuts import reverse
url = reverse('login_name')

ps : redirect( ) 括号内也可以直接写别名

4.无名分组反向解析

  • 路由层配置
url(r'^login/(d+)/', views.login_func,name='login_name')
  • 视图层配置
from shortcuts import reverse
url = reverse('login_name',args=(1,))  # 随便给个数字
  • 模板层
<a href="{% url 'login_name' 1 %}">登入</a>  # 随便给个数字

路由层中分组匹配得到的数字并不是我们这样写死的, 一般情况下放的是数据的主键值, 我们可以通过获取到数据的主键.进而定位到数据对象, 从而可以对数据进行编辑和删除

# 路由层
url(r'^login/(d+)/', views.login_func,name='login_name')

# 视图层
def edit(request,edit_id):
    reverse('login_name',args=(edit_id,))
    
# 模板层
{% for user_obj in user_list %}
    <a href="{% url 'login_name' user_obj.id %}">kkk</a>

5.有名分组反向解析

  • 路由层配置
url(r'^login/(?P<id>d+)/', views.login_func,name='login_name')
  • 视图层配置
from shortcuts import reverse
url = reverse('login_name',kwargs=(id:111))  # 随便给个数字
url= =
reverse('login_name',args=(111,))      # 也可以这样写
  • 模板层配置
<a href="{% url 'login_name' id=111 %}">登入</a>  # 随便给个数字
<a href="{% url 'login_name' 11 %}">登入</a>      # 也可以这样写

由上面的视图层与模板层的第二种书写方式可以看出 : 无名有名都可以使用一种反向解析形式 : 就是无名反向解析

四.路由分发

1.路由分发简介

django是专注于开发应用的,当一个django项目特别庞大的时候, 所有的路由与视图函数映射关系全部写在一个 urls.py 里面很明显太冗余并且不便于管理

其实django中的每一个应用都可以有自己的 urls.py、static文件夹、templates文件夹, 基于上述特点, 使用django做分组开发非常的简便

每个人只需要写自己的应用即可, 最后由组长统一汇总到一个空的django项目中然后使用路由分发将多个应用关联到一起

  • 利用路由分发之后, 总路由不再干路由与视图函数的直接对应关系, 而是做一个分发处理, 进而识别当前url所属的应用, 最后直接分发给对应的应用去处理就行了, 并且应用路由重名也无关要紧

2.路由分发设置

  • 总路由文件 : urls.py

版权声明:本文来源博客园,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.cnblogs.com/songhaixing/p/14551249.html
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-04-07 20:32:31
  • 阅读 ( 581 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢