上一篇(2-Django路由配置):https://blog.csdn.net/LOVEYSUXIN/article/details/122058413
一、定义
请求是指浏览器端通过http协议发送给服务器端的数据
响应是指服务器端接收到请求后做相应的处理后再回复给浏览器端的数据
请求中的方法
HTTP请求可与使用多种请求方法。
HTTP1.0定义了3种请求方法:GET, POST, HEAD 方法
HTTP1.1 新增了5种请求方法: OPTIONS, PUT, DELETE, TRACE , CONNECT方法
响应的状态码
http状态码分为5类,如下:
二、Django中的请求和响应
- 请求在Django实则就是视图函数的第一个参数,即HttpRequest对象;
- Django接收到http协议的请求后,会根据请求数据报文创建HttpRequest对象;
- HttpRequest对象 通过属性描述了请求的所有相关信息;
属性信息如下:
path_info : URL字符串
method : 字符串,表示HTTP请求方法,常用GET POST
GET: QueryDict查询字典的对象,包含get请求方式的所有数据
POST : QueryDict查询字典的对象,包含post请求方式的所有数据
FILES : 类似于字典的对象,包含所有的上传文件信息
COOKIES : Python字典,包含所有的cookie,键和值都为字符串
session: 似于字典的对象,表示当前的会话
body: 字符串,请求体的内容(POST 或 PUT)
sheme: 请求协议(http\ https)
get_full_path() : 请求的完整路径
request.META: 请求中的元数据(消息头)
- request.META[‘REMOTE_ADDR’] : 客户端IP地址
案例展示
urls.py
path('test_request', views.test_request),
views.py
def test_request(request):
print('path info is : ', request.path_info)
print('method is :', request.method)
print('request get :', request.GET)
print('COOKIES :', request.COOKIES)
print('scheme : ', request.scheme)
print('get_full_path() :', request.get_full_path())
print('REMOTE_ADDR :', request.META['REMOTE_ADDR'])
return HttpResponse('test request ok')
运行项目,浏览器访问:http://127.0.0.1:8000/test_request , 查看后台输出:
Django中的响应对象
1、HttpResponse()
构造函数格式:
HttpResponse(content=响应体,content_type=响应体数据类型,status=状态码)
作用:向客户端浏览器返回响应,同时携带响应体内容
参数
content : 返回的内容
status_code: 返回的HTTP响应状态码
content_type: 指定返回数据的MIME类型(默认为“text/html”)。浏览器会根据这个属性,来显示数据。
常用的Content-Type如下:
- text/html 默认的 HTML文件
- text/plain 纯文本
- text/css css文件
- text/javascript js 文件
- multipart/form-data 文件提交
- application/json json传输
- application/xml xml文件
(2)HttpResponse子类
三、Django GET请求和POST请求
- 无论是get还是post,统一都由视图函数接受请求,通过判断request.method区分具体的请求操作。
- 样例
if request.method == 'GET':
处理GET请求的业务逻辑
elif request.method == 'POST':
处理POST请求的业务逻辑
else:
处理其他请求的业务逻辑
1、GET请求
- GET请求,一般用于向服务器获取数据
- 能够产生GET请求的场景:
(1)浏览器地址栏中输入URL,回车后
(2) <a href ="地址?参数=值&参数=值">
(3)form 表单中的method为get
- GET请求方式中,如果有数据需要传递给服务器,通常会用查询字符串(Query String)传递【注意:不要传递敏感数据】
URL格式: xxx?参数名1=值&参数名2=值2....
例如: http://127.0.0.1:8000/page1?a=100&b=200
- 服务器端通过request.GET获取GET请求提交的数据
- 方法示例:
print(request.GET['参数名']) # 传参必须有参数名, 否则代码会报错
print(request.GET.get('参数名', '默认值')) # 传参可以没有参数名, 如果没有参数名,会输出'默认值' -- 常用该方式
print(request.GET.getlist('参数名')) # 获取参数名所有的值;http://127.0.0.1:8000/test_get_post?a=100&a=200 -->['100', '200']
2、POST请求
- POST请求动作,一般用于向服务器提交大量隐私数据
- 客户端通过表单等POST请求将数据传递给服务器端,如:
<form method='post' action='/test_get_post'>
用户名:<input type='text' name='uname'>
<input type='submit' value='提交'>
</form>
- 服务器端通过post方式接收客户端数据
print(request.POST['参数名'])
print(request.POST.get('参数名', ''))
print(request.POST.getlist('参数名'))
PS: 目前我们先取消 csrf验证,否则Django会拒绝客户端发来的post请求,报403响应。
取消csrf验证方式-- 注释掉settings.py 中 MIDDLEWARE中的CsrfViewMiddleware中间件。
案例
通过该案例验证服务器端获取get、post提交的参数。
**描述:**在get方法中返回一个form表达,可以输入用户名,进行post提交,然后在服务器端获取提交的用户信息。
具体脚本如下:
urls.py
path('test_get_post', views.test_get_post),
views.py
from django.http import HttpResponse
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':
print(request.GET['a']) # 传参必须有a, 否则代码会报错
print(request.GET.get('c', 'no c')) # 传参可以没有c, 如果没有c,会输出'no c' -- 常用该方式
print(request.GET.getlist('a')) # 获取参数名所有的值;http://127.0.0.1:8000/test_get_post?a=100&a=200 -->['100', '200']
return HttpResponse(POST_FORM)
elif request.method == 'POST':
# 处理用户提交数据
print('uname is :', request.POST['uname'])
return HttpResponse('post is ok')
else:
pass
return HttpResponse('--test get post ok--')
浏览器输入:http://127.0.0.1:8000/test_get_post?a=1&a=200
查看后台输出如下图:
下一篇:Django的设计模式及模板层