首页 > 其他分享 >反向解析,有名无名分组,路由匹配

反向解析,有名无名分组,路由匹配

时间:2023-06-23 23:11:48浏览次数:46  
标签:views url 无名 分组 urls path reg 路由

django请求生命周期流程图(必会)

# 必须会画 这个图是你们后期复习django最好的一个梳理方式

路由匹配
# 路由匹配
url(r'test',views.test),
url(r'testadd',views.testadd)
"""
url方法第一个参数是正则表达式
    只要第一个参数正则表达式能够匹配到内容 那么就会立刻停止往下匹配
    直接执行对应的视图函数

你在输入url的时候会默认加斜杠
    django内部帮你做到重定向
        一次匹配不行
        url后面加斜杠再来一次
"""
# 取消自动加斜杠
APPEND_SLASH = False/True    # 默认是自动加斜杠的


urlpatterns = [
    re_path(r'^admin/', admin.site.urls),
    # 首页
    re_path(r'^$',views.home),
    # 路由匹配
    re_path(r'^test/$',views.test),
    url(r'^testadd/$',views.testadd),
    # 尾页(了解)
    re_path(r'',views.error),
]

无名分组

 

"""
分组:就是给某一段正则表达式用小括号扩起来
"""
re_path(r'^test/(\d+)',views.test)

def test(request,xx):
    print(xx)
    return HttpResponse('test')
  
# 无名分组就是将括号内正则表达式匹配到的内容当作位置参数传递给后面的视图函数

 

有名分组

 

"""
可以给正则表达式起一个别名
"""
url(r'^testadd/(?P<year>\d+)',views.testadd)

def testadd(request,year):
    print(year)
    return HttpResponse('testadd')

# 有名分组就是将括号内正则表达式匹配到的内容当作关键字参数传递给后面的视图函数

 

 

 

无名有名是否可以混合使用
"""
嘻嘻 不能混用
但是同一个分组可以使用N多次
"""

# 单个的分组可以使用多次
url(r'^index/(\d+)/(\d+)/(\d+)/',views.index),
url(r'^index/(?P<year>\d+)/(?P<age>\d+)/(?P<month>\d+)/',views.index),

 

反向解析  
# 通过一些方法得到一个结果 该结果可以直接访问对应的url触发视图函数

# 先给路由与视图函数起一个别名
    url(r'^func_kkk/',views.func,name='ooo')
# 反向解析
    # 后端反向解析
      from django.shortcuts import render,HttpResponse,redirect,reverse
      reverse('ooo')
  # 前端反向解析
      <a href="{% url 'ooo' %}">111</a>

注意:
Django 2.0版本中的路由系统已经替换成下面的写法(官方文档):

 

from django.urls import path

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path('articles/<int:year>/', views.year_archive),
    path('articles/<int:year>/<int:month>/', views.month_archive),
    path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]

 

无名有名反向解析

 

# 无名分组反向解析
    re_path(r'^index/(\d+)',views.index,name='xxx')

# 前端
    {% url 'xxx' 123 %}
# 后端
    reverse('xxx', args=(1,))

"""
这个数字写代码的时候应该放什么
    数字一般情况下放的是数据的主键值  数据的编辑和删除
    re_path(r'^edit/(\d+)',views.edit,name='xxx')
    
    def edit(request,edit_id):
        reverse('xxx',args=(edit_id,))
        
    {%for user_obj in user_queryset%}
        <a href="{% url 'xxx' user_obj.id %}">编辑</a>
    {%endfor%}
"""



# 有名分组反向解析
   re_path(r'^func/(<year>\d+)/',views.func,name='ooo')
# 前端
    <a href="{% url 'ooo' year=123 %}">111</a>  了解
    <a href="{% url 'ooo' 123 %}">222</a>              记忆

# 后端    
     # 有名分组反向解析 写法1  了解
   print(reverse('ooo',kwargs={'year':123}))
   # 简便的写法  减少你的脑容量消耗 记跟无名一样的操作即可
   print(reverse('ooo',args=(111,)))

 

路由分发
"""
django的每一个应用都可以有自己的templates文件夹 urls.py static文件夹
正是基于上述的特点 django能够非常好的做到分组开发(每个人只写自己的app)
作为组长 只需要将手下书写的app全部拷贝到一个新的django项目中 然后在配置文件里面注册所有的app再利用路由分发的特点将所有的app整合起来

当一个django项目中的url特别多的时候 总路由urls.py代码非常冗余不好维护
这个时候也可以利用路由分发来减轻总路由的压力

利用路由分发之后 总路由不再干路由与视图函数的直接对应关系
而是做一个分发处理
    识别当前url是属于哪个应用下的 直接分发给对应的应用去处理
    
"""


