脚本宝典收集整理的这篇文章主要介绍了Django微讲解(三),脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
客户端基于各种协议发送数据,比如HTTP协议等等,发送给web服务网关接口,在这里解析数据并进行封装,传递
给Django后端,先传给中间件,这个我们先忽略,然后就是路由层,在这里做路径与视图函数的对应关系,根据对应关系找
到视图层,这是是整个项目的核心逻辑层,在这里会用到HTML页面,所以就到模板层,模板层用到的模板语法,所用到的数
据经过视图层找模型层索要数据,模型层注意跟数据库打交道,然后返回数据,先发给中间件,然后再发给文本服务网关接
口,最后发送给浏览器。
# 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.我们也可以定义一个尾页,正则为(.*),当用户输入没有对应关系的时候访问
# 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=括号内正则表达式匹配到的内容)
'''
注意:有名分组和无名分组不能混合使用,只能单独使用,但是可以单个重复使用
'''
# 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,可以拿着结果去访问路由
'''
注意:有名分组反向解析还有一种字典类型,无名有名反向解析中的手动传值,这个值在实际工作中可以是数据的主键值、页
面页码、区域编号等等
'''
当一个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'))
不同页面的应用还有相同的别名,反向解析在默认情况下是不会自动识别应用前缀的,我们可以在总路由添加名称
空间来解决这个问题
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小白陆禄绯,欢迎各位大佬的指点!!!
以上是脚本宝典为你收集整理的Django微讲解(三)全部内容,希望文章能够帮你解决Django微讲解(三)所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。