03_Django-GET请求和POST请求-设计模式及模板层

视频:https://www.bilibili.com/video/BV1vK4y1o7jH

博客:https://blog.csdn.net/cpen_web


一. GET请求和POST请求

定义

·无论是GET还是POST,统一都由视图函数接收请求,通过判断request.method区分具体的请求动作

·样例:

if requests.method == 'GET':
处理GET请求时的业务逻辑
elif requests.method == 'POST':
处理POST请求的业务逻辑
else:
其他请求业务逻辑

------------------------------------------------------------------

演示

 <项目同名文件夹下>/views.py
def test_get_post(request):
if request.method == 'GET':
pass
elif request.method == 'POST':
#处理用户提交数据
pass
else:
pass
return HttpResponse('--test get post is ok--')

GET处理

·GET请求动作,一般用于向服务器获取数据

·能够产生GET请求的场景:

​ - 浏览器地址栏中输入URL,回车后

​ - <a href="地址?参数=值&参数=值">

​ - form表单中的method为get

------------------------------------------------------------------

GET请求方式中,如果有数据需要传递给服务器,通常会用查询字符串(Query String)传递【注意:不要传递敏感数据

URL格式:xxx?参数名1=值1&参数名2=值2...

- 如:http://127.0.0.1:8000/page1?a=100&b=200

服务器端接收参数

获取客户端请求GET请求提交的数据

·方法示例:

request.GET['参数名'] # QueryDict
request.GET.get('参数名', '默认值')
request.GET.getlist('参数名')
# mypage?a=100&b=200&c=300&b=400
# request.GET=QueryDict({'a': ['100'], 'b': ['200', '400'], 'c': ['300']})
# a = request.GET['a']
# b = request.GET['b'] # Error

------------------------------------------------------------------

演示

http://127.0.0.1:8000/test_get_post?a=400
--test get post is ok--
终端
<QueryDict: {'a': ['400', '200', '100']}>
100
['400', '200', '100']
no c <项目同名文件夹下>/urls.py
urlpatterns = [
...
path('test_get_post', views.test_get_post)
] <项目同名文件夹下>/views.py
def test_get_post(request):
if request.method == 'GET':
print(request.GET)
print(request.GET['a'])
# 问卷调查 = form get 兴趣爱好 - 复选框
print(request.GET.getlist('a'))
print(request.GET.get('c', 'no c'))
elif request.method == 'POST':
#处理用户提交数据
pass
else:
pass
return HttpResponse('--test get post is ok--')

------------------------------------------------------------------

·思考:之前的计算器功能,能否拿查询字符串做?

http://127.0.0.1:8000/整数/操作符/整数

http://127.0.0.1:8000/cal?x=10&y=20&op=add

POST处理

·POST请求动作,一般用于向服务器提交大量/隐私数据

·客户端通过表单等POST请求将数据传递给服务器端,如:

·服务器端接收参数

​ 通过request.method来判断是否为POST请求,如:

if request.method == 'POST':
处理POST请求的数据并响应
else:
处理非POST请求的响应

------------------------------------------------------------------

使用post方式接收客户端数据

request.POST['参数名'] # request.POST  绑定QueryDict
request.POST.get('参数名', '')
request.POST.getlist('参数名')

取消csrf验证,否则Django将会拒绝客户端发来的POST请求,报403响应

------------------------------------------------------------------

取消csrf验证

​ - 禁止掉settings.py中MIDDLEWARE中的CsrfviewsMiddleWare的中间件

MIDDLEWARE = [
...
# 'django.middleware.csrf.CsrfViewMiddleware',
...
]

------------------------------------------------------------------

演示

http://127.0.0.1:8000/test_get_post

post is ok
终端
uname is cpen <项目同名文件夹下>/urls.py
urlpatterns = [
...
path('test_get_post', views.test_get_post)
] <项目同名文件夹下>/views.py
POST_FORM = '''
<form method='post' action='/test_get_post'>
用户名: <input type='text' name='uname'>
<input type='submit' value='提交'>
</form>
'''
def test_get_post(request):
if request.method == 'GET':
return HttpResponse(POST_FORM)
...

---------------------------------------------------------------------------------------------------------------------------------

小节

·Django处理GET请求

​ 查询字符串 - 少量数据传递

·Django处理POST请求

​ 专用于浏览器提交数据


二. Django的设计模式及模板层

MVC和MTV

传统的MVC

