一、URL路由的简单配置

1、URL路由基础:​

  URL是Web服务的入口,用户通过浏览器发送过来的如何请求,都是发送到一个知道的URL地址,然后被响应。
​  URL路由在Django项目中的体现就是urls.py文件,这个文件可以是多个的,但绝对不会再同一目录下.实际上Django提倡项目有个根urls.py,各个app下分别有自己的一个urls.py,既集中又分开,是一种解耦的模式。

  在django项目中编写路由就是向外暴露我们接收哪些URL的请求,除此之外任何的URL都不会被处理,URL路由就是web服务对外暴露的API

2、路由简单配置:

urlpatterns = [
    #url(正则表达式,视图函数,参数,别名)
    url(r'^index/$', index,name='index'),
]

注意:

  • 若要从URL中捕获一个值,只需要在它周围放置一对圆括号。
  • 不需要添加前导的反斜杠,因为每个URL都有。 例如,应该是^articles而不是^/articles
  • 每个正则表达式前面的'r'是可选的但是建议加上。它告诉Python这个字符串是“原始的” —— 字符串中任何字符都不应该转义。
  • urlpatterns列表中的元素按照书写顺序从上往下逐行匹配正则表达式,一旦匹配成功则不再继续

开启URL访问地址后面不为“/”跳转至带有“/”路径的配置项:

APPEND_SLASH=True
Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True。 其作用就是自动在网址结尾加'/'

二、有名分组和无名分组

1、无名分组

  按位置传参

  分组后,将分好组的数据当做位置传参到视图函数,所以视图函数需要定义形参

  示例: 

url:(r'^articles/([0-9]{4})/([0-9]{2})/$', views.article_detail)

  视图函数

def article_detail(request,*args)

2、有名分组

有名分组的语法是: (?P<name>pattren)  ,其中name是组的名字,pattren

  按关键字传参

  分组后,会把分组出来的数据当做关键字参数传到视图函数,所以视图函数需要定义形参,形参名字和分组的名字相对应,与顺序无关

  示例:

url:(r'^articles/(?P<year>[0-9]{4})/(?P<mouth>[0-9]{2})/$', views.article_detail),

  函数视图

def article_detail(request,mouth,year)

注:有名分组和无名分组最好不要混用!

三、反向解析

在使用Django 项目时,一个常见的需求是获得URL 的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。人们强烈希望不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL。

在需要URL的地方,对于不同层级,Django提供不同的工具用于URL反查:

  1. 在模板语言中:使用URL模板标签
  2. 在Python代码中:使用reverse() 函数
  3. 在更高层的处理Django模型实例相关的代码中:使用get_absolute_url()方法

案例:urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.test,name='year_month'),
]

HTML中:

<a href="{% url 'year_month' 1001 12 %}">点击下载2333</a>

在视图函数中:

from django.shortcuts import HttpResponse,reverse

def test(request,year ,month):
    print(year,month)
    url = reverse('year_month',args=(1000,20,))
    print(url)
    return HttpResponse('2018-12')

总结:

1.在html中使用{% url '别名' 参数 参数 %}  参数之间用空格分隔
2.在视图函数中:
    2.1 url=reverse('year_month')
    2.2 url=reverse('year_month',args=(1000,20))

四、名称空间

​ 命名空间(英语:Namespace)是表示标识符的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。

由于name没有作用域,Django在反解URL时,会在项目全局搜索,当查找到第一个name指定URL时,立即返回。所以当两个不同app下的URL的name重复时,会产生冲突。

为了解决这一问题,有两种解决方法:

#方法一,在分发路由时,分配名称空间
url(r'^app01/', include('app01.urls',spacename='app01')),
#使用
app01:路由别名

    
#方法二,在设置路由别名时,加上前缀,不要重复
url(r'^delauthor/(\d+)(.html)$',delauthor,name='app01_delauthor')
url(r'^delauthor/(\d+)(.html)$',delauthor,name='app02_delauthor')

 

posted on 2018-11-07 20:05  期艾  阅读(95)  评论(0编辑  收藏  举报