JsonResponse类回顾:
- 作为
HttpResponseBase
中重要的子类,content_type
类型为application/json
(json传输) - 用来对象dump成json字符串,然后返回将json字符串封装成Response对象返回给浏览器。
- 代码demo:
from django.http import JsonResponse
def index(request):
return JsonResponse({"telephone":"123456789","age":18})
- 默认情况下JsonResponse只能对字典进行dump,如果想要对非字典的数据进行dump,那么需要给JsonResponse传递一个safe=False参数。代码demo:
from django.http import JsonResponse
def index(request):
persons = ['张三','李四','王五']
return HttpResponse(persons)
以上代码会报错,应该在使用HttpResponse的时候,传入一个safe=False参数,返回值应为
return HttpResponse(persons,safe=False)
一个用户管理系统视图设计回传参数
- 封装JsonResponse
- 和前端约定状态码
200
为正确
,400
为参数错误
,401
为户授权信息错误
,405
为方法请求错误
,500
为服务器错误
此处默认返回消息为空,数据为空,状态码为正确(从测试的角度来讲,初始化状态码为正确可能会导致异常情况的遗漏判定,待定) - 初设
code
,message
和data
,考虑到可能会传入token
值,遂添加kwargs参数(需为dict
类型) - 考虑到多种
code
返回值,进一步封装code
值为函数,便于函数书写和代码审阅,message
和data
值随机应变
#encoding: utf-8
from django.http import JsonResponse
class HttpCode(object):
ok = 200
paramserror = 400
unauth = 401
methoderror = 405
servererror = 500
# {"code":400,"message":"","data":{}}
def result(code=HttpCode.ok,message="",data=None,kwargs=None):
json_dict = {"code":code,"message":message,"data":data}
if kwargs and isinstance(kwargs,dict) and kwargs.keys():
json_dict.update(kwargs)
return JsonResponse(json_dict)
def ok():
return result()
def params_error(message="",data=None):
return result(code=HttpCode.paramserror,message=message,data=data)
def unauth(message="",data=None):
return result(code=HttpCode.unauth,message=message,data=data)
def method_error(message='',data=None):
return result(code=HttpCode.methoderror,message=message,data=data)
def server_error(message='',data=None):
return result(code=HttpCode.servererror,message=message,data=data)
封装后的视图
#encoding: utf-8
from django.contrib.auth import login,logout,authenticate
from django.views.decorators.http import require_POST
from .forms import LoginForm,RegisterForm
from utils import restful
from django.shortcuts import redirect,reverse
from utils.captcha.xfzcaptcha import Captcha
from io import BytesIO
from django.http import HttpResponse
from django.core.cache import cache
from django.contrib.auth import get_user_model
from utils import smssender
User = get_user_model()
@require_POST
def login_view(request):
form = LoginForm(request.POST)
if form.is_valid():
telephone = form.cleaned_data.get('telephone')
password = form.cleaned_data.get('password')
remember = form.cleaned_data.get('remember')
user = authenticate(request,username=telephone,password=password)
if user:
if user.is_active:
login(request,user)
if remember:
request.session.set_expiry(None)
else:
request.session.set_expiry(0)
return restful.ok()
else:
return restful.unauth(message="您的账号已经被冻结了!")
else:
return restful.params_error(message="手机号或者密码错误!")
else:
errors = form.get_errors()
# {"password":['密码最大长度不能超过20为!','xxx'],"telephone":['xx','x']}
return restful.params_error(message=errors)
def logout_view(request):
logout(request)
return redirect(reverse('index'))
@require_POST
def register(request):
form = RegisterForm(request.POST)
if form.is_valid():
telephone = form.cleaned_data.get('telephone')
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password1')
user = User.objects.create_user(telephone=telephone,username=username,password=password)
login(request,user)
return restful.ok()
else:
return restful.params_error(message=form.get_errors())
def img_captcha(request):
text,image = Captcha.gene_code()
# BytesIO:相当于一个管道,用来存储图片的流数据
out = BytesIO()
# 调用image的save方法,将这个image对象保存到BytesIO中
image.save(out,'png')
# 将BytesIO的文件指针移动到最开始的位置
out.seek(0)
response = HttpResponse(content_type='image/png')
# 从BytesIO的管道中,读取出图片数据,保存到response对象上
response.write(out.read())
response['Content-length'] = out.tell()
# 12Df:12Df.lower()
cache.set(text.lower(),text.lower(),5*60)
return response
def sms_captcha(request):
# /sms_captcha/?telephone=xxx
telephone = request.GET.get('telephone')
code = Captcha.gene_text()
cache.set(telephone,code,5*60)
#短信验证码测试,验证码打印在控制台,后期删除
print('短信验证码:',code)
# result = aliyunsms.send_sms(telephone,code)
result = smssender.send(telephone,code)
if result:
return restful.ok()
else:
return result.params_error(message="短信验证码发送失败!")
def cache_test(request):
cache.set('username','zhiliao',60)
result = cache.get('username')
return HttpResponse('success')