美文网首页
57.5-Django之邮箱验证和日志配置

57.5-Django之邮箱验证和日志配置

作者: BeautifulSoulpy | 来源:发表于2020-08-07 21:31 被阅读0次

学会收藏,学会遗忘,更要学会坚强。人生真是有趣,如果没有了这些挫折和困难,那这样的人生还有什么意思!
我为什么要那么努力,一眼看的到头的生活? 是因为充满了对自由世界的渴望,追求自己想要的生活!


总结:
1.由于采用前后端分离,所以我们只关注数据:将用户的请求里面的数据提取到,将Json数据返回回去
2.注意一点,Django的异常类继承自HttpResponse类,所以不能raise,只能return

CSRF处理

默认Django会对所有POST信息做CSRF校验。

CSRF(Cross-site request forgery)跨站请求伪造,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。

CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。
CSRF攻击往往难以防范,具有非常大的危险性。

Django提供的CSR F机制
Django第一次响应来自某个客户端的请求时, 会在服务器端随机生成一个token, 把这个token放在
cookie里。然后浏览器端每次POST请求带上这个token, Django的中间件验证, 这样就能避免被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提交时,需要发给服务器一个csrf_token
    模板中的表单Form中增加{% csrf_token %},它返回到了浏览器端就会为cookie增加 csrftoken 字段,
    还会在表单中增加一个名为csrfmiddlewaretoken隐藏控件 <input type='hidden'
    name='csrfmiddlewaretoken'
    value='jZTxU0v5mPoLvugcfLbS1B6vT8COYrKuxMzodWv8oNAr3a4ouWlb5AaYG2tQi3dD' />
  3. 如果使用A JAX进行POST,需要在请求Header中增加X-CSRFTOKEN,其值来自cookie中获取的csrftoken值,为了测试方便,可以选择第一种方法先禁用中间件,测试完成后开启。
注册代码 V1
from django.shortcuts import render
from django.http import JsonResponse,HttpRequest,HttpResponseBadRequest
import simplejson
from .models import User

# register
def reg(request:HttpRequest):
    print(request.GET)
    print(request.POST)
    print("------------------")
    print(request.body)

    try:   # 有任何异常,都返回400,如果保存数据出错,则向外抛出异常;
        payload = simplejson.loads(request.body)
        print(type(payload),payload)
        email = payload['email']
        name = payload['name']
        password = payload['password']
        print(email,name,password)

        user = User()
        user.email = email
        user.name = name
        user.password = password

        try:
            user.save()
            return JsonResponse({'user_id':user.id})  #正常,返回Json数据;
        except Exception as e:
            raise

    except Exception as e:    #有任何异常 抛出异常;
        print(e)
        return HttpResponseBadRequest('参数错误')   

邮箱检查
邮箱检查需要查user表,需要使用User类的filter方法。
email=email,前面是字段名email,后面是email变量。查询后返回结果,如果查询有结果,则说明该email已经存在,邮箱已经注册,返回400到前端。

用户信息存储
创建User类实例,属性存储数据,最后调用save方法。Django默认是在save()、delete()的时候事务自动提交
如果提交抛出任何错误,则捕获此异常做相应处理。

异常处理

  • 出现获取输入框提交信息异常,就返回异常
  • 查询邮箱存在,返回异常
  • save()方法保存数据,有异常,则向外抛出,捕获返回异常
  • 注意一点,Django的异常类继承自HttpResponse类,所以不能raise,只能return
  • 前端通过状态码判断是否成功

下面我们说说模型类的操作;

from django.shortcuts import render

# Create your views here.

from django.http import JsonResponse,HttpRequest,HttpResponseBadRequest
import simplejson
from .models import User

# register
def reg(request:HttpRequest):
    print(request.GET)
    print(request.POST)
    print("------------------")
    print(request.body)

    try:
        payload = simplejson.loads(request.body)
        print(type(payload),payload)
        email = payload['email']
        query = User.objects.filter(email=email)
        print(type(query))
        if query.first():  # email 如果存在,则return error;
            print('============================')
            return HttpResponseBadRequest('用户名已存在')
        # print(query.query)

        name = payload['name']
        password = payload['password']
        print(email,name,password)

        user = User()
        user.email = email
        user.name = name
        user.password = password

        try:
            user.save()
            return JsonResponse({'user_id':user.id})
        except Exception as e:
            raise

    except Exception as e:
        print(e)
        return HttpResponseBadRequest('参数错误')
Django日志

Django的日志配置在settings.py中。
必须DEBUG=True,否则logger的级别够也不打印日志。

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'level': 'DEBUG',
        },
    },
}

相关文章

网友评论

      本文标题:57.5-Django之邮箱验证和日志配置

      本文链接:https://www.haomeiwen.com/subject/ailqdktx.html