Django微讲解(三)

Django微讲解(三)

Django请求生命周期流程图

	客户端基于各种协议发送数据,比如HTTP协议等等,发送给web服务网关接口,在这里解析数据并进行封装,传递
给Django后端,先传给中间件,这个我们先忽略,然后就是路由层,在这里做路径与视图函数的对应关系,根据对应关系找
到视图层,这是是整个项目的核心逻辑层,在这里会用到HTML页面,所以就到模板层,模板层用到的模板语法,所用到的数
据经过视图层找模型层索要数据,模型层注意跟数据库打交道,然后返回数据,先发给中间件,然后再发给文本服务网关接
口,最后发送给浏览器。

路由层

1.路由匹配

# 1.路由匹配的特点
	只要匹配上了就会立刻结束执行对应的视图函数,并且URL方法的第一个参数其实就是一个正则表达式,只要正则
表达式能够从用户输入的后缀中匹配到内容就算匹配上了
    举个例子:url(r'test', views.test),正则就是test,如果你的后缀是test可以匹配出test文本,如果你的后缀
是testqq,那么还可以匹配到test的文本,只要用户输入的后缀含有test就匹配到test文本
# 2.Django二次追加斜杠机制
	经过上一个例子我们发现,虽然我们URL方法的第一个参数没有加斜杠,但是当执行路由的时候后面会自动加一个
斜杠,这就是Django二次追加斜杠机制,我们可以取消这个机制,去到配置文件下,加一句'APPEND_SLASH = False',但
是我们不推荐这样做
# 3.利用正则表达式来限制路由
	我们刚刚说过,URL方法的第一个参数其实就是一个正则表达式,那么我们就可以利用正则表达式来解决路由随意
乱写,匹配不准确的问题
    1.我们可以在前面加一个上箭头(^)来解决路由前面随意乱写的问题
    2.在最后面加一个$来来解决路由后面随意乱写的问题
    3.我们也可以定制一个主页,正则为(^$),用户不输入任何后缀可以直接访问
    4.我们也可以定义一个尾页,正则为(.*),当用户输入没有对应关系的时候访问

2.无名有名分组

# 1.无名分组
	我们之前在讲正则的时候讲过正则加括号表示分组,如果在路由匹配中使用括号对正则进行了分组,那么在调用视
图函数的时候,会将括号内匹配到的内容当做位置参数传递给视图函数,这个特性就是Django的'无名分组'
    例子:url(r'^test/([0-9]{4})/$', views.test)
        test(request,括号内正则表达式匹配到的内容)
# 2.有名分组
	我们之前讲正则分组的时候也讲过,是可以给正则起别名的,如果在路由匹配中给括号内的正则表达式起别名,匹
配成功会将括号内匹配到的内容按照关键字参数传递给视图函数,这个特性就是Django的'有名分组'
    例子:url(r'test/(?P<id>[0-9]{4})$',views.test)
        test(request,id=括号内正则表达式匹配到的内容)
'''
注意:有名分组和无名分组不能混合使用,只能单独使用,但是可以单个重复使用
'''

3.反向解析

# 1.反向解析
	通过反向解析可以获取到一个解果,该结果可以访问到一个路由
    1.给对应关系起别名
    	url(r'^index123123/', views.index,name='index_id'),
    2.使用反向解析获取结果
    	前端:{% url 'index_id' %}  # index123123/,结果可以访问路由
		后端:from django.shortcuts import reverse
      		 reverse('index_id')  # /index123123/,可以拿着结果去访问路由
# 2.无名分组反向解析
	1.给对应关系起别名
    	url(r'^index123/(\d+)', views.index,name='index_id'),
	2.使用反向解析获取结果
    	因为无法明确括号内正则表达式的内容,所以需要人为指定
    	前端:{% url 'index_id' 123%}  # index123/123
		后端:from django.shortcuts import reverse
      		 reverse('index_id',args=(111,))  # /index123/111,可以拿着结果去访问路由
# 3.有名分组反向解析
	1.给对应关系起别名
    	url(r'^index123/(?P<id>\d+)', views.index,name='index_id'),
	2.使用反向解析获取结果
    	因为无法明确括号内正则表达式的内容,所以需要人为指定
        前端:{% url 'index_id' 123%}  # index123/123
		后端:from django.shortcuts import reverse
      		 reverse('index_id',args=(111,))  # /index123/111,可以拿着结果去访问路由
'''
注意:有名分组反向解析还有一种字典类型,无名有名反向解析中的手动传值,这个值在实际工作中可以是数据的主键值、页
面页码、区域编号等等
'''

4.路由分发

	当一个Django项目特别大的时候,里面就会有很多的应用,每个应用下有很多对应关系,所以我们就可以根据应用
的不同拆分到不同的应用中,Django支持每个应用都可以有自己独立的路由层、模板层、静态文件、视图层(默认)、模型层
(默认),这个特性能够让Django在分组开发上更加快捷、方便、所有人都可以在应用中开发完整的项目功能,最后汇总到一
个空的Django项目中,然后通过路由分发整合所有人的应用。
# 1.创建多个应用并到配置文件中注册
	1.创建应用:点击pycharm上方的'Tools',然后点击'Run manage.py Task',然后在窗口输入命令'startapp 应用名'即可
	2.去配置文件中注册
    	INSTALLED_APPS = [
            'app01',
            'app02'
            ]
# 2.路由分发
	1.在多个应用中编写相同的路由
    	urlpatterns = [
    url(r'^index/', views.index),
		]
	2.路由分发
    	from django.conf.urls import url,include
        from app01 import urls as app01_urls
        from app02 import urls as app02_urls
        from django.contrib import admin
        from app01 import views

        urlpatterns = [
            url(r'^app01/', include(app01_urls)),
            url(r'^app02/', include(app02_urls)),
        ]
        '''路由只负责分发,不负责视图函数对应'''
        上述代码还可以简写:
            from django.conf.urls import url, include
            url(r'^app01/',include('app01.urls')),
            url(r'^app02/',include('app02.urls'))

5.名称空间

	不同页面的应用还有相同的别名,反向解析在默认情况下是不会自动识别应用前缀的,我们可以在总路由添加名称
空间来解决这个问题
    url(r'^app01/',include('app01.urls',namespace='app01')),
    url(r'^app02/',include('app02.urls',namespace='app02'))
    在应用反向解析的时候就会有自动提示
    reverse('app01:index_view')
    reverse('app02:index_view')
'''
其实只要确保反向解析的别名在整个项目中不重复,那样不用名称空间也是可以的
'''

这里是IT小白陆禄绯,欢迎各位大佬的指点!!!

posted @ 2022-05-12 22:08  陆禄绯  阅读(27)  评论(0编辑  收藏  举报