zoukankan      html  css  js  c++  java
  • Django框架9

    Django框架9


    1.django请求生命周期流程图

    2.django中间件

    它是django的门户

    只要是全局相关的功能,都应该考虑是用django中间件来帮你完成

    ​ 全局用户身份校验

    ​ 全局用户访问频率校验

    ​ 用户访问的黑名单

    ​ 用户访问的白名单

    django默认的七个中间件

    		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',
    	]
    

    django支持用户自定义中间件

    class SessionMiddleware(MiddleWareMixin):
        def process_request(self, request):
        
        def process_response(self, request, response):
            
    class CsrfViewMiddleware(MiddlewareMixin):
        def process_request(self, request):
    	
        def process_view(self, request, callback, callback_args, callback_kwags):
        
        def process_respose(self, request, response):
            
               
            
    class AuthentiactionMiddleware(MiddlewareMixin):
        def process_request(self, request):
        
        
    

    django运行用户自定义中间件并暴露给用户五个可以自定义的方法

    ​ 掌握:
    ​ process_request:

    ​ 请求来的时候会按照配置文件中注册的中间件从上往下的顺序依次执行每一个中间件里面的process_request方法,如果没有直接跳过执行下一个

    ​ 同级别返回 并不会全部执行process_response

    ​ process_response:

    ​ 响应走的时候会按照配置文件中注册的中间件从下往上的顺序依次执行每一个中间件里面的process_response方法,该方法必须要有两个形参,并且需要给形参response返回,如果你内部自己返回了HttPResponse对象,会将返回给用户浏览器的内容替换成你自己的

    了解:
    process_view

    ​ 路由匹配成功执行视图函数之前触发

    ​ process_template_response

    ​ 视图函数返回的对象中必须要有render属性对应的render方法

    def index(request):
        def render():
            return HttpResponse('你好啊')
        obj = HttpResopnse("index")
        obj.render = render
        return obj
    

    ​ process_exception

    ​ 当视图函数报错的时候自动触发

    3.csrf跨站请求伪造

    ​ 钓鱼网站

    ​ 本质搭建一个跟正常网站一模一样的页面,用户在该页面上完成转账功能,转账的请求确实也是朝着正常网站的服务端提交,唯一不同在于收款账户人不同

    ​ form表单如何通过crsf校验

    ​ 你只需要在你的form表单内写一个

    ​ {% csrf_token %}

    ajax如何通过csrf校验

    第一种方式 自己手动获取
    data:{'username':'jason', 'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()}
    第二种方式	利用模板语法
    data:{'username':'jason','crsfmiddlewaretoken':'{{ csrf_token }}'}
    第三种	通用方式 引入外部js文件	官网提供的方式
    <% load static %>
    <script src="{% static 'myset.js' %}"></script>
    data: {'username': 'jason'}
    

    csrf相关装饰器

    ​ 当我们网站整体都校验csrf的时候,让某几个视图函数不校验

    ​ 当我们网站整体都不校验crsf的时候, 让某几个视图函数校验

    		from django.views.decorators.csrf import csrf_exempt, csrf_protect
    		from django.views import View9
    		from django.utils.decorators import method_decorator
    
    		# @method_decorator(csrf_protect,name='post')  # 第二种指名道姓的给类中某个方法装
    		# @method_decorator(csrf_exempt,name='post')  # csrf_exempt 第二种方式不行
    		@method_decorator(csrf_exempt,name='dispatch')  # 可以!!!
    		class MyHome(View):  # APIView
    			# @method_decorator(csrf_protect)  # 第三种 类中所有的方法都装
    			# @method_decorator(csrf_exempt)  # csrf_exempt 第三种方式可以
    			def dispatch(self, request, *args, **kwargs):
    				return super().dispatch(request,*args,**kwargs)
    
    			def get(self,request):
    				return HttpResponse('get')
    			# @method_decorator(csrf_protect)  # 第一种方式
    			# @method_decorator(csrf_exempt)  # csrf_exempt 第一种方式不行
    			def post(self,request):
    				return HttpResponse('post')
    

    给cbv加装饰器 推荐使用模板method_decorator

    我们自己写的装饰器和csrf_protect用法一致

    唯独csrf_exempt是一个特例 只能给dispatch方法装

    4.auth认证模块

    ​ django用户相关的自带的功能模块 auth_user表

    ​ 如何创建超级用户:

    ​ createsupperuser

    ​ 模块导入

    ​ from django.contrib mport auth

    ​ from django.contrib.auth.models import User

    auth方法大全

    ​ 1.创建用户

    User.objects.create()	# 密码都是明文
    User.objects.createuser()	# 创建普通用户
    User.objects.createsuperuser()	# 创建超级用户,邮箱要给数据
    

    ​ 2.校验用户名和密码是否正确

    auth.authenticate(username=username,password=password) #密码和用户名两个一个都不能少
    # 该方法当用户名和密码正确的时候返回用户对象 不正确返回none
    

    ​ 3.保存用户登录状态

    auth.login(request, user_obj)
    # 这句执行完以后 request.user获取当前登录的用户对象
    
    

    ​ 4.如何判断当前用户是否登录 以及如何获取当前登录用户对象

    request.user.is_authenticcated()	# 判断是否登录
    request.user	# 登录用户对象
    

    ​ 5.校验用户是否登录

    form django.contrib.auth.deorators import login_required
    # 局部配置
    @login_required(login_url='/login/')
    def xxx(request):
        return HttpResponse('xxx页面')
    
    # 全局配置
    配置文件中写以下代码
    LOGIN_URL = '/login/'
    @login_required
    def xxx(request):
        return HttpResponse('xxx页面')
    
    如果两个都设置了,那么优先执行局部配置
    
    

    ​ 6.修改密码

    request.user.check_password(old_password)	# 校验原密码是否正确
    request.User.set_password(new_pssword)
    request.user.save()		# 一定要保存
    

    ​ 7.注销功能

    ​ auth.logout(request)

    如何扩展auth_user表

    1.利用一对一表关系

    2.利用类的继承

    			# 1 类的继承
    			from django.contrib.auth.models import User,AbstractUser
    			# Create your models here.
    			class Userinfo(AbstractUser):
    				phone = models.BigIntegerField()
    				avatar = models.FileField()
    				# 扩展的字段 尽量不要与原先表中的字段冲突
    		
    			# 2 配置文件
    			AUTH_USER_MODEL = '应用名.表名'
    			"""
    			django就会将userinfo表来替换auth_user表
    			并且之前auth模块所有的功能不变 参照的也是userinfo表
    			"""
    

    5.BBS表设计

    用户表	
    				继承auth_user表
    				phone
    				avatar
    				register_time
    			
    			个人站点表
    				站点名称
    				
    				站点标题
    				
    				站点样式
    			
    			文章分类表
    				分类名
    			
    			文章标签表
    				标签名
    			
    			文章表
    				文章标题
    				文章摘要
    				文章详情
    				创建日期
    				
    			
    			点赞点踩表
    				user          一对多用户
    				article       一对多文章
    				is_up         布尔值字段
    				
    			
    			文章评论表
    				user          一对多用户
    				article       一对多文章
    				content       普通字段
    				create_time   评论日期
    				
    				parent  ForeginKey(to='文章评论表')
    				parent  ForeginKey(to='self')
    		
    		
    		根评论子评论
    
  • 相关阅读:
    .NET平台下不借助Office实现Word、Powerpoint等文件的解析
    C#智能视频监控软件
    关于“线程”与“阻塞”
    asp.net 页面静态化
    纸上谈兵: 数学归纳法, 递归, 栈
    OSGI:C#如何实现简单的OSGI
    windows service (服务)创建流程
    轻松Scrum之旅——Sprint1:新手上路
    发布本人所有博客文章中涉及的代码与工具(大部分是C++和Java)
    多个常见代码设计缺陷
  • 原文地址:https://www.cnblogs.com/godlover/p/12193732.html
Copyright © 2011-2022 走看看