MVC代表Model-View-Controller(模型-视图-控制器)模式。

  • M模型层(Model),主要用于对数据库层的封装

  • V视图层(View),用于向用户展示结果(WHAT + HOW)

  • C控制(Controller),用于处理请求、获取数据、返回结果(重要)

作用:降低模块间的耦合度(解耦)

Django的MTV模式

MTV代表Model-Template-View(模型-模板-视图)模式。

  • M模型层(Model)负责与数据库交互

  • T模板层(Template)负责呈现内容到浏览器(HOW)

  • V视图层(View)是核心,负责接收请求、获取数据、返回结果(WHAT)

作用:降低模块间的耦合度(解耦)

---------------------------------------------------------------------------------------------------------------------------------

模板层

什么是模板

1、模板是可以根据字典数据动态变化的html网页

2、模板可以根据视图中传递的字典数据动态生成相应的HTML网页

模板配置

创建模板文件夹 <项目名>/templates

settings.pyTEMPLATES配置项

​ 1.BACKEND:指定模板的引擎

​ 2.DIRS:模板的搜索目录(可以是一个或多个)

​ 3.APP_DIRS:是否要在应用中的templates文件夹中搜索模板文件

​ 4.OPTIONS:有关模板的选项

·配置项中 需要修改部分

​ 设置DIRS - 'DIRS': [os.path.join(BASE_DIR, 'templates')],

------------------------------------------------------------------

演示