# 总路由
from app01 import urls as app01_urls
from app02 import urls as app02_urls
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 1.路由分发
    url(r'^app01/',include(app01_urls)),  # 只要url前缀是app01开头 全部交给app01处理
    url(r'^app02/',include(app02_urls))   # 只要url前缀是app02开头 全部交给app02处理
  
    # 2.终极写法  推荐使用
    url(r'^app01/',include('app01.urls')),
    url(r'^app02/',include('app02.urls'))
    # 注意事项:总路由里面的url千万不能加$结尾
]

# 子路由
    # app01 urls.py
  from django.conf.urls import url
  from app01 import views

  urlpatterns = [
      url(r'^reg/',views.reg)
  ]
  # app02 urls.py
  from django.conf.urls import url
  from app02 import views

  urlpatterns = [
      url(r'^reg/',views.reg)
  ]
名称空间(了解)
# 当多个应用出现了相同的别名 我们研究反向解析会不会自动识别应用前缀
"""
正常情况下的反向解析是没有办法自动识别前缀的
"""

# 名称空间
    # 总路由
    url(r'^app01/',include('app01.urls',namespace='app01')),
    url(r'^app02/',include('app02.urls',namespace='app02'))
  # 解析的时候
      # app01
      urlpatterns = [
    url(r'^reg/',views.reg,name='reg')
        ]
    # app02
    urlpatterns = [
    url(r'^reg/',views.reg,name='reg')
        ]
    
      reverse('app01:reg')
    reverse('app02:reg')
    
    {% url 'app01:reg' %}
    {% url 'app02:reg' %}
# 其实只要保证名字不冲突 就没有必要使用名称空间
"""
一般情况下 有多个app的时候我们在起别名的时候会加上app的前缀
这样的话就能够确保多个app之间名字不冲突的问题
"""
urlpatterns = [
    url(r'^reg/',views.reg,name='app01_reg')
]
urlpatterns = [
    url(r'^reg/',views.reg,name='app02_reg')
]
伪静态(了解) """
在正常开发中 我们会给每一个项目配备一个该项目独有的解释器环境
该环境内只有该项目用到的模块 用不到一概不装

linux:缺什么才装什么

虚拟环境
你每创建一个虚拟环境就类似于重新下载了一个纯净的python解释器
但是虚拟环境不要创建太多,是需要消耗硬盘空间的

扩展:
每一个项目都需要用到很多模块 并且每个模块版本可能还不一样
那我该如何安装呢? 一个个看一个个装???

开发当中我们会给每一个项目配备一个requirements.txt文件
里面书写了该项目所有的模块即版本
你只需要直接输入一条命令即可一键安装所有模块即版本
""" django版本区别
"""
1.django1.X路由层使用的是url方法
    而在django2.Xhe3.X版本中路由层使用的是path方法
    url()第一个参数支持正则
    path()第一个参数是不支持正则的 写什么就匹配什么
    
    
    如果你习惯使用path那么也给你提供了另外一个方法
        from django.urls import path, re_path
        from django.conf.urls import url
        
        re_path(r'^index/',index),
    url(r'^login/',login)
  2.X和3.X里面的re_path就等价于1.X里面的url
 
 
2.虽然path不支持正则 但是它的内部支持五种转换器
    path('index/<int:id>/',index)
    # 将第二个路由里面的内容先转成整型然后以关键字的形式传递给后面的视图函数

    def index(request,id):
    print(id,type(id))
    return HttpResponse('index')
    
  
  
  str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
    int,匹配正整数,包含0。
    slug,匹配字母、数字以及横杠、下划线组成的字符串。
    uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
    path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
    
3.除了有默认的五个转换器之外 还支持自定义转换器(了解)
    class MonthConverter:
    regex='\d{2}' # 属性名必须为regex

    def to_python(self, value):
        return int(value)

    def to_url(self, value):
        return value # 匹配的regex是两个数字,返回的结果也必须是两个数字
    
    
    from django.urls import path,register_converter
    from app01.path_converts import MonthConverter

    # 先注册转换器
    register_converter(MonthConverter,'mon')

    from app01 import views


    urlpatterns = [
    path('articles/<int:year>/<mon:month>/<slug:other>/',     views.article_detail, name='aaa'),

]


4.模型层里面1.X外键默认都是级联更新删除的
但是到了2.X和3.X中需要你自己手动配置参数
    models.ForeignKey(to='Publish')
    
    models.ForeignKey(to='Publish',on_delete=models.CASCADE...)
"""
django版本区别

 


 

 

