Django入门(四)

1、URL路由的简单配置

一、URL路由基础:​

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

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

二、路由简单配置:

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

注意:正则表达式

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

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

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

2、有名分组和无名分组

一、无名分组

  按位置传参浏览器

  分组后,将分好组的数据当作位置传参到视图函数,因此视图函数须要定义形参服务器

  示例: app

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

  视图函数函数

def article_detail(request,*args)

二、有名分组

有名分组的语法是: (?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)

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

3、反向解析

在使用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))

4、名称空间

​ 命名空间(英语: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')
相关文章
相关标签/搜索