<项目同名文件夹下>/settings.py
TEMPLATES = [
{
...
'DIRS': [os.path.join(BASE_DIR, 'templates')],
...

模板的加载方式

方案1 - 通过loader获取模板,通过HttpResponse进行响应(特点:麻烦)

在视图函数中:

from django.template import loader
# 1.通过 loader 加载模板
t = loader.get_template("模板文件名")
# 2.将 t 转换成 HTML 字符串
html = t.reader(字典数据)
# 3.用响应对象将转换的字符串内容返回给浏览器
return HttpResponse(html)

--------------------------------------------------------------------------------------

演示

http://127.0.0.1:8000/test_html

 <项目同名文件夹下>/urls.py
urlpatterns = [
...
path('test_html', views.test_html)
] <项目同名文件夹下>/views.py
def test_html(request):
from django.template import loader
t = loader.get_template('test_html.html')
html = t.render()
return HttpResponse(html) <项目文件夹下>/templates/test_html.html
<h3>我是模板层的~~~~</h3>

---------------------------------------------------------------------------------------------------------------------------------

方案2 - 通过render() 直接加载并响应模板(特点:方便,大量使用这种)

在视图函数中:

from django.shortcuts import render
return render(request, '模板文件名', 字典数据)

--------------------------------------------------------------------------------------

演示

http://127.0.0.1:8000/test_html

 <项目同名文件夹下>/views.py
def test_html(request):
# 方案2
from django.shortcuts import render
return render(request, 'test_html.html')

视图层与模板层之间的交互

1、视图函数中可以将Python变量封装到字典中传递到模板

样例:

def xxx_view(request):

dic = {

"变量1": "值1",

"变量2": "值2",

}

return render(request, 'xxx.html', dic)

2、模板中,我们可以用 {{ 变量名 }} 的语法 调用视图传进来的变量

--------------------------------------------------------------------------------------

演示

http://127.0.0.1:8000/test_html

 <项目同名文件夹下>/urls.py
urlpatterns = [
...
path('test_html', views.test_html)
] <项目同名文件夹下>/views.py
def test_html(request):
from django.shortcuts import render
dic = {'username': 'peng', 'age': 23}
return render(request, 'test_html.html', dic) <项目文件夹下>/templates/test_html.html
<h3>{{ username }}是模板层的~~~~</h3>

03_Django-GET请求和POST请求-设计模式及模板层的更多相关文章

  1. Ajax中get请求和post请求

    我们在使用Ajax向服务器发送数据时,可以采用Get方式请求服务器,也可以使用Post方式请求服务器,那么什么时候该采用Get方式,什么时候该采用Post方式呢? Get请求和Post请求的区别: 1 ...

  2. slave IO流程之二:注册slave请求和dump请求

    slave IO流程已经在http://www.cnblogs.com/onlyac/p/5815566.html中有介绍 这次我们要探索注册slave请求和dump请求的报文格式和主要流程. 一.注 ...

  3. loadrunner录制脚本如何选择使用get请求和post请求的方式

    在loadrunner工具里录制脚本时常常会用到get请求和post请求,有关loadrunner常用的这两类的请求主要有: get请求: web_url 和 web_link post请求: web ...

  4. iOS开发网络篇—GET请求和POST请求

    iOS开发网络篇—GET请求和POST请求 一.GET请求和POST请求简单说明 创建GET请求 // 1.设置请求路径 NSString *urlStr=[NSString stringWithFo ...

  5. 普通请求和ajax请求的区别

    普通请求和ajax请求的区别? 下面的action返回一个json文件,文件内容为sts.*,data1

  6. iOS开发网络篇—GET请求和POST请求(转)

    一.GET请求和POST请求简单说明 创建GET请求 1 // 1.设置请求路径 2 NSString *urlStr=[NSString stringWithFormat:@"http:/ ...

  7. GET请求和POST请求的区别

    request获取请求参数 最为常见的客户端传递参数方式有两种: 浏览器地址栏直接输入:一定是GET请求: 超链接:一定是GET请求: 表单:可以是GET,也可以是POST,这取决与<form& ...

  8. 使用SoapUI工具做get请求和post请求接口测试

    祝大家节日快乐啦. 之前写过的一篇帖子已经介绍了SoapUI工具的基本使用,所以在此不再重复讲解关于建工程.建测试套件.添加用例等操作,可查看该篇文章详解:http://www.cnblogs.com ...

  9. Ajax相关——get请求和post请求的区别

    一.完整的URL由以下几部分组成: scheme:通信协议,常用的有:http/ftp. host:主机,服务器(计算机)域名或IP地址 port:端口,整数,可选,省略时使用默认端口,http的默认 ...

随机推荐

  1. FICO 常用事务码

    1.SAP配置流程 1.定义,定义组织,概念,比如FI中定义公司代码,会计科目表,年度变式.SAP中有大量的定义过程. 2.分配,把会计科目表/公司/年度变式等参数分配到公司代码,逻辑组织,基本实现框 ...

  2. spring中的bean生命周期

    1.实例化(在堆空间中申请空间,对象的属性值一般是默认值.通过调用createBeanInstance()方法进行反射.先获取反射对对象class,然后获取默认无参构造器,创建对象) 2.初始化(就是 ...

  3. SQL报了一个不常见的错误,让新来的实习生懵了

    摘要:前些天一个很简单的SQL报了一个不常见的错误. 本文分享自华为云社区<记一次mysql关联查询格式冲突问题[五月04]>,作者: KevinQ . 问题起源 作为CRUD程序员,最常 ...

  4. 我用Python做了一个咖啡馆数据分析

    在做案例前,我还想回答大家一个疑问,就是excel做数据分析可以实现Python一样的效果,那用Python的意义在哪呢? 经过这段时间学习理解,我的回答是: (https://jq.qq.com/? ...

  5. Python: list列表的11个内置方法

    先来逼逼两句: 在实际开发中,经常需要将一组(不只一个)数据存储起来,以便后边的代码使用.在VBA中有使用数组,可以把多个数据存储到一起,通过数组下标可以访问数组中的每个元素.Python 中没有数组 ...

  6. SQL优化常用的几种方法

    为什么要对SQL优化: 1.执行性能低 2.等待时间过长 3.SQL写的太差 4.索引失效 ·····等等 SQL优化的一些方法: 1.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看S ...

  7. 【RocketMQ】消息的存储

    Broker对消息的处理 BrokerController初始化的过程中,调用registerProcessor方法注册了处理器,在注册处理器的代码中可以看到创建了处理消息发送的处理器对象SendMe ...

  8. 使用dnSpy对无源码EXE或DLL进行反编译并且修改

    背景 总有一些特殊情况,我们没有源码,但是某个C#程序集dll或者可执行程序exe影响到我们代码的正常运行,我们希望得到源码,能改掉或者修改某些bug,但是苦于没有源码,这个时候可以用dnspy进行源 ...

  9. 阿里云有奖体验:用PolarDB-X搭建一个高可用系统

    体验简介 场景将提供一台配置了CentOS 8.5操作系统和安装部署PolarDB-X集群的ECS实例(云服务器).通过本教程的操作,带您体验如何使用PolarDB-X搭建一个高可用系统,通过直接ki ...

  10. arcgis中栅格矢量计算技巧收藏

    ​ ​编辑 一.计算面积 ( 可以帮我们计算小班面积 )添加 AREA 字段,然后右键点击字段列,然后点击 CALCULATE VALUES; ---> 选择 ADVANCED -->把下 ...