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 测试