zoukankan      html  css  js  c++  java
  • 2 路由层

    一、Django 路由的作用与参数

      1 路由的作用:

      本质上是 URL 与 URL 调用的视图函数之间的一种映射关系。

      2 路由的参数---无名分组:

    格式:url(r'pattern',view,kwargs=None,Name=None)
    实际上是将各个参数传了进去,调用了 url() 这个函数。

    各个参数的作用:

    (1)r:原生字符串,说明后面的符号都有其意义。

    (2)pattern:正则表达式。若正则表达式中分了多个组,则应该在对应的视图函数中传入对应的参数个数,在 models 层的函数中接收时可用 *args 接收。

    (3)view:视图函数

    (4)kwargs:None

    (5)Name:给视图函数起的别名

      pattern 正则表达式的应用:将 url 中的特定部分取出,再加上 .html 可以伪装成静态网页,提高 SEO 权限。

      视图函数中:url(r'pattern.html',view)

      模板层中:{{ sth }}.html

      3 路由关系的特性

      从上往下匹配,一旦匹配成功,就不会继续往下匹配了。  

    url(r'^$',views.index) 表示根路径,可以放在所有路径之后,防止出现 404 页面

      4 路由关系---有名分组

    格式:url(r'index/(?P<name>pattern)',views.index)
    用括号隔开,命名指的是给对应的pattern命名。
    可以命名多个,则在对应的视图函数中就可以不用按照位置来接收参数了,参数可设置 default 值;可以用 **kwargs 来接收参数。

      5 有名分组和无名分组的注意点

    无论是有名分组还是无名分组,捕获的参数类型军事 str 类型。
    接收参数时,同时使用 *args 和 **kwargs ,接收时 args 参数会丢失。

      6 路由分发

    1.0+ 版本
    第一种方式:
    1️⃣ from django.conf.urls import include 2️⃣ url(r'pattern',include(‘app.urls’)) 3️⃣ 在对应的 app 中创建 urls.py 文件,建议不用更改名字 4️⃣ 在 urls.py 文件中写对应的 pattern 以及视图函数的对应关系,注意 urlpatterns 名字不能更改 5️⃣ 可重复上述步骤,分发多个路由 第二种方式: 只需在第一种方式的基础上稍加修改即可: from app01 import urls 3️⃣ url(r'pattern',include(urls)) 这种方式在路由分发多个的时候,会造成混乱,建议不使用
    2.0+ 版本
    1️⃣ from django.urls import re_path,path,include
    2️⃣ 兼容1.0+ 版本 
    2.0+ 和 1.0+ 的区别
    1️⃣ 2.0+ 版本的 re_path 就是 1.0+ 版本的 url
    2️⃣ 2.0+ 版本多了一个 path,但是不支持pattern
    3️⃣ path('index/<int:year>',views.index)
    多了一些转换器参数:
    str:匹配除了(/)之外的任意非空字符
    int:匹配正整数,包含(0)
    slug:匹配字母、数字、下划线组成的字符串
    uuid:格式化的 uuid
    path:任意非空字符串,包含了路径分隔符(/),字符串在 ?之前也是可以的
     1 from django.urls import path,register_converter
     2 
     3 class Test():
     4     regex = 'pattern'  # pattern 的规则可以自己更改
     5 
     6     def to_python(self,value):  # 给视图函数使用,参数 value=<int:year>
     7         code...    # 可以对 value 进行一系列的处理
     8         return int(value)
     9 
    10     def to_url(self,value):   # 反向解析时使用
    11         return '%04d'%value
    12 
    13 
    14 register_converter(Test,'rename')  # 注册一个名字
    15 在路由中的使用:
    16 path('index/<rename:year>',views.index)
    自定义转换器

    二、反向解析和名称空间

    1 反向解析

    视图函数中
    1️⃣ 路由中开一个访问路径,url(r'test/',views.test),
    2️⃣ 给另一个路由命名,url(r'index/',views.index,name='othername'),
    3️⃣ 在 views.py 文件中导入三件套,from django.shorcuts import render,HttpResponse,redirect
    4️⃣ 对应到相应的视图函数中(test),设置 url=reverse('othername'),这样在访问 test 页面时,就可以跳转到 index 页面了。
    html 页面中的设置
    {% url 'othername' %}

    2 反向解析带参数时

    无名分组
    1️⃣ 视图函数
    url=reverse('othername',args=(参数1,参数2))
    2️⃣ html 页面
    {% url 'othername' 参数1 参数2 %}
    
    有名分组
    1️⃣ 视图函数
    url=reverse('othername',kwargs={key1:value1,key2:value2})
    2️⃣ html页面
    {% url 'othername' key1=value1 key2=value2 %}
    
    无名分组的写法同样适用于有名分组的写法

    3 反向解析的作用

    在修改路由中 url 的时候,其它的地方不需要改动。

    4 名称空间

    1️⃣ 路由分发时设置一个 名称空间
    url(r'pattern',include('app01.urls',namespace='app01')),
        urlpaterns=[
             url(r'pattern',views.test,name='rename')       
        ]
    
    url(r'pattern',include('app02.urls',namespace='app02')),
        urlpaterns=[
             url(r'pattern',views.test,name='rename')       
        ]
    
    2️⃣ 在视图函数中的使用
    url=reverse('app:rename')
    
    3️⃣ 在模板中使用
    {% url 'app:rename' %}
    
    4️⃣ 建议在路由分发时命名不能重名,可使用 app_rename 下划线方式命名。
  • 相关阅读:
    Python进阶03 模块
    Python进阶02 文本文件的输入输出
    Python进阶01 词典
    Python基础10 反过头来看看
    Python基础09 面向对象的进一步拓展
    Python基础08 面向对象的基本概念
    Python基础07 函数
    Vuex源码分析(转)
    Vue2.x双向数据绑定
    Angular2的双向数据绑定
  • 原文地址:https://www.cnblogs.com/Smart1san/p/9628072.html
Copyright © 2011-2022 走看看