zoukankan      html  css  js  c++  java
  • django项目搭建及Session使用

    django+session+中间件

    一、使用命令行创建django项目

    在指定路径下创建django项目
    django-admin startproject djangocommon
     
    在项目目录下  创建app
    cd djangocommon
    python manage.py startapp commoncore(django-admin startapp commoncore)

     新增static文件夹和templates文件夹,static---用于存储静态文件,例如js、css、image、txt等文件,templates用于存储项目中需要使用的模板文件,例如html。

    最终项目目录如下:

    修改settings文件,新增:

    注意在settings文件中的变量,必须全部用大写

    STATIC_ROOT = ''
    STATIC_URL = '/static/'
    STATICFILES_DIRS = ( os.path.join(os.path.dirname(__file__), '../static/').replace('\', '/'),)

    ===================================================================================================
    TEMPLATES中指定路由检索 路径DIRS为:[BASE_DIR + "/templates", ]
    --------------

    TEMPLATES = [
    {
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [BASE_DIR + "/templates", ],
    'APP_DIRS': True,
    'OPTIONS': {
    'context_processors': [
    'django.template.context_processors.debug',
    'django.template.context_processors.request',
    'django.contrib.auth.context_processors.auth',
    'django.contrib.messages.context_processors.messages',
    ],
    },
    },
    ]

    ================================================================================

    DATABASES项设定项目依赖的存储介质,可以指定为文件、内存、数据库。这里我们采用默认的sqlite3数据库
    =================================================================================
    在INSTALLED_APPS中新增上面新建的app:commoncore
    ----------------
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'commoncore',
    ]

    =============================================================
    在djangocommon项目下新增py 命名为view,在这里写后台请求的处理。并在urls文件中配置路由
    至此,一个小型的django项目已搭建完成

    二、配置session
    django的session可以分为内存缓存存储、文件存储、数据库存储。这里我们采用数据库存储。
    django项目默认是开启session的,默认存储方式为:SESSION_ENGINE='django.contrib.sessions.backends.db'
    (本地缓存:SESSION_ENGINE='django.contrib.sessions.backends.cache' 混合缓存:SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
    当然也可以是redis缓存:
    CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://ip:端口/",
    "OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient", }}}
    SESSION_ENGINE = "django.contrib.sessions.backends.cache"
    SESSION_CACHE_ALIAS = "default"
    =======================================================================================================================================
    我们这里使用django自带的sqlite存储session,settings配置如下:

    SESSION_COOKIE_SECURE = False
    SESSION_COOKIE_HTTPONLY = True
    SESSION_COOKIE_NAME = 'xxxx'
    SEESION_EXPIRE_AT_BROWSER_CLOSE = True
    SESSION_COOKIE_AGE = 18000

    这里的设定的时间作用不大,可以直接在代码里指定时间:request.session.set_expiry(0) 参数0代表退出浏览器session即失效,单位均为毫秒
    中间件MIDDLEWARE_CLASSES中查看是否有'django.contrib.sessions.middleware.SessionMiddleware' 没有的话添加即可
    ==========================================================================================================
    这里我们已经设置好了django session的环境,我们需要使用django自带的模块处理session值
    这里需要强调一点,用sqlite数据库存储session需要初始化下数据库,在manage.py文件所在目录下执行命令:
    python manage.py makemigrations(python manage.py  migrate)

    打开sqlite,结构如下:

    至此,session准备工作已经完成。但是需要注意的是session失效,只是时间上失效,其值还是存在库中,因此需要定期删除,也可以在代码中逻辑删除,具体代码如下:

    # coding=utf-8
    import sys
    
    reload(sys)
    sys.setdefaultencoding('utf-8')
    import datetime
    from django.contrib.sessions.backends.db import SessionStore
    from django.contrib.sessions.models import Session
    
    
    def delsession(key):
        if key is None:
            return
        store = SessionStore()
        store.delete(key)
        count = Session.objects.all().count()
        if count > 20:
            nowtime = datetime.datetime.now()
            outdatesession = Session.objects.filter(expire_date__lt=nowtime)
            for item in outdatesession:
                store.delete(item.session_key)
    
    
    def delovertimesession():
        store = SessionStore()
        count = Session.objects.all().count()
        if count > 20:
            nowtime = datetime.datetime.now()
            outdatesession = Session.objects.filter(expire_date__lt=nowtime)
            for item in outdatesession:
                store.delete(item.session_key)

    ===============================================================================================================================

    三、请求的中间件

    安全认证、请求过滤以及session的初始值 我们可以在中间件中处理。

    在djangocommon项目下,新增middlehttp.py文件,代码大致如下:

    reload(sys)
    sys.setdefaultencoding('utf-8')
    
    from django.shortcuts import render_to_response
    
    
    #  process_request  --------   接受request之后确定view之前执行
    #  process_view  确定view之后 并且在view真正执行之前执行
    #  process_response   view执行之后
    #  process_exception(self, request, exception) view抛出异常
    
    class LoginRequiredMiddleware:
        def process_request(self, request):        
                    path = request.path_info.strip('/')
                    #这里写处理逻辑和请求控制

    在settings文件中的中间件配置MIDDLEWARE_CLASSES中添加'djangocommon.middlehttp.LoginRequiredMiddleware' 如下:

    MIDDLEWARE_CLASSES = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
       'djangocommon.middlehttp.LoginRequiredMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]

    注意顺序,必须在SessionMiddleware之后。

    =========================================================================================================================

    至此,一个完整的django+session+中间件 项目搭建完成。前后端分离的项目,也可以以此为基础,通过webpack或cli 搭建 编译生成的templates及静态文件即可。

  • 相关阅读:
    41.js延迟加载的方式有哪些?
    39、[“1”, “2”, “3”].map(parseInt) 答案是多少
    38.null,undefined 的区别?
    35.说几条写JavaScript的基本规范?
    34.介绍js有哪些内置对象?
    问题解决Android studio遇到 java.lang.OutOfMemoryError: GC app:transformClassesWithDexForDebug解决方法 以及gradle优化
    Multiple dex files define
    Retrofit2.0+RxJava2.0问题
    【转】Android Shape绘制虚线在手机端查看是实线的问题
    极光使用整理
  • 原文地址:https://www.cnblogs.com/lovenethui/p/9760808.html
Copyright © 2011-2022 走看看