用户功能设计与实现
用户注册接口设计 接收用户通过POST方法提交的注册信息,提交的数据是JSON格式数据 检查email是否已存在与数据库表中,如果存在返回错误状态码
POST /users/ 创建用户 请求体 application/jso{ "password":"string", "name":"string", "email":"string" } 响应 201 创建成功 400 请求数据错误
# 新建user/urls.py from django.conf.urls import url from .views import reg urlpatterns = [ url(r'^$', reg), # /users/ ]
# user/views.py from django.http import HttpRequest, HttpResponse def reg(request:HttpRequest): return HttpResponse('user.reg')
测试JSON数据
使用POST方法,提交的数据类型为application/json,json字符串要使用双引号。
{ "password":"abc", "name":"wayne", "email":"wayne@magedu.com" }
在Post数据的时候,发现出现了下面的提示
原因:默认Django CsrfViewMiddleware中间件会对所有POST方法提交的信息做CSRF校验。 CSRF或XSRF(Cross-site Request Forgery),即跨站请求伪造。它也被称为:one click attack/session riding, 是一种对网站的恶意利用。它伪装成来自受信任用户发起请求,难以防范。
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', #'django.middleware.csrf.CsrfViewMiddleware',# 注释掉 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
-
在POST提交时,需要发给服务器一个csrf_token
-
模板中的表单Form中增加(% csrf_token%),它返回了浏览器端就会为cookie增加csrftoken字段,还会在表单中增加一个名为csrfmiddlewaretoken隐藏控件 /</input type=‘hidden’ name=‘csrfmiddlewaretoken’ value=‘jZTxU0v5mPoLvugcfLbS1B6vT8COYrKuxMzodWv8oNAr3a4ouWlb5AaYG2tQi3dD’ />
-
POST提交表单数据时,需要将csrfmiddlewaretoken一并提交,Cookie中的csrf_token也一并会提交,最终在中间件中比较,相符通过,不相符就返回403提示
3.Ajax POST
如果使用A JAX进行POST,需要在每一次请求Header中增加自定义字段X-CSRFTOKEN,其值来自cookie中获取的csrftoken值
pip install simplejson
浏览器端提交的数据放在了请求对象的body中,需要使用simplejson解析,解析的方式同json模块,但是simplejson更方便。
错误处理
Django中有很多异常类,定义在django.http下,这些类都继承自HttpResponse.
import simplejson from django.http import HttpResponse,HttpRequest,HttpResponseBadRequest,JsonResponse def reg(request:HttpRequest): print(request.POST) print(request.GET) try: payload=simplejson.loads(request.body) email=payload['email'] name=payload['name'] password=payload['password'] print(email,name,password) return JsonResponse({}) #如果正常,返回json数据 except Exception as e: # 有任何异常,都返回 return HttpResponseBadRequest() # 这里返回实例,不是异常类
import simplejson # Create your views here. from django.http import HttpResponse,HttpRequest,HttpResponseBadRequest,JsonResponse def reg(request:HttpRequest): print(request.POST) print(request.GET) try: payload=simplejson.loads(request.body) email=payload['email'] name=payload['name'] password=payload['password'] print(email,name,password) return JsonResponse({},status=201) #如果正常,返回json数据 except Exception as e: # 有任何异常,都返回 return HttpResponseBadRequest({'error':'用户名或密码错误'},status=400) # 这里返回实例,不是异常类
注册代码v1
from django.shortcuts import render import simplejson from .models import User # Create your views here. from django.http import HttpResponse,HttpRequest,HttpResponseBadRequest,JsonResponse def reg(request:HttpRequest): print(request.POST) print(request.GET) try: payload=simplejson.loads(request.body) email=payload['email'] query = User.objects.filter(email=email) print(query) print(query.query)# 查看SQL语句 if query.first(): return JsonResponse({'error':'用户已存在'},status=400) name=payload['name'] password=payload['password'] print(email,name,password) user=User() user.email=email user.name=name user.password=password user.save() return JsonResponse({},status=201) #如果正常,返回json数据 except Exception as e: # 有任何异常,都返回 return HttpResponseBadRequest({'error':'用户名或密码错误'},status=400) # 这里返回实例,不是异常类
邮箱检查