Django--路由urls

Posted on 2019-09-22 23:44  麻世骞  阅读(143)  评论(2编辑  收藏  举报

1、什么是urls?

  就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行。

2、简单的路由配置

from django.conf.urls import url,include


from app01 import views
urlpatterns = [
    url(r'datatimes/(\d{4})/(\d{2})$', views.year_pipei),
]
  • 若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。
  • 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles
  • 每个正则表达式前面的'r' 是可选的但是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义

3、有名分组

  上面的示例使用简单的、没有命名的正则表达式组(通过圆括号)来捕获URL 中的值并以位置 参数传递给视图。在更高级的用法中,可以使用命名的正则表达式组来捕获URL 中的值并以关键字 参数传递给视图。

在Python 正则表达式中,命名正则表达式组的语法是(?P<name>pattern),其中name 是组的名称,pattern 是要匹配的模式。

下面是以上URLconf 使用命名组的重写:

from django.conf.urls import url,include


from app01 import views
urlpatterns = [
    url(r'datatimes/(?P<year>\d{4})/(?P<month>\d{2})$', views.year_pipei)
]

  这个实现与前面的示例完全相同,只有一个细微的差别:捕获的值作为关键字参数而不是位置参数传递给视图函数。例如:

  /articles/2005/03/ 请求将调用views.month_archive(request, year='2005', month='03')函数,而不是views.month_archive(request, '2005', '03')。

4、分发

  如果一个项目中有多个app,我们如何判断一个路由是执行哪个app?这样我们就用到了路由的分发,首先我们要在每个app中创建一个urls.py文件,然后在全局的urls.py中编写:

from django.conf.urls import url, include
from django.contrib import admin
from app02 import views  #如果两个app中的都有导入的views下面的会覆盖上面的


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^app01/', include('app01.urls')), #指以app01开头的路由,会分发到app01的views.py中
    url(r'^app02/', include('app02.urls')),
]

  这样我们就可以用app01开头的路由地址来执行app01中的urls.py,用app02开头的路由地址执行app02中的urls.py。

5、反向解析

   在模版login.html中有如下代码:

<form action="/index/"method="post">
        用户名<input type="text" name="user">
        密码<input type="password" name="pwd">
        <input type="submit">

  就是触发事件后,将跳转到路由为index的页面,但是如果路由index被修改后,这里就不能用了,得把这里的路由修改之后才能正常执行,很显然这样很麻烦,这时我们就需要反向解析了,

  在urls.py中给路由加上name属性:

 url(r'index', views.login, name='xxx')

  再给模板中改为如下:

<form action="{% url 'xxx' %}"method="post">
        用户名<input type="text" name="user">
        密码<input type="password" name="pwd">
        <input type="submit">

  这样不管将来路由index改为任何形式,多会被name传给模板,这就是反向解析。