Django 之 路由层

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

Django如何处理请求

当用户从Django支持的站点请求页面时,这是由路由层确定要执行的Python代码:

  1. Django确定要使用的根 URLconf 模块。通常,这是 ROOT_URLCONF 设置的值,但如果传入的 HttpRequest 对象具有 urlconf 属性(由中间件设置),则将使用其值代替 ROOT_URLCONF 设置。。
  2. Django加载Python模块并查找变量urlpatterns。urlpatterns是由django.conf.urls.url() 实例的Python列表。
  3. Django按顺序遍历每个URL模式,匹配到一个之后立即匹配,直接执行对应的视图函数。
  4. 一旦其中一个正则表达式匹配,Django就会导入并调用给定的视图。视图传递以下参数:
    • HttpRequest的一个实例。
    • 如果匹配的正则表达式未返回任何命名组,则正则表达式中的匹配将作为位置参数提供。
    • 关键字参数由正则表达式匹配的任何命名组组成,由django.conf.urls.url()的可选kwargs参数中指定的任何参数覆盖。
  5. 如果没有正则表达式匹配,或者在此过程中的任何点期间引发异常,Django将调用适当的错误处理视图。

路由层

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^hello/$',views.hello),
    url(r'^helloword/$',views.helloword),
]

​ 注意:第一个参数是正则表达式,匹配规则按照从上往下一次匹配,匹配到一个之后立即匹配,直接执行对应的视图函数

网站首页路由
url(r'^$',views.home)
网站不存在页面
url(r'',views.error)

url()函数有四个参数, 两个是必须的: regex 和 view , 两个可选的: kwargs 和 name

  • regex 是 regular expression 的简写,这是字符串中的模式匹配的一种语法,Django 将请求的URL从上至下依次匹配列表中的正则表达式,直到匹配到一个为止。

  • view 当 Django匹配了一个正则表达式就会调用指定的view逻辑, 上面代码中会调用app01/views.py中的hello函数。

  • kwargs任意关键字参数可传一个字典至目标view。

  • name命名你的 URL, 使 url 在 Django 的其他地方使用, 特别是在模板中。

一个路由匹配示例:

from django.conf.urls import url
from app01 import views
urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

示例请求:

  • 请求 /articles/2005/03/ 与列表中的第三个条目匹配。Django会调用该函数 。views.month_archive(request, ‘2005’, ‘03’)
  • /articles/2005/3/ 不匹配任何URL模式,因为列表中的第三个条目需要两个月的数字。
  • /articles/2003/ 将匹配列表中的第一个模式,而不是第二个模式,因为模式是按顺序测试的,第一个是第一个要通过的测试。随意利用订单插入这样的特殊情况。在这里,Django会调用该函数 views.special_case_2003(request)
  • /articles/2003 不匹配任何这些模式,因为每个模式都要求URL以斜杠结尾。
  • /articles/2003/03/03/将匹配最终模式。Django会调用该函数。views.article_detail(request, ‘2003’, ‘03’, ‘03’)

无名分组

将加括号的正则表达式匹配到的内容当做位置参数自动传递给对应的视图函数.

url(r'^hello/(\d+)/',views.hello),  # 匹配一个或多个数字
def hello(request,xxx):
    print(xxx)
    return HttpResponse('hello!')

有名分组

将加括号的正则表达式匹配到的内容当做关键字参数自动传递给对应的视图函数.

url(r'^hello/(?P<year>\d+)/',views.hello),  # 匹配一个或多个数字

def hello(request,year):
    print(year)
    return HttpResponse('hello!')

注意:无名分组和有名分组不能混着用,但是支持用一类型多个形式匹配!!!

不支持
url(r'^test/(\d+)/(?P<year>\d+)/',views.test) # 会报错
无名分组多个
url(r'^test/(\d+)/(\d+)/',views.test),
有名分组多个
url(r'^test/(?P<year>\d+)/(?P<xxx>\d+)/',views.test),

反向解析

如果把网址写死网址,会使得在改了网址(正则)后,模板(template),视图(views.py,比如用于URL跳转),模型(models.py,获取记录访问地址等)用了此网址的,都必须进行相应的更改,修改的代价很大,一不小心,有的地方没改过来,就不能用了。所以需要根据名字动态获取到对应路径,这就是所谓的URL反向解析,反向URL匹配,反向URL查找或简单的URL反转。

Django提供了用于执行URL反转的工具,这些工具匹配需要URL的不同层:

  • 在模板中:使用 url 模板标记。
  • 在Python代码中:使用该 reverse() 函数。
  • 在与处理Django模型实例的URL相关的更高级代码中:该 get_absolute_url() 方法。
from django.shortcuts import reverse	
url(r'^index666/$',views.index,name='index')

前端使用
{% url 'index' %}
{% url '你给路由与视图函数对应关系起的别名' %}

