一、request
通过request.method可以查看提交方式
-
get
# url为 http://localhost:8080/user/func_get/?tel=13512121212&psw=123123 # 路由 url(r'^func_get/$',views.func_get,name='func_get') # view.py def func_get(request): res1=request.GET.get('tel') res2=request.GET['psw'] print(res1+'和'+res2) return HttpResponse('user...func_user')
-
post
-
post数据为form-data或者x-www-urlencoded
if request.method=='POST': id=request.POST.get('id') password=request.POST['password'] #当客户端数据为{‘key’:[1,3,6,7]} 时(发送数据需加:traditional:true 防止深度序列化 ), list=request.POST.getlist('do')
-
post数据为json
if request.method=='POST': //注意,在AJAX请求是一定要把json类型转化为字符串 JSON.stringify(data) data=json.loads(request.body) id=data['id'] password=data['password']
-
二、获取Header中的信息
-
request.META.get(“header key”) 用于获取header的信息
-
注意的是header key必须增加前缀HTTP,同时大写,例如你的key为username,那么应该写成:request.META.get(“HTTP_USERNAME”)
-
另外就是当你的header key中带有中横线,那么自动会被转成下划线,例如my-user的写成: request.META.get(“HTTP_MY_USER”)
token=request.META.get('HTTP_TOKEN') print(token)
- CSRF:跨站请求伪造Cross-site request forgery:利用cookie,保存在其他网站存留的cookie,获取cookie中的token,存在localStorage中
settings.py中可能要注释掉:# ‘django.middleware.csrf.CsrfViewMiddleware’, 为什么要这样呢,因为django默认会验证token(每次请求django都会带回来一个token,m名字叫X-CSRFtoken).如果要顺利请求则要取出cookie中的token,然后ojax.setRequestHeader(‘X-CSRFtoken’,token)。- XSS:跨站脚本攻击
嵌入脚本给用户网站- format()解决sql攻击
三、Response
-
HttpResponse(数据,状态码,cookie)
from django.http import HttpResponse,response,JsonResponse #resp=response.HttpResponse('I AM LOGIN') return HttpResponse(json.dumps(content), status=200,charset='utf-8',content_type='application/json')
-
JsonResponse
class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs)
它的第一个参数 data,应该为一个 dict 实例。如果 safe 参数设置为 False,它可以是任何可 JSON 序列化的对象。
encoder,默认为 django.core.serializers.json.DjangoJSONEncoder,用于序列化data。
布尔参数 safe 默认为 True。如果设置为 False,可以传递任何对象进行序列化(否则,只允许 dict 实例)。如果 safe 为 True,而第一个参数传递的不是 dict 对象,将抛出一个TypeError。
json_dumps_params 是一个字典,它是在生成响应时,传给 json.dumps() 的参数。
from django.http import HttpResponse,response,JsonResponse def func_json(request): user=[ {"id":"008","name":"tom"}, {"id":"009","name":"Nancy"}, {"id":"010","name":"John"} ] return JsonResponse(user,safe=False)
-
HttpResponseRedirect
通过 HttpResponseRedirect 和 reverse 实现重定向
from django.http import HttpResponse,response,JsonResponse from django.urls import reverse def search(request,condition): return HttpResponseRedirect('/position/')
通过reverse()对url的name进行解析
return HttpResponseRedirect(reverse('index'))
指定模块
return HttpResponseRedirect(reverse('position:index'))
ps:
# 路由重定向 def redirect_from(request,userid): uurl=reverse('redirect_to',args=(userid+'111',)) return redirect(uurl) def redirect_to(request,id): return HttpResponse('跳转到这里'+id)
四、序列化
Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式。
-
serializers
def func_s(request): from django.core import serializers ret = models.UserInfo.objects.all() data=serializers.serialize("json",ret) return HttpResponse(data)
-
json.dumps时无法处理datetime日期,所以可以通过自定义处理器来做扩展,如:
import json from datetime import date from datetime import datetime class JsonCustomEncoder(json.JSONEncoder): def default(self, field): if isinstance(field, datetime): return o.strftime('%Y-%m-%d %H:%M:%S') elif isinstance(field, date): return o.strftime('%Y-%m-%d') else: return json.JSONEncoder.default(self, field) def func_json_time(request): res=models.UserInfo.objects.all() res_d=json.dumps(res,cls=JsonCustomEncoder) print(res_d)