django路由配置,django路由path

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: