Django框架之中间件与Auth模块
一 cbv加装饰器
 -先导入:from django.utils.decorators import method_decorator
 -1 可以在方法上加装饰器:
  @method_decorator(login_auth)
 -2 可以在类上加
  @method_decorator(login_auth,name='post')
  @method_decorator(login_auth,name='get')
 -3 可以加在dishpatch方法上
  @method_decorator(login_auth)
  一旦加在dishpatch,说明,所有方法都加了装饰器
   
二 中间件
 -中间件是什么?请求和响应之间的一道屏障
 -中间件作用:控制请求和响应
 -django中内置几个中间件
 -自定义中间件
  -from django.utils.deprecation import MiddlewareMixin   先导入
  -定义一个类,随意命名,继承MiddlewareMixin
  class MyMiddleware1(MiddlewareMixin):
   def process_request(self, request):
    print('MyMiddleware---->1---->process_request')
    # 返回HttpRspons对象,直接返回,走自己的process_response
    # 返回None的时候,继续往下走
    # return HttpResponse('i am middle--1')
    return None
   def process_response(self, request, response):
    print('MyMiddleware--->1---->process_response')
    return response
  -使用:在setting中注册,是有顺序的,
   MIDDLEWARE = [
   'app01.mymiddelware.MyMiddleware1',]  
 -中间件执行顺序:
  -process_request,从上往下执行
   -如果retrun HttpResponse的对象,直接返回了
   -如果retrun None ,继续往下走
  -process_response,从下往上执行
   -必须要retrun Httpresponse的对象
 -中间件的方法:()
  -process_request
   -请求来的时候,会响应它
  -process_response
   -响应回去的时候,会走它
  -process_view(了解)
   - request, callback(视图函数), callback_args(无名分组的参数), callback_kwargs(有名分组的参数)
   -执行顺序,详见图
  -def process_exception(self, request, exception)(了解)
  -def process_template_response(self, request, response):(了解)
三 csrf:跨站请求伪造 
 比如:转账请求:transfer?to=lqz&count=1000
 -是什么?攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的
 -如何防范:
  -通过refer
  -加一个随机字符串校验(加载请求的路径里,加载请求体中)
  -在请求头中加字符串校验
 django中的应用:
  -中间件不注释掉
  -以后再发post请求,携带那个随机字符串
   -form表单形式:
    <form action="" method="post">
     {% csrf_token %}
     <input type="text" name="name">
     <input type="text" name="pwd">
     <input type="submit" value="提交">
    </form>
   -ajax提交
   data: {
    'name': $('[name="name"]').val(),
    'pwd': $('[name="pwd"]').val(),
    //'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val()
    'csrfmiddlewaretoken': '{{ csrf_token }}'
    },
 csrf:局部禁用,局部使用
  -用装饰器:from django.views.decorators.csrf import csrf_exempt,csrf_protect
  -fbv--->直接加载fbv上就行了
   -局部禁用,全局得使用
    @csrf_exempt
    def csrf_disable(request):
      print(request.POST)
      return HttpResponse('ok')
   -局部使用,全局得禁用
    @csrf_protect
    def csrf_disable(request):
      print(request.POST)
      return HttpResponse('ok')
  -cbv-->只能加在dispatch方法或者类上面
   -局部禁用,全局得使用
   -局部使用,全局得禁用
   from django.views import View
   from django.utils.decorators import method_decorator
   @method_decorator(csrf_protect,name='dispatch')
   class Csrf_disable(View):
    # @method_decorator(csrf_protect)
    def dispatch(self, request, *args, **kwargs):
     ret=super().dispatch(request, *args, **kwargs)
     return ret
    def get(self,request):
     return HttpResponse('ok')
    def post(self,request):
     return HttpResponse('post---ok')
