Django视图层:嵌套参数,URLconf在查找什么?指定视图参数的默认值、include()路由转发三种方式、传递额外选项给 include()、传递额外选项给视图

一、视图层The view layer

Django 具有 “视图” 的概念,负责处理用户的请求并返回响应。
在这里插入图片描述

二、嵌套参数Nested arguments

正则表达式允许嵌套参数,Django 会处理参数并将参数传递给视图。

1、在 Python 正则表达式中,命名的正则表达式组的语法是 (?P<name>pattern) ,匹配pattern并捕获匹配结果,设置name为组名,其中 **name 是组名,pattern 是要匹配的模式**。

1、第一步要导入from django.urls import re_path
2、命名的正则表达式组的写法(?P<name>pattern),P要大写,否则报错
3、urls.py和views.py的参数name组名要保持一致,否则报错

  • 参数嵌套之后,形成内部参数、外部参数之分
  • '^comments/(?:page-(?P<page_number>\d+)/)?$',则外面的(?:page-内部参数/)为外部参数,里面的(?P<page_number>\d+)为内部参数
  • 参数,有捕获参数、非捕获参数之分
  • (?:pattern)或(pattern),匹配pattern但不捕获匹配结果。
  • (?P<name> pattern) ,匹配pattern并捕获匹配结果,设置name为组名

2、在 Python 正则表达式中,未命名的正则表达式组
例如(?P<year>[0-9]{4}) ,或使用更短的未命名组,例如([0-9]{4})

与命名的正则表达式组的区别是没有name。
当混杂命名正则和未命名正则两种样式时,任何未命名的组都会被忽略,而且只有命名的组才会传递给视图函数。

  • 不是特别推荐未命名的正则,因为它会更容易在匹配的预期含义和视图参数之间引发错误。
  • 在任何情况下,推荐在给定的正则表达式里只使用一个样式。当混杂命名正则和未命名正则两种样式时,任何未命名的组都会被忽略,而且只有命名的组才会传递给视图函数。
from django.urls import path, re_path
from mysite import views

urlpatterns = [
    re_path(r"^blog/(page-(\d+)/)?$", views.blog_articles),     # 不推荐此法
    re_path(r"^comments/(?:page-(?P<page_number>\d+))?$", views.comments)
]
from django.http import HttpResponse

def blog_articles(request, page, num):   # 不推荐此法
    return HttpResponse("这是嵌套参数示例一(不推荐此种写法)")

def comments(request, page_number):
    return HttpResponse("这是嵌套参数示例二" + ":第" + page_number + "页")

在这里插入图片描述

当转换时,Django 将试着填充给所有外部捕捉参数,忽略任何嵌套捕捉参数。考虑下面可选的带有页面参数的 URL 模式:

1、示例中的两个模式都使用嵌套参数,并处理:例如, 第一个模式blog/page-2/ 将匹配给 blog_articles 并带有2个位置参数:page-2/ 和 2 。第二个模式comments/page-2/ 将匹配给 comments 并带有关键字参数 page_number=2 ,这个案例里的外部参数是一个非捕捉参数 (?:…) 。
2、blog_articles 视图需要反转最外层捕捉的参数,参数page-2/ 或在这里不需要参数,而 comments 可以在没有参数或有参数page_number=值的情况下反转。
3、嵌套捕捉参数在视图参数和 URL之间创建一个强耦合,正如 blog_articles 所示:视图接收部分 URL (page-2/) 而不只是视图要的值。当反转时这种耦合更明显,因为反转视图我们需要传递一段 URL 而不是 page number。
4、根据经验,只有当正则表达式需要一个参数但视图忽略它时,才捕捉该视图需要的值并使用非捕捉参数

二、URLconf在查找什么?

请求的URL被看做是一个普通的Python 字符串, URLconf在其上查找并匹配。进行匹配时将不包括GET或POST请求方式的参数以及域名。

例如, https://www.example.com/myapp/ 请求中,URLconf 将查找 myapp/
在 https://www.example.com/myapp/?page=3 请求中,URLconf 仍将查找 myapp/ 。

**URLconf 不检查使用了哪种请求方法。**换句话讲,所有的请求方法 —— 即,对同一个URL的无论是 POST请求 、 GET请求 、或 HEAD 请求方法等等 —— 都将路由到相同的函数

三、指定视图参数的默认值

# URLconf
from django
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值