Django路由URL
URL配置(URLconf)就像Django所支撑网站的目录。URL与要为该URL调用的视图函数之间的映射表。
URLconf配置
样式:
from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数, 别名) # url实例化对象 ]
详解:
- 正则表达式:通过URL请求获得url地址,匹配是否有这个目录
- views视图函数:一个可调用对象,通常为一个视图函数
- 参数:可选的要传递给视图函数的默认参数(字典形式
- 别名:一个可选的name参数
- urlpatterns: 是url实例化对象的列表
正则表达式
django 1.11版本的语法:
from django.conf.urls import url from appname import views urlpatterns = [ url(r'^login/(参数){}/$', views.login), ]
django 2.0版本的语法:
from django.urls import path,re_path from appname import views urlpatterns = [ path('^login/<参数>/$', views.login), re_path(r'^login/(参数){}/$', views.login), ]
注意
- urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
- 若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)。
- 不需要添加一个前导的反斜杠因为每个URL都有。例如,应该是articles而不是/articles。
- 每个正则表达式前面的'r' 是可选的但是建议加上。
是否开启URL访问地址后面不为/跳转至带有/的路径的配置项
APPEND_SLASH=True
Django settings.py配置文件中默认没有APPEND_SLASH这个参数,但Django默认这个参数为APPEND_SLASH=True。其作用就是自动在网址结尾加'/'。如果在settings.py中设置了 APPEND_SLASH=False,此时我们再请求 http://www.example.com/blog 时就会提示找不到页面。
分组命名匹配
即在正则表达式中使用()来达成分组命名匹配,一旦使用分组命名匹配,则会对相应的视图函数进行传参
位置传参
简单的分组命名匹配是通过"()"完成的,但是分组匹配到的只会传给对应的视图函数,在这个视图函数中,以位置参数进行传参:
# urls.py中的url的配置 from django.conf.urls import url from jingdian1956 import views urlpatterns = [ url(r'^a/([0-9]{4})/([0-9]{2})/$', views.position_args), ] # jingdian1956.views.py中的配置 from django.shortcuts import HttpResponse def position_args(request, arg1, arf2): return HttpResponse('123====%s=====%s' % (arg1, arf2))
关键字传参
Python的正则表达式中,分组命名正则表达式组的语法是"(?P
# urls.py中的url的配置 from django.conf.urls import url from jingdian1956 import views urlpatterns = [ url(r'^test/(?P<book_id>[0-9]{0,})/$', views.book), ] # jingdian1956.views.py中的配置 from django.shortcuts import HttpResponse def book(request, book_id): print(book_id) return HttpResponse(book_id)
在实际应用中,使用分组命名匹配的方式可以让你的URLconf 更加明晰且不容易产生参数顺序问题的错误,但是有些开发人员则认为分组命名组语法太丑陋、繁琐。
至于究竟应该使用哪一种,你可以根据自己的喜好来决定。
URLconf的匹配位置
URLconf在请求的URL上查找,将它当做一个普通的Python字符串。不包括GET和POST参数以及域名。
例如,http://127.0.0.1/ 请求中,URLconf将查找/。
在http://127.0.0.1/?username=@@@&password=@@@ 请求中,URLconf 仍将查找/。
URLconf 不检查请求的方法。换句话讲,所有的请求方法 —— 同一个URL的POST、GET、HEAD等等 —— 都将路由到相同的函数。
# urls.py中的url的配置 from django.conf.urls import url from jingdian1956 import views urlpatterns = [ url(r'^$', views.home), ] # jingdian1956.views.py中的配置 from django.shortcuts import HttpResponse, render def home(request): username = request.GET.get('username') or request.POST.get('username') if username: return HttpResponse(username) return render(request, '_form.html') # HTML中的form表单 <!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset="UTF-8"> <title>form</title> </head> <body> <div> <form action="" name="form" method="post"> {% csrf_token %} <div id="id1"> <input name="username" type="text" placeholder="请输入用户名"> </div> <div id="id2"> <input type="password" name="password" placeholder="请输入密码"> </div> <div id="id3"> <input type="submit" value="login"> </div> </form> </div> <div> <form action="" name="form" method="get"> {% csrf_token %} <div id="id1"> <input name="username" type="text" placeholder="请输入用户名"> </div> <div id="id2"> <input type="password" name="password" placeholder="请输入密码"> </div> <div id="id3"> <input type="submit" value="login"> </div> </form> </div> </body> </html>
捕获的参数永远都是字符串
每个在URLconf中捕获的参数都作为一个普通的Python字符串传递给视图,无论正则表达式使用的是什么匹配方式。例如,下面这行URLconf 中:
url(r'^articles/(?P
传递到视图函数views.year_archive()中的year参数永远是一个字符串类型。
视图函数中指定默认值
# urls.py中 from django.conf.urls import url from . import views urlpatterns = [ url(r'^test/$', views.page), url(r'^test/page(?P<num>[0-9]+)/$', views.page), ] # views.py中,可以为num指定默认值 def page(request, num="1"): return HttpResponse(num)
在上面的例子中,两个URL模式指向相同的view-views.page-但是第一个模式并没有从URL中捕获任何东西。
如果第一个模式匹配上了,page()函数将使用其默认参数num=“1”,如果第二个模式匹配,page()将使用正则表达式捕获到的num值。
传递额外选项来查看功能
URLconfs有一个钩子,允许您将额外的参数作为Python字典传递给视图函数。
该django.conf.urls.url()函数可以采用可选的第三个参数,该参数应该是传递给视图函数的额外关键字参数的字典
from django.conf.urls import url from . import views urlpatterns = [ url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}), ]
在这个例子中,对于请求/blog/2005/,Django将调用 。views.year_archive(request, year='2005', foo='bar')
在联合框架中使用此技术 将元数据和选项传递给视图。
处理冲突
可以使用URL模式捕获命名关键字参数,并在其额外参数字典中传递具有相同名称的参数。发生这种情况时,将使用字典中的参数而不是URL中捕获的参数。
将额外选项传递给include()
同样,您可以传递额外的选项include()。当您传递额外的选项时include(),包含的URLconf中的每一行都将传递额外的选项。
例如,这两个URLconf集在功能上是相同的:
设置一个:
# main.py from django.conf.urls import include, url urlpatterns = [ url(r'^blog/', include('inner'), {'blogid': 3}), ] # inner.py from django.conf.urls import url from mysite import views urlpatterns = [ url(r'^archive/$', views.archive), url(r'^about/$', views.about), ]
设置二
# main.py from django.conf.urls import include, url from mysite import views urlpatterns = [ url(r'^blog/', include('inner')), ] # inner.py from django.conf.urls import url urlpatterns = [ url(r'^archive/$', views.archive, {'blogid': 3}), url(r'^about/$', views.about, {'blogid': 3}), ]
请注意,无论行的视图是否实际接受这些选项为有效,额外选项将始终传递到包含的URLconf中的每一行。因此,只有在您确定所包含的URLconf中的每个视图都接受您传递的额外选项时,此技术才有用。
路由分发
可用于从重复使用单个模式前缀的URLconf中删除冗余。便于管理和维护
include其他的URLconfs
在任何时候,您urlpatterns都可以“include”其他URLconf模块。这基本上是“root”一组URL低于其他URL。
# 项目下的urls.py中的配置 from django.conf.urls import url, include from jingdian1956 import urls urlpatterns = [ url(r'^sss/', include(urls)), ] # jingdian1956下的urls的配置 from django.conf.urls import url, include from . import views urlpatterns = [ url(r'^$', views.second), url(r'^11/$', views.secondOne), url(r'^22/$', views.secondTwo), ] # jingdian1956下的views的配置 from django.shortcuts import HttpResponse def second(request): return HttpResponse('second_menu') def secondOne(request): return HttpResponse('second_one_menu') def secondTwo(request): return HttpResponse('second_two_menu')
请注意,此示例中的正则表达式没有$ (字符串结尾匹配字符),但包含尾部斜杠。每当Django遇到include()(django.conf.urls.include())时,它都会删除与该点匹配的URL的任何部分,并将剩余的字符串发送到包含的URLconf以进行进一步处理。
URL的反向解析
是一个DRY机制。除了其它有点,它还允许设计的URL可以自动更新而不用遍历项目的源代码来搜索并替换过期的URL。
获取一个URL最开始想到的信息是处理它视图的标识(例如名字),查找正确的URL的其它必要的信息有视图参数的类型(位置参数、关键字参数)和值。
Django提供了一个解决方案,使URL映射器成为URL设计的唯一存储库。您使用URLconf提供它,然后它可以在两个方向上使用:
- 从用户/浏览器请求的URL开始,它调用正确的Django视图,提供它可能需要的任何参数以及从URL中提取的值。
- 从标识相应的Django视图以及将传递给它的参数值开始,获取关联的URL。
第一个是我们在前面几节中讨论过的用法。第二个是所谓的URL反向解析,反向URL匹配,反向URL查找或简单的URL反转。
Django提供了用于执行URL反转的工具,这些工具匹配需要URL的不同层:
- 在模板中:使用url模板标记。
- 在Python代码中:使用该reverse()函数。
- 在与处理Django模型实例的URL相关的更高级代码中:该get_absolute_url()方法。
# urls.py中的配置 from django.conf.urls import url from fuck import views urlpatterns = [ url(r'^s/([0-9]{4})/$', views.fuck_, name='wtf'), ] # views.py中的配置
URL的命名空间
作者: 咕咚!
出处: https://www.cnblogs.com/linga/
关于作者:专注虚拟化,运维开发,RPA,Rust,Go,Python!
本文版权归作者和博客园共有,禁止*.csdn.net转载,禁止以盈利为目的的转载,转载文章,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(oldsixa@163.com)咨询.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)