1.使用django框架,在views.py定义了一个方法
def test(request):
str = request.method
return HttpResponse(str)
2.新加url拦截post/,在urls.py中增加代码
from views import test
urlpatterns = [
url(r'^post/$',test)
]
3.使用chrome浏览器postman插件模拟POST方式传递参数,发现报错403,切换使用GET方式即可正常获取接口返回值。问题现象如下
错误原因:
Django要求POST提交时候需要进行CSRF验证
CSRF表示django全局发送post请求均需要字符串验证
功能:防止跨站请求伪造的功能
工作原理:客户端访问服务器端,在服务器端正常返回给客户端数据的时候,额外返回给客户端一段字符串,等到客户端下次访问服务器端时,服务器端会到客户端查找先前返回的字符串,如果找到则继续,找不到就拒绝。
访问流程:客户端-》URL路由系统 - 》 CSRF -》视图函数
4.解决方案
(1)方法一
关闭全局验证,将settings.py里csrf中间件注释掉即可,如下图
(2)方法二
做POST提交时候需要加上csrf_token(就是一个随机码)来完成csrf验证,需要在客户端页面的post表单内添加:{% csrf_token %}。示例如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>POST Params</title>
</head>
<body>
<form method="post" >
{%csrf_token%}//csrf_token用来验证
UserName:<input type="text" name="username"/>
Password:<input type="password" name="password"/>
<input type="submit" value="Submit">
</form>
</body>
</html>
(3)方法三
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
@csrf_exempt
def test(request):
str = request.method
return HttpResponse(str)