django路由配置,django路由path
姜戈的路由系统
URL (URLconf)就像Django支持的网站的目录。它的本质是URL和为URL调用的视图函数之间的映射表。
这就是你如何告诉Django为这个URL调用这个代码,为那个URL调用那个代码。
URLconf配置基本格式:fromdjango.conf.urlimporturl
urlpatterns=[
Url(正则表达式、视图、视图函数、参数、别名),
]注意:
Django版本2.0中的路由系统已替换为以下内容(官方文件):
从django.urls导入路径
urlpatterns=[
path(articles/2003/,views.special_case_2003),
path(articles/int:year /,views.year_archive),
path( articles/int:year/int:month/,views.month_archive),
path( articles/int:year/int:month/slug:slug/,views.article_detail),
]参数描述:正则表达式:正则表达式字符串视图视图函数:可调用对象,通常是视图函数或指定视图函数路径的字符串参数:可选默认参数(字典形式)要传递给视图函数的别名:可选名称参数正则表达式详细信息来自django.conf.urls导入url
从。导入视图
urlpatterns=[
url(r^articles/2003/$,观点,特别案例,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),
]注意:urlpatterns中的元素按照书写顺序从上到下逐个匹配正则表达式。一旦匹配成功,就不再继续。要从URL获取一个值,只需在它周围放一对括号(组匹配)。没有必要添加前导反斜杠,因为每个URL都有一个。比如应该是articles而不是/articles。每个正则表达式前面的“r”是可选的,但建议添加它。注意#是否要打开URL访问地址不是/的配置项,并跳转到带有/的路径?
APPEND_SLASH=truedjangosettings . py配置文件默认没有APPEND _ SLASH参数,但是Django默认此参数为APPEND_SLASH=True。它的功能是在URL的末尾自动添加“/”。
效果是:
我们定义了urls.py:
从django.conf.urls导入url
从app01导入视图
urlpatterns=[
url(r^blog/$,views.blog),
]访问http://www.example.com/blog,时,默认情况下,该URL将自动转换为http://www.example/com/blog/。
如果在settings.py中设置了APPEND_SLASH=False,当我们再次请求http://www.example.com/blog时,会提示找不到页面。
组匹配上面的例子使用简单的正则表达式组匹配(通过括号)来捕获URL中的值,并将其作为位置参数传递给视图。
在更高级的用法中,可以使用名为matching regular expression group的组来捕获URL中的值,并将其作为关键字参数传递给视图。
在Python的正则表达式中,分组命名正则表达式组的语法是(?p模式),其中name是组的名称,pattern是要匹配的模式。
以下是上面URLconf使用的命名组的重写版本:
从django.conf.urls导入url
从app01导入视图
urlpatterns=[
url(r^articles/(?p年[0-9]{4})/$ ,views.blog),
url(r^articles/(?p年[0-9]{4})/(?P month [0-9]{1,2})/$ ,views.blog1),
url(r^articles/(?p年[0-9]{4})/(?p月[0-9]{1,2})/(?P day [0-9]{1,2})/$ ,views.blog2),
]这个实现与上一个示例完全相同,只有一点小小的不同:捕获的值作为关键字参数而不是位置参数传递给视图函数。
例如,将url/articles/2017/12/作为目标相当于调用如下视图函数:
Views.blog2 (request,year= 2018 ,month= 08 ,day= 14 )视图是用命名组调用的:
快捷方式导入渲染,重定向,HttpResponse
定义博客(请求,年份):
返回HttpResponse(年:%s%(年))
def blog1(请求,年份=2018 ,月份=08 ):
返回HttpResponse(年:%s ————月:%s%(年,月))
def blog2(请求,年=2018 ,月=08 ,日=14 ):
访问/articles/2018/call bolg时返回HttpResponse(年:%s ————月:% s——3354日:%s %(年,月,日))如下:
访问/articles/2018/08时,bolg1调用如下:
访问/articles/2018/08/14时,bolg2调用如下:
在实际应用中,使用组命名匹配可以让你的URLconf更清晰,更不容易出现参数顺序错误,但也有开发者认为组命名的语法太丑太繁琐。
至于应该用哪一个,可以根据自己的喜好来决定。
URLconf匹配位置URLconf查找请求的URL,并将其视为普通的Python字符串。不包括GET和POST参数以及域名。
例如,在http://www.example.com/myapp/请求中,URLconf将查找myapp/。
在http://www.example.com/myapp/? Page=3请求中,URLconf仍然会查找myapp/。
URLconf不检查请求的方法。换句话说,所有的请求方法3354 POST、GET、HEAD等。相同URL的3354将被路由到相同的函数。
捕获的参数总是字符串。URLconf中捕获的每个参数都作为普通的Python字符串传递给视图,而不考虑正则表达式使用的匹配方法。例如,在以下URLconf行中:
url(r^articles/(?P year [0-9] {4})/$ ,views.year_archive),而传递给视图函数views.year _ archive()的year参数始终是字符串类型。
在函数中指定的默认值# urls.py
从django.conf.urls导入url
从。导入视图
urlpatterns=[
url(r^blog/$,views.page),
url(r^blog/page(?P num [0-9] )/$ ,views.page)
]
# views.py,您可以为num指定一个默认值。
定义页面(请求,编号=1 ):
Return HttpResponse(这是页面[%s] %(num))访问效果如下:
1.访问默认页码时:
2.当访问指定的页码时:
在上面的例子中,两个URL模式指向同一个视图——views . page——但是第一个模式没有从URL中捕获任何内容。
如果第一个模式匹配,page()函数将使用它的默认参数num="1 "。如果第二个模式匹配,page()将使用正则表达式捕获的num值。
包含其他urlconfs #在任何时候,您的URL模式都可以“包含”其他urlconfs模块
#本质上是将一组URL“扎根”在其他URL之下。
#例如,这是Django网站本身的URLconf的摘录。
#它包括许多其他URLconfs:
从django.conf.urls导入包括,url
urlpatterns=[
url(r^admin/,管理网站网址),
Url (r app02/,包含( app02。URL )),#可以包含其他URLconfs文件。
]
#app02中的url是像以前一样从django.conf.urls导入url编写的
从。导入视图
urlpatterns=[
url(r^home/$,views.home),
]向视图函数传递额外参数(know) URLconfs有一个钩子,可以让您将Python字典作为额外参数传递给视图函数。
django.conf.urls.url()函数可以接收可选的第三个参数,这是一个字典,表示您希望传递给view函数的附加关键字参数。
例如:
从django.conf.urls导入url
从。导入视图
urlpatterns=[
url(r^blog/(?P year [0-9]{4})/$ ,views.year_archive,{foo: bar}),
]在这个例子中,对于/blog/2005/request,Django将调用views.year _ archive (request,year= 2005 ,foo= bar )。
这种技术在联合框架中用于向视图交付元数据和选项。
命名URL和URL反向解析在使用Django项目时,一个常见的需求是获取URL的最终形式,以便嵌入到生成的内容中(URL在视图中并显示给用户等。)或用于处理服务器端导航(重定向等)。).
强烈希望这些URL不要硬编码(费力、不可伸缩且容易出错)或者设计一个与URLconf无关的特殊URL生成机制,因为这在一定程度上很容易导致URL过时。
换句话说,需要的是一个干机制。其中,它允许自动更新设计的URL,而无需遍历项目的源代码来搜索和替换过期的URL。
当获得一个URL时,首先想到的是它的视图的标识(例如名称)。找到正确URL的其他必要信息是类型(位置参数、关键字参数)和视图参数的值。
Django提供了一种方法,使URL映射成为URL设计的唯一场所。您可以填充您的URLconf,然后您可以以两种方式使用它:
根据用户/浏览器发起的URL请求,它调用正确的Django视图,并从URL中提取所需的参数值。根据Django视图的ID和要传递给它的参数值,获取与之关联的URL。第一种方式是我们在前几章已经讨论过的用法。第二种方法称为反向URL解析、反向URL匹配、反向URL查询或简单URL查找。
在需要URL的地方,Django为不同级别的URL查找提供了不同的工具:
在模板中:使用url模板标签。在Python代码中:使用django . core . URL resolvers . reverse()函数。在与处理Django模型实例相关的高级代码中:使用get_absolute_url()方法。它说了很多,但你可能不明白。(那是对公文的生硬翻译)。
简单地说,我们可以给我们的URL匹配规则命名,给URL匹配模式命名。
这样以后我们就不需要写死URL代码了,直接用名字调用当前的URL就可以了。
举个简单的例子:
Url (r home ,views.home,name= home ),# Name我的Url匹配模式home。
Url (r index/(\ d *),views.index,name= index ),# Name我的Url匹配模式索引如下:
可以在模板中这样引用:
可以在视图函数中像这样引用{% url home %}:
从django.urls反向导入
Reverse(index ,args=(2018 ,))列:下面的URL conf:from django . conf . urlimporturl
从。导入视图
urlpatterns=[
url(r^index/$,views.index,name=index ),
url(r^home/$,views.home,name=home ),
url(r^test/$,views.test),
]views.py:from django.shortcuts导入渲染,重定向,HttpResponse
从django.urls反向导入
定义索引(请求):
return render(request, index.html )
定义主页(请求):
返回render(请求, home.html )
定义测试(请求):
#通过反向跳转到名称空间的URL(主页)
返回重定向(reverse(home))home.html:声明文档类型
html lang=en
头
meta charset=UTF-8
标题标题/标题
/头
身体
这里是H1的主页/h1
A href={% url index %} 通过命名反向解析/a跳转到索引页
/body
/html index.html:声明文档类型
html lang=en
头
meta charset=UTF-8
标题标题/标题
/头
身体
H1这里是索引页/h1
/body
/htmlvisiting /home/此时得到如下结果,添加一个跳转即可成功跳转。
访问/测试/得到如下结果:会自动跳转到索引页面。
将索引路由更改为:URL (r indexabc/$ ,views.index,name= index ),并刷新主目录,如下所示:
可以发现在html文件中可以通过{% url index %}的命名方式调用,现在更改路由不会有影响,也不会造成无法访问。
再次访问测试页面,如下所示:
可以发现可以通过返回重定向(反向(索引))命名的方式跳转到views文件中,现在更改的路由会自动更改,不会导致无法访问。
在某些场景中,视图是通用的,因此URL和视图之间存在多对一的关系。在这些情况下,当查找URL时,只有视图的名称是不够的。
注意:
要完成上面示例中的URL查找,您需要使用命名URL模式。URL名称中使用的字符串可以包含您喜欢的任何字符。不限于合法的Python名称。
命名您的URL模式时,请确保使用的名称不会与应用程序中的其他名称冲突。如果您的URL模式被称为comment,并且另一个应用程序具有相同的名称,那么当您在模板中使用这个名称时,不能保证将插入哪个URL。
向URL名称添加前缀,例如应用程序的名称,将减少冲突的可能性。我们建议用myapp-comment代替comment。
名称空间模式即使不同的应用程序使用相同的URL名称,URL的名称空间模式也可以允许您唯一地反转命名的URL。
例如:
项目中的Urls.py
从django.conf.urls导入url,包括
urlpatterns=[
url(r^app01/,包含( app01.urls ,namespace=app01 ),
url(r^app02/,包含( app02.urls ,namespace=app02 ),
]app01中的] urls.py
从django.conf.urls导入url
从app01导入视图
app_name=app01
urlpatterns=[
url(r^(?P pk \d )/$ ,views.detail,name=detail )
]app02中的] urls.py
从django.conf.urls导入url
从app02导入视图
app_name=app02
urlpatterns=[
url(r^(?P pk \d )/$ ,views.detail,name=detail )
]现在,我的两个应用中的url名称是重复的。当我反转URL时,我可以通过名称空间的名称获得我的当前URL。
语法:
命名空间名称:URL名称
用于模板:
视图中的函数使用了{ % URL app 01:detail PK=12pp=99% }
V=reverse (app01: detail ,kwargs={pk: 11}),这样即使应用程序中的URL具有相同的名称,我也可以将其反转以获得正确的URL。
生活是一条无名的河,你必须或浅或深地穿过它;
生活是一杯无色的茶,无论苦还是甜,你都应该喝下去;
生活是一首无所畏惧的歌,你要唱高或低。
转载请联系作者授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。