zoukankan      html  css  js  c++  java
  • Django Web应用开发实战第十一章

    一、会话控制

    Django内置的会话控制简称为session,可以为用户提供基础的数据存储。
    数据主要存储在服务器上,并且网站上的任意站点都能使用会话数据。
    当用户第一次访问网站时,网站的服务器将自动创建一个session对象,该session对象相当于该用户在网站的一个身份凭证,而且session对象中的数据不会丢失,只有session过期或被清理时,服务器才将session中存储的数据清空并终止该session。
    
    session & cookie
    - session存储在服务器端,cookie存储在客户端,所以session的安全性比cookie高
    - 当获取某用户session数据时,首先从用户传递的cookie里获取sessionid,然后根据sessionid在网站服务器找到相应的session
    - session存放在服务器的内存中,session的数据不断增加会造成服务器的负担,因此存放在session中的数据不能过于庞大
    
    session数据默认存储在数据表django_session中,也可以设置保存方式:
    # 数据库保存方式,可配置
    # 默认保存方式
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'
    
    # 以文件形式保存
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'
    # 使用文件保存可以设置文件保存路径
    SESSION_FILE_PATH = '/MyDjango'
    
    # 以缓存形式保存
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
    # 设置缓存名
    SESSION_CACHE_ALIAS = 'default'
    
    # 以数据库加缓存形式保存
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
    
    # 以cookie形式保存
    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
    
    # 其他属性配置
    SESSION_COOKIE_NAME = 'sessionid'  # 浏览器的Cookie以键值对的形式保存,该设置session_key的key
    
    SESSION_COOKIE_PATH = '/'  # 设置cookie生效路径,默认值为'/',即127.0.0.1:8000
    
    SESSION_COOKIE_DOMAIN = None  # 设置浏览器cookie生效域名
    
    SESSSION_COOKIE_SECURE = False  # 设置传输方式,False表示使用HTTP,否则HTTPS
    
    SESSION_COOKIE_HTTPONLY = True  # 是否只能使用HTTP
    
    SESSION_COOKIE_AGE = 1209600  # 设置cookie有效期,默认两周
    
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得cookie过期,默认False
    
    SESSION_SAVE_EVERY_REQUEST = False  # 是否每次发送后保存cookie,默认为False
    
    
    # session读写
    # 获取存储在session的数据,直接取key不存在会报错
    request.session['k1']
    request.session.get('k1', '')
    request.session.setdefault('k1', '')
    
    # 设置session数据
    request.session['k1'] = 123
    
    # 删除session中的数据
    del request.session['k1']
    
    # 删除整个session
    request.session.clear()
    
    # 获取session的keys
    request.session.keys()
    
    # 获取session的values
    request.session.values()
    
    # 获取session的session_key,即数据表django_session中的session_key字段
    request.session.session_key

    二、缓存机制

    缓存类型:
    - 全站缓存:一般情况下不采用
    - 视图缓存:当用户发送请求的视图已生成缓存数据则以缓存数据作为响应内容
    - 路由缓存:作用与缓存视图相同,两者区别在于两个路由同指一个视图,路由缓存会判断路由地址是否已生成缓存而决定是否执行视图函数
    - 模板缓存:看减少模板引擎解析生成HTML的时间
    
    【全站缓存】
    配置中间件
    MIDDLEWARE = [
        # 配置全站缓存
        'django.middleware.cache.UpdateCacheMiddleware',
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        # 添加中间件LocaleMiddleware
        'django.middleware.locale.LocaleMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        # 配置全站缓存
        'django.middleware.cache.FecthFromCacheMiddleware',
    ]
    # 设置缓存生命周期
    CACHE_MIDDLEWARE_SECONDS = 15
    # 设置缓存数据保存在数据表中
    # 属性值default来自于缓存配置CACHES的default
    CACHE_MIDDLEWARE_ALIAS = 'default'
    # 设置缓存表字段cache_key的值
    # 用于同一Django项目多个站点之间的共享缓存
    CACHE_MIDDLEWARE_KEY_PREFIX = 'MyDjango'
    
    【视图缓存】
    from django.views.decorators.cache import cache_page
    
    # 参数cache相当于CACHE_MIDDLEWARE_ALIAS
    @cache_page(timeout=10, cache='MyDjango', key_prefix='MyView')
    def index(request):
        pass
        
    【路由缓存】
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('', cache_page(time_out=10, cache='MyDjango', key_prefix='MyURL')(views.index), name='index')
    ]

    三、CSRF防护

    CSRF(Cross-Site Request Forgery,跨站请求伪造),也称One Click Attack或者Session Riding,通常缩写为CSRF或XSRF。
    Django为了防护该类攻击,在用户提交表单时,表单会自动加入csrfmiddlewaretoken隐藏控件。
    它会与网站后台保存的值进行匹配。不匹配会被CSRFMiddleware中间件(创建项目时默认开启)拦截,只适用于POST请求。
    
    # 提交表单时加上
    使用时在form标签下加入{% csrf_token %}
    # 取消表单csrf防护
    from django.views.decorators.csrf import csrf_exempt
    
    # 取消csrf防护
    @csrf_exempt
    def index(request):
       pass

    四、自定义中间件

      settings.py配置的属性MIDDLEWARE中间件中进行设置,在创建项目,Django默认配置了7个中间件:

    • SecurityMiddleware:内置的安全机制,保护用户与网站的通信安全。
    • SessionMiddleware:会话session功能。
    • CommonMiddleware:处理请求信息,规范化请求内容。
    • CsrfViewMiddleware:开始CSRF防护功能。
    • AuthenticationMiddleware:开启内置的用户认证系统。
    • MessageMiddleware:开启内置的信息提示功能。
    • XFrameOptionMiddleware:防止恶意程序点击劫持。

    # 钩子函数
    - __init__(): 初始化函数,运行Django自动执行
    - process_request(): 完成请求对象的创建,但用户访问的网址尚未与网站的路由进行匹配
    - process_view(): 完成用户访问网址与网站路由的匹配,单尚未执行视图函数
    - process_exception(): 执行视图函数期间发生异常
    - process_response(): 完成视图的执行,但尚未将响应内容返回浏览器
    实践出真知~
  • 相关阅读:
    FastWeb2011互联网工具发布
    本站启用新型试用模式
    TDiode单相及三相整流电路辅助设计器发布
    DCOp直流多级电路计算机辅助设计软件下载
    OpDesign2阻容耦合放大电路辅助设计软件下载
    共享软件的思考
    IpAdr网络地址计算器2011发布
    使用JavaScript动态添加复选框Checkbox
    JQuery操作checkbox、radio
    如果Oracle中的字段和数据库的系统字段重名,怎么配置NHibernate的映射实体文件
  • 原文地址:https://www.cnblogs.com/NolaLi/p/14392284.html
Copyright © 2011-2022 走看看