CSIC_716_2020106【Django入门---ORM表关系建立、路由匹配、反向解析、路由分发、名称空间】
通过ORM建立表关系
表关系:一对一,一对多,多对多
在模型类中,如果是一对多关系,外键建在多的表上;如果是多对多关系,外键建在常用的表上;如果是一对一关系,外键也建在常用的表上。
路由匹配、有名无名分组
路由匹配在django1.x版本中主要使用正则表达式,路由匹配的设置是在urls.py文件中的urlpatterns中进行,一旦匹配到之后,就不会进行匹配了。
对于这种路由匹配的正则表达式url( r'^name/' ) ,如果用户在浏览器中输入的内容仅缺少最后的斜杠,django中的配置会让浏览器加上斜杠进行二次匹配,这个配置信息为:在setting中 增加 APPEND_SLASH = False(默认值是True), append_slash的英文意思是(追加斜杠)。
主页路由匹配的写法为: url(r'^$',view.home, name ='home')
有名分组和无名分组其实就是在路由匹配第一个参数的正则表达式中做文章,最终目的是将匹配的参数中的某些值传递带视图函数。有名分组是以关键字参数的形式传递,无名分组是以位置参数的形式传递。
下面介绍两种分组的书写格式:
无名分组
无名分组 例如浏览器中传来了一个值 **********urls.py********** url( r'^index/(\d+)/' , views.index, name = 'index') **********views.py*************** def index(request, args) # args是一个位置参数 print(args) # 这里就是传过来的正则中括号内的参数 return HttpResponse('收到了')
有名分组
有名分组 浏览器中传来了一个值 *********************urls.py*********************** url(r'^index/(?P<link>\d+)/' , views.index, name = 'index) **********************views.py********************* def index(request, link): # 这里的link形参一定要和上面url尖括号中的名字一样,因为有名分组是通过关键字参数传值过来的 print(link) # 这里是通过有名分组传过来的值 return HttpResponse('收到了')
有名分组和无名分组不能混合使用
反向解析
为什么要反向解析? 因为路由匹配url()中的第一个参数正则匹配表达式会变化(即网址会发生变化),但是前端的提交或者超链接以及后端的重定向都用到了这个正则表达式所表示的地址。当正则表达式发生变化时,前后端如果和正则绑定,就会造成大量的改动。这里通过url()中的第三个参数name,来进行前后端的绑定。
反向解析的应用:后端所有的redirect连接都要改。
反向解析主要关注三个地方,路由匹配、前端的跳转、后端的跳转
路由匹配
前端跳转 { % url ' 路由匹配中 的name值' (位置或关键字)参数 }
路由匹配的时候,如果没有做分组匹配,可以通过以下方式做反向解析。
后端跳转 reverse(‘路由匹配中name的值’)
from django.shortcuts import reverse
补充:
路由分发
总路由:不在项目的urls.py文件中进行路由匹配,而将路由与视图函数的匹配功能下放到各个app中,项目的urls.py文件的urlpatterns只做路由分发工作,各app自建urls.py文件进行路由与属兔函数的匹配。
路由分发需要使用 include功能。
from django.conf.urls import include
总路由写法 from django.conf.urls import include url(r'^app01 ', include(app01.urls)) url(r'^app02 ', include(app02.urls))
子路由:子路由就是在各个app中新建urls.py文件
from django.conf.urls import url from app01 import views urlpatterns = [ url(路由匹配) ]
名称空间
名称空间在总路由中设置,就是在include参数中,增加一个namespace的属性值,区分各个app。
总路由写法 from django.conf.urls import include url(r'^app01 ', include(app01.urls), namespace='app01') url(r'^app02 ', include(app02.urls), namespace='app02')
名称空间的作用就是防止在 反向解析的时候,碰到在不同app中,url()的第三个参数 name值相同,导致解析错误。
有了名称空间后,在前端和后端,就会在设置反向解析时,引用各个name时,前面都会加上其所属的名称空间。
后端变化
前端变化
虚拟环境
虚拟环境就是一个纯净的Python解释器环境,避免给项目加载不必要的模块。
伪静态
伪静态的作用就是假装是一个静态网页,更容易被搜索引擎捕获,获得更大曝光的几率
效果
顶