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及静态文件即可。

  • 相关阅读:
    C# 图片与Base64的相互转化
    LeetCode 303. Range Sum Query – Immutable
    LeetCode 300. Longest Increasing Subsequence
    LeetCode 292. Nim Game
    LeetCode 283. Move Zeroes
    LeetCode 279. Perfect Squares
    LeetCode 268. Missing Number
    LeetCode 264. Ugly Number II
    LeetCode 258. Add Digits
    LeetCode 257. Binary Tree Paths
  • 原文地址:https://www.cnblogs.com/lovenethui/p/9760808.html
Copyright © 2011-2022 走看看