12月5日学习内容整理:Django的MTV模型,路由系统,请求对象和响应对象,模版语法的补充
一、Django是基于MTV模型
M是models模型,关于数据库操作的
T是模版
V是视图函数,处理业务逻辑的
补充:
form表单提交的路径是会自动带上当前页面的IP和端口的,当然也可以自己设置
二、路由系统
1、别名:是为了解决当修改路由中匹配的路径时form表单对应的action也要修改,为了避免这种繁琐的操作,我们使用别名
URL(r'^正则表达式',对应的视图函数,name="名字")
form表单中action="{% url "名字" %}"
所以也就是说当我们所写的项目应用非常多的时候我们可能会经常遇到要修改匹配的路径,所以action就不能写死某个路径,而是用路由的别名
补充:路由系统的正则匹配只是匹配URL中的路径部分,当URL请求过来时会挨个匹配,匹配上了就不会再往下匹配了;若匹配规则同时满足某一个URL,那么也只会找第一个,不会再往下找
2、分组
注意一点:request是按位置传参,必须放在第一位
(1)无名分组:
URL中的匹配规则加上括号,括号里匹配的内容就作为参数传给了视图函数,是按位置传参
url(r'^articls/(\d{4})/(\d{2})$', views.archive3)
(2)有名分组
URL中匹配规则加上括号,括号里按照正则的规则命名,匹配上的内容也是作为参数传给了视图函数,是按关键字传参,关键字就是起的名字,所以视图在接受的时候也要用相同的名字
url(r'^articls/(?P<y>\d{4})/(?P<m>\d{2})$', views.archive4) y和m就是起的名字
3、分发:是为了解决URL和视图函数的耦合问题,我们再写项目时会把所有的路由写到全局的URL.py文件中,这样的话若其中一个业务逻辑出了问题就会影响整个项目,为了杜绝这个问题,我们要把不同业务的URL归到具体业务的URL文件中,那全局的URL就做分发
from django.conf.urls import url,include
url(r'^正则表达式',include("某个文件的urls文件名"))
这样就把属于不同业务的URL区分开来,但是业务的URL要想被匹配到必须在前面加上全局URL匹配的对应业务的路径,否则直接拿具体业务的URL是匹配不上的
三、请求对象request
知道一点:request是WSGI封装的,包含了请求的所有的内容,而Django针对请求对象提供了一些属性和方法来供我们处理请求
除了之前说过的几个方法:
1、request.body 保存原始的数据,字节串,一般针对非键值对的数据,比如什么图片之类的
2、request.encoding 提交的数据的编码格式
3、request.path 请求URL中的路径部分,没有域名(IP和端口),不带数据
4、request.path_info 跟.path一样,没有数据
5、跟路径相关的方法:request.get_full_path() 也是URL中路径部分,是携带着数据的
6、判断是否为ajax请求的方法:request.is_ajax() 是的话返回true,一般用于ajax也发的get请求,后端无法分辨出哪个是ajax发的,就用这个方法来判断
四、响应对象
http协议要求是有发就得有收
1、Httpresponse
2、render(渲染方法):一来一回
3、redirect(重定向):实际上是两次请求,两次响应
注意标志位是30开头的基本都是重定向请求
五、模版语法
知道一点:
{% csrf_token %} 解决csrf跨域请求的,后面会讲,之前我们都是把配置文件中的csrf注释掉,实际上应该在模版文件添加这一个变量,否则就会触发forbidden异常
1、变量
{{变量名}} 用两个大括号表示的就是变量
渲染变量:深度查询,句点符.
可以直接.索引取到对应的元素,也可以.方法名来调用对象的方法,注意只能调用没有参数的方法,因为没法加括号
补充:
响应状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态码:
OK //客户端请求成功
Bad Request //客户端请求有语法错误,不能被服务器所理解
Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
Forbidden //服务器收到请求,但是拒绝提供服务
Not Found //请求资源不存在,eg:输入了错误的URL
Internal Server Error //服务器发生不可预期的错误
Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
GET请求没有请求体