用户功能设计与实现

提供用户注册处理 提供用户登录处理 提供路由配置

用户注册接口设计 接收用户通过POST方法提交的注册信息,提交的数据是JSON格式数据 检查email是否已存在与数据库表中,如果存在返回错误状态码 整个过程都采用AJAX异步过程,用户提交JSON数据,客户端获取数据后处理,返回JSON

POST /users/ 创建用户
请求体 application/jso{
  "password":"string",
  "name":"string",
  "email":"string"
}
响应
201 创建成功
400 请求数据错误

路由配置

为了避免项目中urls.py条目过多,也为了让自己方便管理路由,采用多级路由

# 新建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')

浏览器输入http://127.0.0.1:8000/users/ 测试一下(这是GET请求),可以看到响应的数据。

测试JSON数据

使用POST方法,提交的数据类型为application/json,json字符串要使用双引号。 这个数据是注册需要用,由客户端提交

{
 "password":"abc",
 "name":"wayne",
 "email":"wayne@magedu.com"
}

可以使用Postman。

Postman获取: 链接:https://pan.baidu.com/s/1N0-thXARzNcA3jTkPHeupw

提取码:89jd

CSRF处理

在Post数据的时候,发现出现了下面的提示

 

原因:默认Django CsrfViewMiddleware中间件会对所有POST方法提交的信息做CSRF校验。 CSRF或XSRF(Cross-site Request Forgery),即跨站请求伪造。它也被称为:one click attack/session riding, 是一种对网站的恶意利用。它伪装成来自受信任用户发起请求,难以防范。 原理

 

CSRF解决

1、关闭CSRF中间件(不推荐)

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',
]

2、表单POST

  • 在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值 现在没有前端代码,为了测试方便,可以选择第一种方法先禁用中间件,测试完成后开启。

JSON数据处理

simplejson比标准库方便好用

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() # 这里返回实例,不是异常类

将上面代码增加邮箱检查,用户信息保存功能,就要用到的Django的模型操作

本次采用Restful实践的设计,采用返回错误状态码+Json错误信息方式

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) # 这里返回实例,不是异常类

邮箱检查

 

posted @ 2023-02-22 17:33  布衣梦蝶1978  阅读(31)  评论(0编辑  收藏  举报