文章目录
- 常用请求方法
- 限制请求
- 页面重定向
- HttpRequest对象
- request常用属性
- request.META包含数据
- request常用方法
- HttpResponseBase对象
- HttpResponse对象常用属性
- HttpResponse对象常用方法
- JsonResponse对象使用方法
- json转码
如果你是抱着观看Django后端如何传值的疑问观看此博客,建议直接拉到最下方看
JsonResponse对象使用方法
,查看此方法需要一定的django基础
常用请求方法
- GET请求:GET请求一般用来向服务器索取数据,但不会向服务器提交数据,不会对服务器的状态进行更改。比如向服务器获取某篇文章的详情。
- POST请求:POST请求一般是用来向服务器提交数据,会对服务器的状态进行更改。比如提交一篇文章给服务器。
上述两种是当前适用范围最广的两种请求,接下来我们会做一些限制请求的方法都使用上述两种请求进行演示
限制请求
当使用函数的方式创建视图时,我们需要限制请求就只能通过装饰器来完成,这时候我们就需要引入装饰器from django.views.decorators.http import require_http_methods
此库中最常用的几个方法和作用分别为
- require_http_methods(): 可以将限制访问,只允许装饰器中给定的方法访问, 如
@require_http_methods(["GET", "POST"])
只允许get与post方法访问页面 - require_GET: 相当于
@require_http_methods(["GET"])
- require_POST: 相当于
@require_http_methods(["POST"])
- require_safe: 安全请求,当前请求方式中只有GET和HEAD两种请求不会传入数据,可以算是安全请求,所以这个就相当于
@require_http_methods(["GET", "HEAD"])
效果如下图
# @ require_GET
@require_http_methods(['POST', 'GET'])
def home(request):
if request.method == 'GET':
return render(request, 'home.html')
elif request.method == 'POST':
return HttpResponse('当前为POST访问页面')
上述的限制请求的方法是针对函数视图的,下方我会将如何创建类视图,在类视图中限制请求实现较函数要简单一些。
页面重定向
重定向分为永久性重定向和暂时性重定向,在页面上体现的操作就是浏览器会从一个页面自动跳转到另外一个页面。比如用户访问了一个需要权限的页面,但是该用户当前并没有登录,因此我们应该给他重定向到登录页面。
- 永久性重定向:http的状态码是301,多用于页面永久性的废弃使用。
- 暂时性重定向:http的状态码是302,多用于由于权限不足而进行的页面的暂时性跳转。
如何在Django中实现当前的页面重定向呢.其实也很简单,不过我们需要引入一个库from django.shortcuts import redirect
而redirect()中有一个属性permanent
决定是否为永久重定向,这个属性默认为Flast(非永久重定向)
from django.shortcuts import render, redirect, reverse
def home(request):
return render(request, 'home.html')
def per_red(request):
# reverse为反向解析,在urls.py中的路由中可以设置每个路由的名字,而这里就可以写入设置的名字用来解析
return redirect(reverse('高级视图:首页'), permanent=True)
def red(request):
return redirect(reverse('高级视图:首页'))
HttpRequest对象
Django在接收到http请求之后,会根据http请求携带的参数以及报文信息创建一个WSGIRequest对象,并且作为视图函数第一个参数传给视图函数。也就是我们经常看到的request参数。在这个对象上我们可以找到客户端上传上来的所有信息。这个对象的完整路径是django.core.handlers.wsgi.WSGIRequest。
接下来来详细查看一下request中到底都有哪些属性与方法:
request常用属性
request常用属性 | 作用 |
path | 请求服务器的完整“路径”,但不包含域名和参数。比如http://www.baidu.com/xxx/yyy/,那么path就是/xxx/yyy/。 |
method | 代表当前请求的http方法。比如是GET还是POST。 |
GET | 一个django.http.request.QueryDict对象。操作起来类似于字典。这个属性中包含了所有以?xxx=xxx的方式上传上来的参数。 |
POST | 也是一个django.http.request.QueryDict对象。这个属性中包含了所有以POST方式上传上来的参数。 |
FILES | 也是一个django.http.request.QueryDict对象。这个属性中包含了所有上传的文件。 |
COOKIES | 一个标准的Python字典,包含所有的cookie,键值对都是字符串类型。 |
session | 一个类似于字典的对象。用来操作服务器的session。 |
META | 存储的客户端发送上来的所有header信息。 |
request.META包含数据
request.META包含数据 | 内容 |
CONTENT_LENGTH | 请求的正文的长度(是一个字符串)。 |
CONTENT_TYPE | 请求的正文的MIME类型。 |
HTTP_ACCEPT | 响应可接收的Content-Type。 |
HTTP_ACCEPT_ENCODING | 响应可接收的编码。 |
HTTP_ACCEPT_LANGUAGE | 响应可接收的语言。 |
HTTP_HOST | 客户端发送的HOST值。 |
HTTP_REFERER | 在访问这个页面上一个页面的url。 |
QUERY_STRING | 单个字符串形式的查询字符串(未解析过的形式)。 |
REMOTE_HOST | 客户端的主机名。 |
REQUEST_METHOD | 请求方法。一个字符串类似于GET或者POST。 |
SERVER_NAME | 服务器域名。 |
SERVER_PORT | 服务器端口号,是一个字符串类型。 |
REMOTE_ADDR | 客户端的IP地址。如果服务器使用了nginx做反向代理或者负载均衡,那么这个值返回的是127.0.0.1,这时候可以使用HTTP_X_FORWARDED_FOR来获取,比如下方代码 |
if 'HTTP_X_FORWARDED_FOR' in request.META:
ip = request.META['HTTP_X_FORWARDED_FOR']
else:
ip = request.META['REMOTE_ADDR']
request常用方法
request常用方法 | 作用 |
| 是否是采用https协议。 |
| 是否采用ajax发送的请求。原理就是判断请求头中是否存在X-Requested-With:XMLHttpRequest。 |
| 服务器的域名。如果在访问的时候还有端口号,那么会加上端口号。比如www.baidu.com:9000。 |
| 返回完整的path。如果有查询字符串,还会加上查询字符串。比如/music/bands/?print=True。 |
| 获取请求的完整url。 |
HttpResponseBase对象
Django服务器接收到客户端发送过来的请求后,会将提交上来的这些数据封装成一个HttpRequest对象传给视图函数。那么视图函数在处理完相关的逻辑后,也需要返回一个响应给浏览器。而这个响应,我们必须返回HttpResponseBase或者他的子类的对象。而HttpResponse则是HttpResponseBase用得最多的子类之一,如果我们做的项目为前后端分离,这时候我们还会经常用到JsonResponse这个数据类型用于制作端口,(JsonResponse继承与HttpResponse)
HttpResponse对象常用属性
- content:返回的内容。
return HttpResponse('测试页面')
相当于
返回值 = HttpResponse()
返回值.content = '测试页面'
return 返回值
- status_code:返回的HTTP响应状态码。
- 大多数情况下不建议修改此值
- content_type:返回的数据的MIME类型,默认为text/html。浏览器会根据这个属性,来显示数据。如果是text/html,那么就会解析这个字符串,如果text/plain,那么就会显示一个纯文本。常用的Content-Type如下:
text/html(默认的,html文件)
text/plain(纯文本)
text/css(css文件)
text/javascript(js文件)
multipart/form-data(文件提交)
application/json(json传输)
application/xml(xml文件)
# 比如说纯文本可以写
返回值.content = '寻觅'
返回值 = HttpResponse(content_type='text/plain;charset=utf-8')
# json可以写,这里我引入了 import json 库将数据格式转化为json
json返回值 = HttpResponse(content_type='application/json;charset=utf-8')
json数据 = {
'姓名': '寻觅',
'年龄': 18,
}
json数据 = json.dumps(json数据)
json返回值.content = json数据
4. 自定义响应头:响应头['键'] = '值'
直接使用字典的形式想响应头中添加新的键值对即可
HttpResponse对象常用方法
1.set_cookie:用来设置cookie信息。
2.delete_cookie:用来删除cookie信息。
返回值 = HttpResponse(content_type='text/plain;charset=utf-8')
返回值.content = '<h1>这是测试页面</h1>'
返回值.set_cookie('name', 'xunmi')
# 默认会有一个防止csrf攻击的cookie
返回值.delete_cookie('csrftoken')
return 返回值
3.write:HttpResponse是一个类似于文件的对象,可以用来写入数据到数据体(content)中。
JsonResponse对象使用方法
JsonResponse对象实质上HttpResponse的子类之一,他将传入的对象使用dump方法转换成json字符串,然后返回将json字符串封装成Response对象已Content-Type是application/json格式返回给浏览器。
JsonResponse相当于把三行优化成了一行代码,
json返回值 = HttpResponse(content_type='application/json;charset=utf-8')
json数据 = json.dumps(数据)
json返回值.content = json数据
比如说上述代码使用JsonResponse只需写成 json = JsonResponse(数据)
即可而且不用因为使用json.dumps()
而导入新库
但JsonResponse
默认只讲字典(dict)这种数据类型的格式认为是安全格式,接收传入,如果我们想要传入列表或者元组等数据类型就需要将安全属性关闭safe='False'
json转码
我当前使用的浏览器为火狐,他有个功能会自动将我json格式中的字符转码,如果我们换成一个正常点的浏览器,会发现我们接收到的值并不是中文。这时候可以添加一个属性将我们的值进行转码json_dumps_params={'ensure_ascii':False}