django項目搭建及Session使用

django+session+中間件 css

1、使用命令行建立django項目html

在指定路徑下建立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。python

最終項目目錄以下:webpack

修改settings文件,新增:web

注意在settings文件中的變量,必須所有用大寫redis

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

===================================================================================================
TEMPLATES中指定路由檢索 路徑DIRS爲:[BASE_DIR + "/templates", ]
--------------sql

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項目已搭建完成

2、配置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配置以下:django

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)

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

3、請求的中間件

安全認證、請求過濾以及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及靜態文件便可。

相關文章
相關標籤/搜索