后端使用
reverse('index')
reverse('你给路由与视图函数对应关系起的别名')

reverse 接收 url 中的 name 作为第一个参数,我们在代码中就可以通过 reverse() 来获取对应的网址(这个网址可以用来跳转,也可以用来计算相关页面的地址),只要对应的 url 的name不改,就不用改代码中的网址。

无名分组反向解析

url(r'^test/(\d+)/',views.test,name='list')

前端使用
{% url 'list' 10 %}

后端使用
reverse('list',args=(10,))

示例:
user_list = models.User.objects.all()
url(r'^edit/(\d+)/',views.edit,name='edit')
前端模板语法
{%for user_obj in user_list%}
<a href='{% url 'edit' edit_id %}'></a>
{% endfor %}
视图函数
from django.shortcuts import reverse
def edit(request,edit_id):
	url = reverse('edit',args=(edit_id,))

有名分组反向解析

前端使用
# 前端有名分组和无名分组都可以用这种形式
{% url 'list' 10 %}
# 下面这个了解即可
{% url 'list' year=10 %}
后端使用
# 后端有名分组和无名分组都可以用这种形式
print(reverse('list',args=(10,)))
# 下面这个了解即可
print(reverse('list',kwargs={'year':10}))

总结:针对有名分组与无名分组的反向解析统一采用一种格式即可

后端
reverse('list',args=(10,))  # 这里的数字通常都是数据的主键值
前端
{% url 'list' 10 %}

反向解析的本质:就是获取到一个能够访问名字所对应的视图函数

路由分发

Django每一个app下面都可以有自己的urls.py路由层,templates文件夹,static文件夹。项目名下 urls.py(总路由)不再做路由与视图函数的匹配关系而是做路由的分发。

from django.conf.urls import include
	
# 路由分发:注意路由分发总路由千万不要$结尾
url(r'^app01/',include(app01_urls)),
url(r'^app02/',include(app02_urls))

# 在应用下新建urls.py文件,在该文件内写路由与视图函数的对应关系即可
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^index/',views.index)
]

名称空间

URL命名空间可以保证反查到唯一的URL,即使不同的app使用相同的URL名称。它还允许你在一个应用有多个实例部署的情况下反查URL。 换句话讲,因为一个应用的多个实例共享相同的命名URL,命名空间提供了一种区分这些命名URL 的方法。

url(r'^app01/',include(app01_urls,namespace='app01')),
url(r'^app02/',include(app02_urls,namespace='app02'))

app01.urls.py:
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^index/',views.index,name='index')
]
	
app02.urls.py:
from django.conf.urls import url
from app02 import views
urlpatterns = [
url(r'^index/',views.index,name='index')
]
	
app01.views.py:
reverse('app01:index')
	
app02.views.py:
reverse('app02:index')

django1.0与django2.0之间的区别:

django2.0里面的path第一个参数不支持正则,你写什么就匹配,100%精准匹配
django2.0里面的re_path对应着django1.0里面的url

虽然django2.0里面的path不支持正则表达式,但是它提供五个默认的转换器

str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int,匹配正整数,包含0。
slug,匹配字母、数字以及横杠、下划线组成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)

自定义转换器
1.正则表达式
2.类
3.注册

自定义转换器
class FourDigitYearConverter:
	regex = '[0-9]{4}'
	def to_python(self, value):
		return int(value)
	def to_url(self, value):
		return '%04d' % value  # 占四位,不够用0填满,超了则就按超了的位数来!
register_converter(FourDigitYearConverter, 'yyyy')

PS:路由匹配到的数据默认都是字符串形式

Django中的 {% url %}模板标签及使用 最近在学习django以便搞定毕业设计的事情,在学习过程中,不断出现这样的代码 <p> <a href="{% url 'learningsite:edit_entry' entry.id %}">Edit entry</a> </p> 一直没法理解 {% url %} 模板标签里的参数意义是什么,觉得不是滋味,遂baidu学习,作此记录。 {% url %} 模板标签的作用是解析视图函数 learningsite:edit_entry 对应的URL模式 阅读详情

相关推荐

路由参数基础语法以及路由URL和URI的基本概念

Route::rule('路由表达式','路由地址','请求类型','路由参数(数组)','变量规则(数组)',); GET,POST,DELETE,PUT ThinkPHP5支持的请求类型包括 ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'] 路由规则:URL访问规则(包括静态规则和动态规则),只有符合规则的路由才...

12november的博客 3342

Django深入研究(URL编写、视图探究)

Django深入研究1、编写URL、视图探究

Itsme_MrJJ的博客 1518

零基础入手Django(二):url路由配置及渲染方式

