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

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

'int':Intconverter(), 匹配 整型  (常用)
'path':PathConverter(), 匹配 所有字符
'slug':SlugConverter(), 英文字符中的斜杠 下划线 或数字
'str':StringConverter(), 匹配字符串  (常用)
'uuid':UUIDConverter(), 匹配 满足uuid形式字符串   
转换器匹配到的内容会当作视图函数的关键字 参数传入
path('func/<int:year>/<str:info>/', views.func)

转换器有几个叫什么名字 那么视图函数的形参必须对应
def func(request,year,info):
    pass

2.2、re_path正则匹配

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

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

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

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

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

re_path('^test/(?P<year>\d+)/(?P<other>.*?)/',views.test)

2.3、django版本区别

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

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

3、反向解析

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

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

  1. 路由对应关系起别名

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

    1. html页面

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

      from django.shortcuts import reverse
      reverse('reg_view')
      

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

3.1、无名反向解析

path('reg/<str:info>',views.reg,name = 'reg_view')

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

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

4、路由分发

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

总路由

path('app01/',include('app01.urls')),
path('app02/',include('app02.urls')),

子路由

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

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

4.1、名称空间

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

解决方式一:

名称空间:
nanmespace

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

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

作业

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')

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值