【Django】请求与响应、设计模式MTV、模板层、url反向解析

本文介绍了Django如何处理HTTP请求和响应,包括HttpRequest对象和HttpResponse对象的使用。详细阐述了GET和POST请求的区别,GET请求的数据通过查询字符串传递,而POST请求常用于提交数据。此外,还讨论了Django的MTV设计模式,并讲解了模板层(Template)的工作原理,如模板的加载、变量、标签和过滤器的使用。最后,文章提到了URL反向解析的重要性和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、请求与响应

在这里插入图片描述
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、配置步骤

  1. 创建模板文件夹<项目名>/templates,与保存代码的同名文件夹同级
  2. 在settings.py中配置:BACKEND、DIRS、APPDIRS、OPTIONS
  3. BACKEND:指定模板的引擎
  4. DIRS:模板的搜索目录(可是多个),[BASE_DIR / 'templates']
  5. APP_DIRS:是否要在应用中的templates文件夹中搜索模板文件
  6. 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> 点击后,页面跳转至url
  • form 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}))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值