二、request对象常用属性:
Attribute | Description |
---|---|
path |
请求页面的全路径,不包括域名端口参数。例如:
|
method |
一个全大写的字符串,表示请求中使用的HTTP方法,常用值:
,
,
,
等。以下三种为
请求:
|
user |
|
GET |
类似字典的
对象,包含
请求的所有参数 |
POST |
类似字典的
对象,包含
请求的所有键值对参数(表单post提交的参数) |
body | 获取原始的请求体数据,获取到的数据为bytes类型 |
META |
字典类型,封装了请求头headers中的数据 –
– 客户端的IP地址 –
— 一个字符串,例如”GET” 或”POST –
– 请求的正文的MIME 类型
注意:对于用户添加到请求头中的键值,Django会给键加上前缀 |
COOKIES |
一个标准的
字典,包含所有的
, 键和值都是字符串 |
session |
可读可写的类似字典的对象:
。
提供了
模块,默认就会开启用来保存
数据 |
HttpResponse对象 响应对象主要有三种形式: HttpResponse() render() redirect()
HttpResponse()括号内直接跟一个具体的字符串作为响应体,比较直接很简单,所以这里主要介绍后面两种形式。 render(request, template_name, [context])
def index(request):
timmer = datetime.datetime.now()
li = [1, 2, 3, 4, 5, 6]
context = {"ls": {"age": [1, 2, 3, 4, 5], 'like': 'woman'}, 'ss': {"age": 15, 'like': 'woman'}}
#把所有局部变量全都传过去
return render(request, 'index.html', locals())
结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。 参数: request: 用于生成响应的请求对象。 template_name:要使用的模板的完整名称,可选的参数 context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。 render方法就是将一个模板页面中的模板语法进行渲染,最终渲染成一个html页面作为响应体。
redirect() 传递要重定向的一个硬编码的URL def my_view(request): return redirect('/some/url/') 也可以是一个完整的URL: def my_view(request): return redirect('http://example.com/')
JsonResponse对象
- 帮助我们将数据转换为json字符串,再返回给客户端
-
会设置响应头
Content-Type
为
application/json
from django.http import JsonResponse def resp(request): return JsonResponse({'city': 'beijing', 'subject': 'python'})
-
当包含的内容中包含中文时,会返回该中文对应的编码,例如:
def resp(request): # 最终看到的效果是: {"name": "\u5f20\u4e09"} response = JsonResponse({"name":"张三"}) return response
解决:
JsonResponse(data, json_dumps_params={'ensure_ascii':False})
-
JsonResponse可以接收非字典数据,需要指定
safe=False
当发送ajax请求时候,发送的内容为json类型,原生Django不能自动解析json数据手动解析
$("#demo").click(function () { $.ajax( { url: '/ajax/', contentType: 'application/json', method: 'post', data: JSON.stringify({ "name": "ls", "age": 12 }), success: function (response) { alert(response['name']) $('.show').html(response['name']) } } ) })
python代码
def ajax(request): if request.method == "GET": return render(request, 'ajax.html') else: json_dict = json.loads(request.body.decode('utf8')) print(json_dict) return JsonResponse({'name': 'l1111'})
接受文件的时候
file = request.FILES.get('files') with open(file.name, 'wb') as a: for i in file: a.write(i) return HttpResponse('ok')
scrf,跨域请求伪造问题
1.表单中添加
{% csrf_token %} 为input 标签 type = hidden
<form action="/demo"> 用户名:<input type="text"> {% csrf_token %} </form>
2.ajax添加
在ajax中带着这个值,csrfmiddlewaretoken:'{{ csrf_token }}
function myajax(){ var temp = $('#ajax_id').val(); $.ajax({ url:'/ajax_app/test', type:'POST', data:{data1:temp,csrfmiddlewaretoken:'{{ csrf_token }}'}, success:function (arg) { var obj = jQuery.parseJSON(arg); $('#ajax_id').val(obj.msg); }, error:function () { alert("failed"); } }); }
第三种csrf解决方案
<script src="{% static 'js/jquery.cookie.js' %}"></script>
$.ajax({ headers:{"X-CSRFToken":$.cookie('csrftoken')}, })
转载于:https://www.cnblogs.com/ls1997/p/10943910.html