Django-URL

Django的路由U
  • 路由的简介
    • 浏览者通过在浏览器的地址栏中将要访问的网站地址(URL格式),当Django网站所在服务器接到请求后,用户发起的请求具体由Django的views视图文件的哪一个函数进行处理请求,是根据路由系统配置的,也就是说由urls.py文件中的关键字匹配规则指定的。也就是说Django的路由系统主要是一个"路标"的作用你想往哪走,只要有路,那么你就往哪走
  • 配置路由
    • 配置setting文件
      • ROOT_URLCONF = 'book_project.urls'    在setting文件中添加
        • 意思代表项目的路由文件在项目目录下book_project目录下的urls.py中
    • 配置项目url文件
        • 备注:
          • url对象()里面的参数:第一个为匹配url的规则,第二个是匹配成功执行的函数或方法
          • 只要url中有admin/关键字,那么所有请求都交给/data/virtual/py_django/lib/python3.5/site-packages/django/contrib/admin/site.py 文件中的urls进行处理
          • Django进行import的时候默认有两种方式,首先会在项目的根目录下进行寻找,如果根目录下没有找到对应的文件,会去虚拟环境的目录下/lib/python3.5/site-packages/里面进行寻找
url对象的结构
  • urlpatterns变量
    • 记录了所有的url对象,保存了项目的所有路由,相当于一个路由表的功能,在url的文件中写法固定,记住就好;
  • url配置的基本的语法  
    • url的导入
      • 应用场景
        • 在根url中设置比较模糊的匹配规则,将具体的判断交给应用中的url文件进行进一步匹配,一般会将首页的匹配规则等用根url来配置
        • 在应用的设置精确匹配的集合,根据请求url的路径,交给对应的view函数进行处理;
      • 导入url,include函数
        • from django.conf.urls import include, url
      • 导入传递模块和view函数
        • 在根url中导入传递模块
          • 示例:from django.contrib import admin
        • 在应用目录下的url模块中导入view函数
          • from .views import *
            • 注意:在django中只能使用绝对路径的方式来导入模块,所以当在应用url中导入view函数的时候可以使用from  .views import * 的形式对函数进行导入(在from  import语法中  . 代表当前目录  ..代表上层目录   也可以写全,这只是省略的写法)
      • url配置导入的两种语法结构
        • 第一种语法结构(一般应用在根url文件中)
          • 格式:url(正则,include(应用名.urls))
            • 对请求url进行正则匹配,如果符合规则则执行include函数中的第一个参数定义的函数或方法
            • 如果导入的是一个文件,需要在include的内容两侧加上单引号
            • 如果导入的是一个函数或者方法,则不需要在include的内容外侧加上单引号
            • 这个地方的正则一般使用r '^....', 一般不写$,一般不会对完整的url做匹配,详细的匹配会交给应用的url来进行匹配
            • 这种语法一般用于Django项目的根urls.py文件中
          • 示例:
            • 在根目录的url文件中设置
        • 第二种语法结构(一般应用在应用目录下的url文件中
          • 格式:
            • url(正则,视图函数名称)
              • 这个地方是真正定义请求地址和views文件函数的对应关系,此处用到的是精确匹配,正则格式必须是r'^...$'(定义开头和结尾)
              • 视图函数名称不需要加引号,直接写就可以了
          • 示例:
url分组与参数传递
  • url的分组方式
    • 第一种(普通分组)
      • 应用场景
        • 当需要获取url中匹配出来的部分内容,且按顺序取出其中的内容,这时候应用该种分组方式
      • 语法:
        • url(r'^renwu(\d+)', renwu)
          • (\d+)的匹配结果就会传递给renwu函数,被renwu函数的第二个形参接收
    • 第二种(关键字分组)
      • 应用场景
        • 当需要获取url中匹配出来的部分内容,想要根据分组名称获取内容的时候,这时候就应用该种分组方式
      • 语法:
        • url(r'^(?P<value1>\d+)/$', renwu)
          • \d+匹配的内容,将通过命名参数的形式传递给view的renwu函数,在函数中可以不按照顺序接收,只需要通过分组名来接收即可;
    • 注意:两种分组方式在一个匹配规则中只能用一种,不能混用
  • url的参数传递
    • 位置参数传递
      • 用法:
        • 当使用上方第一种分组方法的时候,可以按照分组的顺去将参数传递给view方法,view方法可以从第二个形参开始接收url对象传递过来的参数
    • 关键字参数
      • 用法:
        • 当使用上方第二种分组方法的时候,可以按照分组的名称通过命名参数的形式传递给view方法,view方法可以通过形参与关键字分组名对应来接收对应分组的参数;
在url函数中使用匹配时候需要注意点
  • 在匹配的时候尽量使用r' 匹配规则 '  来进行匹配,将字符串中的\进行转义
    • 注意:   r '  ' 只能配合单引号进行使用
  • url获取的url是不包括域名 端口和 参数的
  • 在匹配规则中的,尽量把匹配规则的开头和结尾协成这种形式:r'^index/$'
    • 一般浏览器会在url结尾加上一个/      
    • url对象会默认将url地址的第一个/去掉,所有如果我们自己也在前边加上一个/,匹配规则会是匹配以//开始的路径
url的反向解析
  • 什么是反向解析
    • 随着我们项目的功能的越来越多,这个时候可能发现之前配置的正则表达式在有些情况下可能不够准确,于是就要修改原来的正则表达式规则。但是正则表达式一旦修改了,之前所有对应的模板中的请求(比如a标签中的地址)和请求处理函数(重定向)都要修改,这可是一件麻烦的事情,甚至可能出现意外的问题,那么解决这个问题的办法就是反向解析
  • 使用反向解析的优点
    • 可以减少因为需要在模板中和函数中修改请求url而产生错误的可能
    • 可以根据正则的表达式动态生成url地址,减轻后期的维护成本
  • 反向解析使用的场景
    • 反向解析应用在两个地方:模板中的超链接,视图中的重定向
  • 反向解析的使用方法
    • 为url定义name属性,当url请求是其属性时会自动生成符合匹配的url地址
      • 定义根url属性:在根url的include的时候定义include的namespace属性
        • 格式:url(r'^',include('book_app.urls',namespace= 'namespace_value'))
      • 定义应用目录下url属性:给url一个name属性
        • 格式: url(r'^book_change/$', book,name='name_value')
      • 作用:
        • 这样设置后,当请求url是带有和namespace和name的value值相等属性的时候,便可以根据正则匹配动态生成刚好符合匹配规则的url
    • 在模板中使用url标签
      • 格式:{\%url 'namespace_value : name_value '\%}
        • 生成的url前半部分会符合带有namespace属性的url对象中的匹配规则
        • 生成的url后半部分会符合带有name属性的url对象中的匹配规则
    • 在视图中使用reverse函数
      • 格式:redirect(reverse('namespace_value:name_value'))
        • 需要先导入reverse函数 :from django.core.urlresolvers import reverse
        • 生成的url前半部分会符合带有namespace属性的url对象中的匹配规则
        • 生成的url后半部分会符合带有name属性的url对象中的匹配规则
  • 反向解析实践
      • 可以看到由反向解析实现了{\%url 'booktest:book '\%} 标签的动态生成,生成刚好可以匹配url匹配规则的rul然后拼接成/book_change/
  • 反向解析的传参
    • 使用场景
      • 当url的匹配规则中存在分组且其中存在转移字符的时候(例如\d+)的时候,这时候动态url将不能自动生成,要解决这种情况就需要向url中传递参数,将参数填在分组中,生成符合规则的url ,一般只会在应用下面的url中使用
    • 传参格式
      • url文件中的匹配格式
      • 传递位置参数
        • 在url文件中的url对象
          • url(r'^....(\d+).....(\d+)/$', view函数 ,name='name_value')
        • 在模板中传参格式:
          • {\%url ' namespace_value : name_value ' 参数1 参数2\%}
        • 在视图中传参格式:  
          • redirect(reverse(' namespace_value : name_value  ', args=(参数1,参数2)))f
            • 需要先导入reverse函数 :from django.core.urlresolvers import reverse
      • 传递关键字参数
        • 在url文件中的url对象
          • url(r'^....(?P<组名1>\d+)_(?P<组名2>\d+....)/$', view函数,name='name_value')
        • 在模板中传参格式
          • {\%url 'namespace_value : name_value ' 组名1=参数1 组名2=参数2 \%}
        • 在视图中传参格式:  
          • redirect(reverse('namespace_value : name_value ' , kwargs=( '组名1' : 参数1 , '组名2' : 参数2)))
            • 需要先导入reverse函数 :from django.core.urlresolvers import reverse

刘小恺(Kyle) wechat
如有疑问可联系博主