根据项目的app在templates下创建同文件,例如“hello_django”项目中有“book”和“movie”这两个app,那么就在templates文件夹下创建“book”和“movie”文件夹,用来存放各自的模板文件。当一个项目中,需要较多的视图时,urls.py中则需要配置很多的路径,如果都写在urls.py中时,不仅杂乱无章,而且不便于后期的维护管理。当我们制作了新的页面配置了新的url,并想使旧的url重定向到新的页面时,使用name和reverse可大大简化我们的步骤。

IT小叮当的博客 3006

Django框架

Django学习笔记

m0_38144883的博客 790

Django路由层

随着项目的复杂程度越来越来越大,路由肯定也是越来越多,路由文件就会增加很多的路由地址,就会导致路由文件很混乱,不好管理,也不够清晰,我们可以把总路由文件进行拆分,拆分到各个应用下面去,每一个应用都可以有自己的路由文件。在Django的MVT架构中,路由层负责处理用户的请求,然后将请求交给相应的视图函数进行处理,最后将处理结果返回给用户。在Django中,路由层的配置文件是urls.py,这个文件定义了每个URL模式(也被称为路由)以及该URL模式应该映射到哪个视图函数进行处理。

weixin_49210718的博客 750

django路由层分析

目录 路由层 路由层简介 添加网站首页 / (404)错误提示页 分组 无分组 有分组 有无分组注意事项 解析 反向解析 无分组反向解析 有分组反向解析 ...

weixin_34419326的博客 187

Django 路由层 —— 基础用法,以及底层如何实现的

它是 Python 为了解决 Web 服务器端与客户端之间的通信问题而产生的,它基于现存的 CGI 标准而设计。其定义了 Web 服务器如何与 Python 应用程序进行交互,让 Python 写的 Web 应用程序可以和 Web 服务器对接起来。WSGI(Python Web Server Gateway Interface,即Web服务器网关接口) 是 Python 定义的 Web 服服务器和 Web 应用程序或框架之间的一种简单而通用的接口。然后一直往上,返回响应报文。重定向后,访问的方法是。

2302_76314178的博客 681

Django路由层解析

路由匹配,有分组,无分组,反向解析,路由分发,虚拟环境,为静态页面,称空间

qq_38104453的博客 682

48 Django路由层

路由层(url.py)的作用 Django路由层,是所有Django所支持跳转URL的目录,它可以告诉Django在跳转URL时,要用视图层(views.py)中的哪一个方法。 路由层的配置方式 使用正则表达式(无分组以及有分组) 1、 无分组 from django.urls import path,re_path from app01 import views urlpatte...

MiamorJia的博客 184

05 django路由层

路由   顾思义,就是指路牌,请求过来根据指路牌的指示指向不同的视图函数。 路由层主要掌握:   re_path正则匹配路径:     满足条件的都走同一个视图函数,多用在请求数据,比如图书馆,那一个书架哪一本书,不可能每一本书都指定单独的url,所以统一一个视图函数,根据传参不同取到不同的书籍。 # 路由配置:路径--------->视图函数 re_pat...

weixin_30552635的博客 477

Django——路由层

反向解析就是通过一些方法得到一个结果 该结果可以直接访问对应的url触发视图函数regex='\d{2}' # 属性必须为regexreturn value # 匹配的regex是两个数字,返回的结果也必须是两个数字# 先注册转换器# 路由匹配1. urls.py中url方法第一个参数是正则2. Django默认帮你开启了第一次匹配不成功, 往匹配效验的路径末尾追加一个斜杠/, 再进行重定向重新遍历循环匹配一次配置: 默认settings.py中没有需要自己添加。

m0_71115526的博客 976

Django框架之路由层

反向解析(Reverse URL resolution)是一个在Web开发中常用的概念,特别是在使用框架如Django等时。它指的是根据URL模式(URL patterns)和视图称(view names)来动态地生成URL的过程。通俗的来说:反向解析就是通过一些方法得到一个结果, 该结果可以直接访问对应的 url 并触发视图函数django是专注于开发应用的,当一个django项目特别庞大的时候, 所有的路由与视图函数映射关系全部写在一个 urls.py 里面很明显太冗余并且不便于管理。

Xiao20000101的博客 1229

Django框架-路由层

Django框架-路由层 一、URL配置(URLconf) 1、基本格式 from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别), ] 2、参数说明 正则表达式:一个正则表达式字符串 views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串 参数:可选...

weixin_30824599的博客 254

Django学习之路由层

Django请求生命周期 - wsgi, 他就是socket服务端,用于接收用户请求并将请求进行初次封装,然后将请求交给web框架(Flask、Django) - 中间件,帮助我们对请求进行校验或在请求对象中添加其他相关数据,例如:csrf、request.session - 路由匹配 - 视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:or...

weixin_30483495的博客 158
上一篇: Django 之 ORM基本操作
下一篇: Django 之 视图层
LinWoW
博客等级 码龄8年 38粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值