路由匹配与解析

django请求生命周期

image

路由匹配

1.路由
path('网址后缀',函数名)
一旦网址的后缀匹配上时,就会自动执行后面的函数并结束整个路由的匹配

2.路由结尾的斜杠
2.1如果输入网址的时候不写斜杠,django会就会进行二次处理
'自动加上斜杠,再匹配一次'
2.2django配置文件中可以指定是否自动添加斜杠
APPEND_SLASH = False

3.path转换器
3.1当网址后缀不固定的时候,可以使用转换器来匹配
'int': IntConverter(),
'path': PathConverter(),
'slug': SlugConverter(),
'str': StrConverter(),
'uuid': UuidConverter(),

3.2转换器匹配到的内容会当做视图的关键字参数传入
path('delete/<int:year>/<str:info>/', views.delete),
转换器有几个名字,那么视图函数的形参必须对应
def delete(request, year, info):
    pass

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

5.正则匹配之无名分组
re_path('^test/(\d+)/', views.test)
正则表达式匹配到的内容会当做视图函数的位置参数传递给视图函数

6.正则匹配之有名分组
re_path('^rest/(?P<year>\d+)/(?P<others>.*?)/', views.test)
正则表达式匹配到的内容会当做视图函数的关键字参数传递给视图函数

7.django版本区别
在django1.11中,只支持正则匹配,并且方式是url()
在django2,3,4中,path()、re_path等价于url()

反向解析

1.在页面上直接写死很多路由,一旦路由发生变化会导致所有页面的相关链接失效,为了防止出现该问题,我们需要使用反向解析
'返回一个结果,该结果可以访问到对应的路径'

2.路由对应关系起别名
path('delete/', views.reg, name='reg_view')

3.使用反向解析语法
3.1html页面
{% url 'reg_view' %}
3.2后端
from django.shortcuts import reverse
reverse('reg_view')
'反向解析的操作其他三个方法都一样path()、re_path()、url()'

无名有名反向解析

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

当路由中有不确定的匹配因素是,反向解析时需要人为的给出一个具体的值
后端
reverse('reg_view', args=('barry',))

html页面
{% url 'reg_view' 'barry' %}
'反向解析的操作其他三个方法都一样path()、re_path()、url()'

路由分支

1.django中的每个应用都可以有独自的urls.py文件夹、static文件夹
这样基于django开发多个应用可以完全独立,便于小组开发

2.总路由
path('app01/', include('app01.urls')),
path('app02/', include('app02.urls')),

3.子路由
path('after/', views.after)  # 这个是app01
path('after/', views.after)  # 这个是app02

名称空间

'有路由分发场景下多个应用在涉及到反向解析别名冲突的时候无法正常解析'
方法1:
patah('app01/', include(('app01.urls', 'app01'), namespace='app01'))
patah('app02/', include(('app02.urls', 'app02'), namespace='app02'))

方法2:
别名不冲突即可eg:app01_reg_view、app02_reg_view

作业

使用分组、反向解析、路由分发完成用户数据增删改查
1.urls.py
from django.urls import path
from app01 import views

urlpatterns = [
    path('home/', views.home,),
    path('login/', views.login, name='login_views'),
    path('func/<int:sid>/', views.func, name='func_views'),
    path('delete/<int:sid>/', views.delete,name='delete_views'),
]

2.views.py
from django.shortcuts import render, HttpResponse, reverse


from app01 import models


def home(request):
    info = models.User.objects.all()
    return render(request, 'home.html', {'user_data': info})


def login(request):
    info = models.User.objects.all()
    print(reverse('login_views'))
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user_obj = models.User.objects.filter(name=username).first()
        if user_obj:
            return HttpResponse('该用户已存在')
        models.User.objects.create(name=username, pwd=password)
        return render(request, 'home.html', {'user_data': info})
    return render(request, 'login.html')


def func(request, sid):
    edit_obj = models.User.objects.filter(id=sid).first()
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        models.User.objects.filter(id=sid).update(name=username, pwd=password)
        info = models.User.objects.all()
        return render(request, 'home.html', {'user_data': info})
    return render(request, 'func.html', {'edit_obj': edit_obj})


def delete(request, sid):
    models.User.objects.filter(id=sid).delete()
    info = models.User.objects.all()
    return render(request, 'home.html', {'user_data': info})

3.home.html
<body>
    <div class="container">
        <div class="row">
            <h1 class="text-center">数据展示</h1>
            <div class="col-md-6 col-md-offset-3">
                <a href="{% url 'login_views' %}" class="btn btn-primary btn-xs">新增数据</a>
                <table class="table table-hover table-striped">
                    <thead>
                        <tr>
                            <th>id</th>
                            <th>姓名</th>
                            <th>密码</th>
                        </tr>
                    </thead>
                    <tbody>
                    {% for user in user_data %}
                        <tr>
                            <td>{{user.id}}</td>
                            <td>{{user.name}}</td>
                            <td>{{user.pwd}}</td>
                            <td>
                                <a href="{% url 'func_views' user.id %}" class="btn btn-primary btn-xs">编辑</a>
                                <a href="{% url 'delete_views' user.id %}" class="btn btn-danger btn-xs">删除</a>
                            </td>
                        </tr>
                    {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</body>
posted @ 2022-09-01 20:24  无言以对啊  阅读(118)  评论(0)    收藏  举报