四 auth组件
 -auth是什么?
 -django内置的用户认证系统,可以快速的实现,登录,注销,修改密码....
 -怎么用?
  -(1)先创建超级用户:
   -python3 manage.py createsuperuser
   -输入用户名,邮箱(可以不输入),密码,敲回车,这样就创建出一个超级用户
   -也就是在auth_user这个表中插入了一条数据(密码是加密的,所以我不能手动插入)
  -(2)验证用户:
   -from django.contrib import auth
   -user = auth.authenticate(request, username=name, password=pwd)
   -相当于在查询:user=models.User.objects.filter(name=name,pwd=pwd).first()
   -如果校验通过,会返回一个user对象,通过判断user对象,校验是否验证成功
  -(3)登录
   -auth.login(request,user)
   -其实就是在session中写了一条数据
  -(4)一旦登录成功,调了这个函数login(request,user)
   -以后再视图类,函数中的request对象中,就有一个user对象,就是当前登录的用户对象
   -如果没有登录,request.user=AnonymousUser,匿名用户
  -(5)注销
   -auth.logout(request)
   -内部:调用了request.session.flush(),删除了登录状态
  -(6)登录认证装饰器
   -from django.contrib.auth.decorators import login_required
   -@login_required(redirect_field_name='eee',login_url='/login/')
   -redirect_field_name:修改?后面的key值,
   -login_url:如果没有登录,跳转到的页面
    -可以局部配置
    -可以全局配置(在setting中)
     # 全局的配置,如果没有登录,跳到这个路由
     LOGIN_URL='/login/'
  -(7)创建用户:
   -from django.contrib.auth.models import User    
   - 创建超级用户和普通用户
    # 不能用create
    # user=User.objects.create(username=name,password=pwd)
    # 创建超级用户
    # user=User.objects.create_superuser(username=name,password=pwd)
    # 创建普通用户
    user=User.objects.create_user(username=name,password=pwd)
  -(8)校验密码
   -request.user.check_password(pwd)
   -先拿到用户(可以是登录用户,可以现查)
  -(9)修改密码:
   -user.set_password(pwd)
   -user.save()
   -注意:一定要调用save(),否则是不保存的
  -(10)is_authenticated()
   -如果通过验证,是true反之false
  -(11)其他方法(了解):
   -is_active:禁止登录网站(用户还存在,封号)
   -is_staff:是否对网站有管理权限(能不能登录admin)
   
  -(12)删除用户
   -orm删除
 如果想在认证组件上加手机号等其他字段:如何处理
  -(1) 定义一个表模型,跟User一对一管理
   class UserDetail(models.Model):
    phone=models.CharField(max_length=32)
    # 一对一跟auth_user表做关联
    # 如果是从外部引入的表模型,是不能加引号的
    # 如果加引号,只是在当前model找
    user=models.OneToOneField(to=User)
  -(2)定义一个表模型,继承(AbstractUser)
   -from django.contrib.auth.models import AbstractUser
    class UserInfo(AbstractUser):
    # username,password...都有
    phone=models.CharField(max_length=32)
    sex=models.BooleanField()
   -在setting中配置:
    AUTH_USER_MODEL ='app01.UserInfo'
   -做数据库迁移,以后就没有auth_user这个表了,以后认证组件用的表就是UserInfo
   -原来auth中的其他操作:
    -authentication
    -login
    -logout
    -set_password
    ....
    ---一样用,完全一样
   -不一样的地方:
    如果之前用到User这个表模型的地方,都换成UserInfo
     
博客项目:
 1 需求分析
  -首页(显示文章)
  -文章详情
  -点赞,点踩
  -文章评论
   -字评论
   -评论的展示
  -登录功能(图片验证码)
  -注册功能(基于form验证,ajax)
  -个人站点(不同人不同样式,文章过滤)
  -后台管理:
   -文章展示
  -新增文章
   -富文本编辑器
  
  
  
 2 设计程序(框架,数据库设计)
  -UserInfo----用户表
  -blog-----个人站点表
  -Article----文章表
  -commit----评论表
  -upanddown----点赞点踩表
  -category---文章分类表
  -tag---文章标签表
  -表关系
   -userInfo跟blog ---- 一对一
   -article跟blog-----一对多
   -article跟category----(一篇文章只能由一个分类,一个分类下有多篇文章)一对多
   -article跟tag----(一个标签可以对应多篇文章,一篇文章可以有多个标签)多对多
   -commit跟Article----  一对多
   -upanddown跟Article----  一对多
   -user跟commit---一对多
   -user跟upanddown---一对多
   -category跟blog----一对多
   -tag跟blog----一对多
   
 3 分任务开发(git)
 4 测试
posted on 2018-11-26 16:41  吴之家  阅读(107)  评论(0编辑  收藏  举报