一、请求与响应
Django在做的就是处理接受到的请求,按照请求处理逻辑,返回用户想要的数据。
1、请求样例
请求包含起始行(请求方法、请求路由、浏览器的协议版本号)、请求头headers、请求体body。
起始行中的请求方法:
2、Django中的请求
HttpRequest对象通过属性描述了请求的所有相关信息。可用request参数调用以下属性:
3、响应样例
响应包含起始行(浏览器的协议版本号、状态码、状态码原语)、响应头headers、响应体body。
响应状态码解析:
4、Django中的响应对象
作用:携带响应体内容向客户端返回响应
构造函数格式:
HttpResponse(content='响应体',content_type='响应体数据类型',status='状态码')
子类使用前需提前引入相应的方法。
二、GET请求与POST请求
请求统一由视图函数views接收,可通过request.method区分具体的请求动作:
if request.method == 'GET':
pass
elif request.method == 'POST':
pass
else:
pass
1、GET请求-从服务器获取数据
能够产生GET请求的场景:
- 浏览器地址栏输入url回车
- a标签、点击链接
- form表单中的method为get
GET请求方式中,若有数据需要传递给服务器,通常会用查询字符串传递,如http://127.0.0.1:8000/page1?a=100&b=200
,客户端通过以下方式获取该数据:
request.GET['参数名']
(不推荐)若查询的数据值为列表,只会返回最后一个值request.GET.get('参数名','默认值')
request.GET.getlist('参数名')
2、POST请求-向服务器提交数据
服务器端接收form传回来的参数,需要取消csrf验证,否则会报403响应
取消csrf验证方法:禁止掉settings.py中MIDDLEWARE中的CsrfViewsMiddleWare的中间件
django.middleware.csrf.CsrfViewMiddleware
request.POST['参数名']
(不推荐)若查询的数据值为列表,只会返回最后一个值request.POST.get('参数名','默认值')
request.POST.getlist('参数名')
三、Django设计模式MTV
MVC与MTV
四、模板层Template
可根据视图中传递的字典数据动态生成的html网页
1、配置步骤
- 创建模板文件夹<项目名>/templates,与保存代码的同名文件夹同级
- 在settings.py中配置:BACKEND、DIRS、APPDIRS、OPTIONS
- BACKEND:指定模板的引擎
- DIRS:模板的搜索目录(可是多个),
[BASE_DIR / 'templates']
- APP_DIRS:是否要在应用中的templates文件夹中搜索模板文件
- OPTIONS:有关模板的选项
2、模板的加载方式
方案(1):通过loader获取模板,通过HttpResponse进行响应
from django.template import loader
# 1、通过loader加载模板
t = loader.get_template('模板文件名')
# 2、将t转换成HTML字符串
html = t.render((字典数据))
# 字典数据指:将想要传给前端的变量封装到此字典中
# 3、用响应对象将转换的字符串内容返回给浏览器
return HttpResponse(html)
方案(2):使用render()直接加载并响应模板
from django.shortcuts import render
return render(request,'模板文件名',('字典数据'))
3、视图层与模板层之间的交互
1、将想要传递给模板的数据封装到python的字典中。
2、模板中,用**{{变量名}}**来调用视图传进来的变量。
def test_html(request):
from django.shortcuts import render
dic = {
'name':'zx',
'pwd':'123456'
}
return render(request,'test_html.html',dic)
<body>
<h3>我是模板层</h3>
<hr>
<h1>我的姓名是{{name}}</h1>
<h1>我的密码是{{pwd}}</h1>
</body>
4、变量
在模板中使用变量语法
- {{变量名}}
- {{变量名.index}}
- {{变量名.key}}
- {{对象.方法}}
- {{函数名}}
5、标签
将服务器端的功能嵌入模板中,如if判断、for标签、url标签等。
{% 标签 %}
{% 结束标签 %}
(1)if标签
{% if 条件表达式1 %}
(符合条件1要展示的内容)
{% elif 条件表达式2 %}
(符合条件2要展示的内容)
{% else %}
(均不符合要展示的内容)
{% endif %}
注:在if标记中,运算符均可使用,但括号不可用
(2)for标签
{% for 变量 in 可迭代对象 %}
(循环语句)
{% empty %}
(可迭代对象无数据时填充的语句)
{% endfor %}
<!-- eg -->
{% for name in lst %}
{% if forloop.first %} &&&&& {% endif %}
<p>{{ forloop.counter}}.{{ name }}</p>
{% if forloop.last %} ===== {% endif %}
{% empty %}
当前无数据
{% endfor %}
6、 过滤器
定义:在模板层直接对变量的值进行处理,以改变输出显示
语法:{{ 变量 | 过滤器1:'参数值1'|过滤器2:'参数值2'... }}
<h3>int 是 {{int | add:'2'}}</h3>
<h3>str 是 {{str | upper}}</h3>
<!-- dic['script'] = '<script>alert(1111)</script>' -->
<h3>script 是 {{script}}</h3>
<!-- 不对html语句转义 -->
<h3>script 是 {{script | safe}}</h3>
7、 模板继承
使父模板的内容重用,子模板直接继承父模板的全部内容并可以覆盖父模板中相应的块。
(1)父模板步骤
- 定义父模板中的块block标签
- 标识出哪些在子模板中是允许被修改的
- block标签:在父模板中定义,可以在子模板中覆盖。
{% block block_name%}
允许子模板修改的内容
{% endblock (block_name)%}
(2)子模板步骤
- 继承模板extends标签(写在模板文件的第一行)
{% extends 'xxx.html'%}
- 重写父模板中的内容块,不用再写其他html语句
{% extends 'xxx.html'%}
{% block block_name%}
子模板块用来覆盖父模板中block_name块的内容
{% endblock (block_name)%}
模板继承时,服务器端的动态内容无法继承。
五、URL反向解析
1、代码中url出现的位置
(1)模板中
<a href=‘url’>超链接</a>
点击后,页面跳转至urlform action='url' method='post'
form表单中的数据,用post提交至url
(2)视图中
- 302跳转
HttpResponseRedirect('url')
将用户地址栏中的地址跳转到url
2、url相对地址书写规范
1、'/page/1'
- '/‘开头的相对地址,浏览器会把当前地址栏里的协议、ip和端口号加上该相对地址作为最终访问地址。若地址栏中的地址为http://127.0.0.1:8000 /page/3
,那么跳转后地址为http://127.0.0.1:8000 + /page/1
。
2、'page/1'
- 没有’/'开头的相对地址,浏览器会根据当前url的最后一个/之前的内容加上该相对地址作为最终访问地址。若地址栏中的地址为http://127.0.0.1:8000 /page/3
,那么跳转后地址为http://127.0.0.1:8000/page/ + page/1
。
3、url反向解析
指在视图或模板中,用path定义的名称来动态查找或计算出相应的路由
path函数语法:path(route,views,name='别名')
(1)模板中
通过url标签实现地址反向解析
{% url '别名' %}
{% url '别名' '参数值1' '参数值2' %}
ex:
{% url 'pagen' '400'(此处必须使用字符串形式) %}
{% url 'person' age='18' name='zx' %}
优点:当想要更改路由地址时,不需手动修改所有url,可以直接动态更新到最新的。
(2)视图中
调用django中的reverse方法进行反向解析。
使用场景:重定向
from django.urls import reverse
reverse('别名',args=[],kwargs={})
print(reverse('pagen',args=[300]))
print(reverse('person',kwargs={'name':'xixi','age':18}))