标签:views,url,无名,分组,urls,path,reg,路由
From: https://www.cnblogs.com/shuai61457/p/17500456.html

相关文章

  • 路由过滤器GatewayFilter
    GatewayFilter:是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理: 过滤器工厂GatewayFilterFactory,Spring提供了31种不同的路由过滤器工厂。例:给所有进入userservice的请求添加一个请求头:Truth=itcastisfreakingawesome!server:port:10010spr......
  • 路由断言工厂Route Predicate Factory
    网关路由可以配置的内容包括:1、路由id:路由唯一标示2、uri:路由目的地,支持lb和http两种3、predicates:路由断言,判断请求是否符合要求,符合则转发到路由目的地4、filters:路由过滤器,处理请求或响应 在配置文件中写的断言规则只是字符串,这些字符串会被PredicateFactory读取并处理......
  • 企业级路由器架构简析
    硬件CPU多采用aarch64(就是arm64)、mips64。没见过x86,只有杂牌多使用x86.,MARVELL双核RAMDROMROMSDROM型号以类型简称,比如RG-NBR6205-E,型号就是nbr6200-e,属于一种类型 系统操作系统使用openwrt、centos定制系统,锐捷系统RGOS10.x11.x,h3c是comwarev5v7,简称CMW,com是指3com......
  • 家用路由器推荐
    硬路由性价比之王k2p硬路由低价推荐ac9硬改机newifi3(无线功能很弱)磊克腾达硬路由高价推荐非三兴内存版本k3ac68u 网件领势硬路由BIOS推荐 breed,硬路由系统推荐openwrt(原生支持、lean、潘多拉等等改版固件)、俄罗斯的pavanda(原生支持、或改版固件)、tomato、DDWRT、潘多......
  • 企业级路由器与电脑互传文件的思路和方法
      一般企业级路由器都带有强大的网络管理功能、内置强大的系统软件和应用软件,企业级路由器内部flash上有个文件系统该文件系统不对外开放,不可直接管理,只是开放了一小部分文件夹作为可以直接管理的部分,里面存放着全局配置文件、日志文件、系统镜像文件、证书、诊断文件、版权......
  • find-my-way nodejs 快速的http 路由框架
    find-my-way基于了radixtree开发的路由框架,支持路由参数,通配符,同时语言无关fastify以及restify都使用了路由框架,同时也受echo启发说明了解find-my-way的使用以及内部机制对于学习fastify是比较有用的,fastify不少有意思的插件机制都利用了find-my-way参考资料https://g......
  • 量产空中鼠标电路设计资料 原理图+PCB资料 空中鼠标硬件由两个部分组
    量产空中鼠标电路设计资料原理图+PCB资料空中鼠标硬件由两个部分组成,鼠标端(发射板)和USB端(接收板)。◆发射板主要器件是STM32、MPU6050、NR24L01。MPU6050感知人手的动作(X、Y、Z轴上的角速度值),并将测得的数据通过I2C数据接口传输给STM32。STM32内部自带12位ADC对数据做转换,并且通......
  • uni-app微信小程序路由传参数据截断问题解决
    跳转页面:因为数据接受页面是富文本编辑器接收,所以先是将数据双引号处理了。数据太多太长,跳转页面只要用encodeURIComponent()函数将其数据处理后传过去constdetails=this.oneform.text.replace(/"/g,'\'')this.$tab.navigateTo(`/pages/common/editor/editor?details=${e......
  • 微信小程序开发实现星星评分组件
    微信小程序开发实现星星评分组件问题背景小程序开发中经常会碰到需要评分的场景,比如用户满意度调查等,本文介绍微信小程序实现打星评分的一种方案。实现效果如下:截图2问题分析话不多说,直接上代码。(1)index.wxml文件代码如下:<viewclass="vertical-star-item">......
  • MySQL单表查询练习(条件_模糊_分组_聚合_排序)
    练习所用数据表•部门表CREATETABLEDEPT(DEPTNOINTPRIMARYKEY,–部门编号DNAMEVARCHAR(14),–部门名称LOCVARCHAR(13)–部门地址);INSERTINTODEPTVALUES(10,‘ACCOUNTING’,‘NEWYORK’);INSERTINTODEPTVALUES(20,‘RESEARCH’,‘DALLAS’);......