• Day 57 django 路由系统 反向解析


    Day 57 django 路由系统

    1、django 请求生命周期流程图

    在这里插入图片描述

    学习思路

    1. 路由层
    2. 视图层
    3. 模板层
    4. 模型层
    5. django插件
    6. django中间件

    2、路由匹配

    2.1、path转换器

    path(‘网址后缀’,函数名)
    一旦网址后缀匹配上了就会自动执行后面得函数
    并结束整路由得匹配

    路由结尾的斜杠
    默认情况下不写斜杠 django会左二次处理
    第一次匹配不上 会让浏览器加上浏览器斜杠再次请求

    django配置文件中 可以指定是否自动添加斜杠

    APPEND_SLASH = False
    
    • 1

    path转换器
    当网址后缀不固定的时候 可以使用转换器来匹配

    'int':Intconverter(), 匹配 整型  (常用)
    'path':PathConverter(), 匹配 所有字符
    'slug':SlugConverter(), 英文字符中的斜杠 下划线 或数字
    'str':StringConverter(), 匹配字符串  (常用)
    'uuid':UUIDConverter(), 匹配 满足uuid形式字符串   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    转换器匹配到的内容会当作视图函数的关键字 参数传入
    path('func///', views.func)
    
    转换器有几个叫什么名字 那么视图函数的形参必须对应
    def func(request,year,info):
        pass
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.2、re_path正则匹配

    re_path(正则表达式,函数名)
    一旦网址后缀的正则能够匹配到内容 就会自动执行后面的函数
    并结束整个路由的匹配

    当网址后缀不固定的时候 可以使用转换器来匹配
    re_path('^test/$',views.test)
    
    • 1
    • 2

    正则匹配之无名分组
    正则表达式匹配到的内容会当作视图函数的位置参数传递给视图函数

    re_path('^test/(\d+)/',views.test)
    
    • 1

    正则匹配之有名分组
    正则表达式匹配到的内容会当作视图函数的关键字参数 传递给视图函数

    re_path('^test/(?P\d+)/(?P.*?)/',views.test)
    
    • 1

    2.3、django版本区别

    在django1 中只支持正则匹配 并且方法是 url()

    django2,3,4中 path()re_path()等价于url()
    
    • 1

    3、反向解析

    页面上提前写死了很多路由 一旦路由发送变化会导致所有页面相关链接失效
    为了防止出现问题 我们需要使用反向解析

    反向解析:返回一个结果 该结果可以访问到对应的路由

    1. 路由对应关系起别名

      path('register/',views.reg,name='reg_view')
      
      • 1
    2. 使用反向解析

      1. html页面

        {% url 'reg_view' %}
        
        • 1
      2. 后端

        from django.shortcuts import reverse
        reverse('reg_view')
        
        • 1
        • 2

    **反向解析的操作三个方法都一样 path() re_path() url() **

    3.1、无名反向解析

    path('reg/',views.reg,name = 'reg_view')
    
    • 1

    当路由中有不确定的匹配因素 反向解析的时候需要人为给出一个具体的值

    #后端
    reverse('reg_view',args=('jason',))
    #html
    {% url 'reg_view' 'user' %}
    
    • 1
    • 2
    • 3
    • 4
    • 反向解析的操作 三个方法都一样path() re_path() ur;

    4、路由分发

    **django中应用 都可以由自己独立的 urls.py文件 templates文件夹 static文件夹 **
    能够让基于django开发的多个应用完全独立 便于小组开发

    总路由

    path('app01/',include('app01.urls')),
    path('app02/',include('app02.urls')),
    
    • 1
    • 2

    子路由

    path('after/',views.after) #app01  
    path('after/',views.after) #app02
    
    • 1
    • 2

    当项目特别大 应用特别多的时候 可以使用路由分发

    4.1、名称空间

    在路由分发场景下 多个应用在涉及到反向解析别名冲突的时候无法正常解析

    解决方式一:

    名称空间:
    nanmespace

    path('app01/',include(('app01.urls','app01'),namespace='app01'))
    path('app01/',include(('app01.urls','app02'),namespace='app02'))
    
    • 1
    • 2

    结局方式二:
    起别名时 让别名不冲突 例如 加上应用前缀

    作业

    APP01\views.py

    def user_info(request):
        user_list=models.User_info.objects.filter()
        return render(request,'user_info.html',{'user_list':user_list})
    
    def user_create(request):
        if request.method=='POST':
            username=request.POST.get('name')
            password=request.POST.get('pwd')
            models.User_info.objects.create(name=username,pwd=password)
            return redirect(reverse('info_add'))
        return render(request,'user_create.html')
    
    def user_update(request,id):
        if request.method=='GET':
            user_obj=models.User_info.objects.filter(id=id).first()
            return render(request,'user_update.html',{'user_obj':user_obj})
        elif request.method=='POST':
            name=request.POST.get('name')
            pwd=request.POST.get('pwd')
            models.User_info.objects.filter(id=id).update(name=name,pwd=pwd)
            return redirect('info_add')
    
    def user_dlete(request,id):
        models.User_info.objects.filter(id=id).delete()
        return redirect('info_add')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    JavaWeb实现smbms项目核心功能
    数据新增的常用方法(es6-es12)-今天一定要学会
    Java-网络编程
    计算机毕设 基于机器学习的文本聚类 - 可用于舆情分析
    SpringBoot中如何实现业务校验,这种方式才叫优雅!
    Netapp数据恢复—Netapp存储误删除lun的数据恢复过程
    form表单,formdata对象,实现文件上传
    element 去掉form表单的某一项单个form-Item校验
    Elasticsearch - IK分词器;文档得分机制(十一)
    基于gpg的fwknop配置流程
  • 原文地址:https://blog.csdn.net/weixin_71967396/article/details/126653002