美文网首页
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