Django框架之中间件与Auth

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 测试
相关文章
相关标签/搜索