zoukankan      html  css  js  c++  java
  • Django框架之路由

    1,路由系统就是url系统,整个url系统就是请求进入Django项目的入口,每一个请求的种类由url分析完毕并再去返回相应的响应,它的本质是url与要为该url调用的视图函数之间的映射关系表(当项目特别庞大,请求特别多,的时候需要按照功能的不同编写路由系统)

    浏览器请求的8中方式

    http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']

    URLconf的基本格式

    from Django.conf.urls import url
    urlpatterns = [
      url(正则表达式,view视图,参数,别名),
    ]

    参数说明:

      1>正则表达式:一个正则表达式字符串

      2>views视图:一个可调用的对象,通常为一个视图函数

      3>参数:可选的要传递给视图函数的默认参数(字典形式)

      4>别名:一个可选的name参数

    在Django2.0版本的路由系统是下面的写法

    from django.urls import path, re_path
    urlpatterns = [
         path(正则表达式, view视图,参数, 别名) 
    或者 re_path(正则表达式, view视图,参数,别名) ]

     2,正则表达式的详解

    在之前获取用户要删除或者编辑的对象,往往通过在html文件里?id={{ 变量.id }}来获取要删除的对象,下面我们介绍一种不用在html文件里写,在正则表达式匹配就可以实现

     注意事项:1>要把html文件中的?id={{ foo.id }}删除掉

          2>在view函数里要增加一个参数接收分组来的参数,也是要删除的id值

    2.1>配置url的基本(分组了,但是没有命名)

    from django.conf.urls import url
    from . import views
    
    urlpatterns = [
         url(r'time/2018/$', views.now_time),
         url(r'time/([0-9]{4})/$', views.year_time),
         url(r'time/([0-9]{4})/(0-9){2}/$', views.moth_time),  
         url(r'time/([0-9]{4})/([0-9](2)/([0-9]{2})/$', views.day_time)
    
    ] 

    此时分组后得到的参数做为位置参数传递给视图函数

    配置url的注意事项

    1>urlpatterns中的元素按照书写的顺序从上往下逐一匹配正则表达式,一旦匹配成功不再继继续

    2>若要从url中捕获一个值,只需要在它周围放一对圆括号(分组匹配)

    3>不需要添加一个前导的反斜杠,因为每个url都有.这是因为在Django  settings.py文件中默认APPEND_SLASH=True,这个参数的作用就是自动在网址结尾加反斜杠("/")

    # 是否开启url访问地址后边不加反斜杠(/),跳转的时候自动带有/配置项
    APPEND_SLASH = True

    如果在settings中设置了APPEND_SLASH = False,此时就不会帮我们自动的补那个路径了,这时输入路径的时候,在最后就必须加上那个反斜杠(/)

    3,分组命名匹配

    在简单使用正则表达式匹配(括号括起来)来捕获url中 的值并以位置参数形式传递给视图,在更高级的用法中,可以使用分组命名匹配的正则表达式组来捕获url中 的值,并以关键字参数形式传递给视图

    语法:(?P(这个p一定要大写)<name>pattern),其中name是组的名称,pattern是要匹配的模式

    from django.conf.urls import url
    from . import views
    urlpatterna = [
        url(r'time/$', views.now_time),
        url(r'time/(?P<year>[0-9]{4})/$', views.year_time),
        url(r'time/(?P<year>[0-9]{4}/(?P<month>[0-9]{2}/$'), views.month_time),
        url(r'time/(?P<year>[0-9]{4}/(?P<month>[0-9]{2}/(?P<day>[0-9]){2})/$', views.day_time),
    ]

    此时分组以后的参数,将会议关键字参数的形式传递给视图函数

    此时视图函数里边就要这样写了

    def month_time(request, year=2018 month=10)
        pass
    # 在这里给year指定一个默认值参数,给month指定一个默认值参数

    ###正则匹配捕获到的参数永远是一个字符串,传递给视图函数###

    4,视图函数指定默认值

    from django.conf.urls import url
    from . import views
    urlpatterns = [
          url(r'^time/(?P<year>[0-9]{4}/(?P<month>[0-9]{2})/(?P<day>[0-9]){2})/$', views.day_time)
    
    ]

    视图函数:

    def day_time(request, year="2018", month="10",day="10")
    
        pass

     include分发路由看下图:↓

    5,传递额外的参数给视图函数

    URLconfs具有一个钩子,传递一个python字典作为额外的参数传递给视图函数,django.conf.urls,url可接受一个可选的第三个参数,它是一个字典,表示给视图函数的额外的关键字参数

    from django.conf.urls import url
    from . import views
    urlpatterns = [
        url(r'^blog/(?P<year>[0-9]{4})/$', views.year_time, {"foo":"bar"}),
    ]

    当我们在浏览器发送请求的时候(/blog/2007/),Django会将调用views.year_time(request,year="2007",foo= "bar"),当传递额外参数的字典中的参数和url捕捉到的值的命名关键字参数同名时,函数调用时将使用的是字典中的参数,而不是url中的捕获的参数.看下图↓

    6,命名URL和URL的反响解析

    6.1>URL命名:给正则URL匹配起一个名字,一个URL匹配模式起一个名字,这样url代码就不用写死了,可以随意的去修改,不论修改成什么,我们都重命名一个名字,我们调用视图的函数都调用这个 新名字,提高了url的灵活性.

    比如:

    url(r'^xuexue/$', views.miss, name=miss)  # 给url(不论是什么)都起名为miss,所以在调用视图函数的时候要命名成miss的函数

    在模板语言里边的用法:看下图↓

    {% url "miss" %}  # url路径,miss用字符串表示

    在以后的项目发展中,有可能url和视图函数存在多对一的关系,即一个视图函数被多个url调用(好比press_list),这时有了重新命名还不够,每次反向解析的时候有视图名还不够,如果视图url中的视图函数多次一样,反向解析的最后一次就会把之前的命名覆盖掉,因此还要加上命名空间

    反向解析是在跳转页面,和路径相关,解析到url再去匹配,匹配成功执行相应的视图函数看下图↓

    7,命名空间模式

    是避免当好多APP重命名一样的名字的时候,url反转,最后一次重命名会覆盖前几次的命名

    因此需要命名空间给命名去分类,避免重复

    语法:

    from django.conf.urls import url, include
    from django.contrib import admin
    from app04 import views
    urlpatterns = [
        url(r'^blog/(?P<year>[0-9]{4})/$', views.year_time, {"year": "2018"}),  # 作者列表
        url(r'^XueXue/$', views.miss, name="miss"),
        url(r'^time/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_time, name="month_time")
    ]

    模板中使用

    {% url "app04:moth_time" year=2018 month=10 %}

    view视图中使用

    v = reverse("app04:month_time", kwargs={"year":2018,"month":10})

    这样反转就正确了

  • 相关阅读:
    数据结构 【实验 串的基本操作】
    Ioc容器依赖注入-Spring 源码系列(2)
    定时任务管理中心(dubbo+spring)-我们到底能走多远系列47
    jvm内存增长问题排查简例
    Ioc容器beanDefinition-Spring 源码系列(1)
    SPI机制
    java工厂-积木系列
    java单例-积木系列
    利用spring AOP 和注解实现方法中查cache-我们到底能走多远系列(46)
    java 静态代理-积木系列
  • 原文地址:https://www.cnblogs.com/ljc-0923/p/9806198.html
Copyright © 2011-2022 走看看