django項(xiàng)目搭建與Session使用詳解
前言
Django完全支持也匿名會(huì)話(huà),簡(jiǎn)單說(shuō)就是使用跨網(wǎng)頁(yè)之間可以進(jìn)行通訊,比如顯示用戶(hù)名,用戶(hù)是否已經(jīng)發(fā)表評(píng)論。session框架讓你存儲(chǔ)和獲取訪(fǎng)問(wèn)者的數(shù)據(jù)信息,這些信息保存在服務(wù)器上(默認(rèn)是數(shù)據(jù)庫(kù)中),以 cookies 的方式發(fā)送和獲取一個(gè)包含 session ID的值,并不是用cookies傳遞數(shù)據(jù)本身。
本文給大家詳細(xì)介紹了關(guān)于django項(xiàng)目搭建與Session使用的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話(huà)不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧
django+session+中間件
一、使用命令行創(chuàng)建django項(xiàng)目
在指定路徑下創(chuàng)建django項(xiàng)目
django-admin startproject djangocommon
在項(xiàng)目目錄下 創(chuàng)建app
cd djangocommon python manage.py startapp commoncore(django-admin startapp commoncore)
新增static文件夾和templates文件夾,static---用于存儲(chǔ)靜態(tài)文件,例如js、css、image、txt等文件,templates用于存儲(chǔ)項(xiàng)目中需要使用的模板文件,例如html。
最終項(xiàng)目目錄如下:
修改settings文件,新增:
注意在settings文件中的變量,必須全部用大寫(xiě)
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項(xiàng)設(shè)定項(xiàng)目依賴(lài)的存儲(chǔ)介質(zhì),可以指定為文件、內(nèi)存、數(shù)據(jù)庫(kù)。這里我們采用默認(rèn)的sqlite3數(shù)據(jù)庫(kù)
=================================================================================
在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項(xiàng)目下新增py 命名為view,在這里寫(xiě)后臺(tái)請(qǐng)求的處理。并在urls文件中配置路由
至此,一個(gè)小型的django項(xiàng)目已搭建完成
二、配置session
django的session可以分為內(nèi)存緩存存儲(chǔ)、文件存儲(chǔ)、數(shù)據(jù)庫(kù)存儲(chǔ)。這里我們采用數(shù)據(jù)庫(kù)存儲(chǔ)。
django項(xiàng)目默認(rèn)是開(kāi)啟session的,默認(rèn)存儲(chǔ)方式為:SESSION_ENGINE='django.contrib.sessions.backends.db'
(本地緩存:SESSION_ENGINE='django.contrib.sessions.backends.cache'
混合緩存:SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
)
當(dāng)然也可以是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存儲(chǔ)session,settings配置如下:
SESSION_COOKIE_SECURE = False SESSION_COOKIE_HTTPONLY = True SESSION_COOKIE_NAME = 'xxxx' SEESION_EXPIRE_AT_BROWSER_CLOSE = True SESSION_COOKIE_AGE = 18000
這里的設(shè)定的時(shí)間作用不大,可以直接在代碼里指定時(shí)間:request.session.set_expiry(0) 參數(shù)0代表退出瀏覽器session即失效,單位均為毫秒
中間件MIDDLEWARE_CLASSES中查看是否有'django.contrib.sessions.middleware.SessionMiddleware' 沒(méi)有的話(huà)添加即可
==========================================================================================================
這里我們已經(jīng)設(shè)置好了django session的環(huán)境,我們需要使用django自帶的模塊處理session值
這里需要強(qiáng)調(diào)一點(diǎn),用sqlite數(shù)據(jù)庫(kù)存儲(chǔ)session需要初始化下數(shù)據(jù)庫(kù),在manage.py文件所在目錄下執(zhí)行命令:
python manage.py makemigrations(python manage.py migrate)
打開(kāi)sqlite,結(jié)構(gòu)如下:
至此,session準(zhǔn)備工作已經(jīng)完成。但是需要注意的是session失效,只是時(shí)間上失效,其值還是存在庫(kù)中,因此需要定期刪除,也可以在代碼中邏輯刪除,具體代碼如下:
# 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)
===============================================================================================================================
三、請(qǐng)求的中間件
安全認(rèn)證、請(qǐng)求過(guò)濾以及session的初始值 我們可以在中間件中處理。
在djangocommon項(xiàng)目下,新增middlehttp.py文件,代碼大致如下:
reload(sys) sys.setdefaultencoding('utf-8') from django.shortcuts import render_to_response # process_request -------- 接受request之后確定view之前執(zhí)行 # process_view 確定view之后 并且在view真正執(zhí)行之前執(zhí)行 # process_response view執(zhí)行之后 # process_exception(self, request, exception) view拋出異常 class LoginRequiredMiddleware: def process_request(self, request): path = request.path_info.strip('/') #這里寫(xiě)處理邏輯和請(qǐng)求控制
在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之后。
=========================================================================================================================
至此,一個(gè)完整的django+session+中間件 項(xiàng)目搭建完成。前后端分離的項(xiàng)目,也可以以此為基礎(chǔ),通過(guò)webpack或cli 搭建 編譯生成的templates及靜態(tài)文件即可。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
keras中的loss、optimizer、metrics用法
這篇文章主要介紹了keras中的loss、optimizer、metrics用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06Python實(shí)現(xiàn)自動(dòng)上京東搶手機(jī)
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)自動(dòng)上京東搶手機(jī)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02教你利用Python+Turtle繪制簡(jiǎn)易版愛(ài)心表白
這篇文章主要介紹了教你利用Python+Turtle繪制簡(jiǎn)易版愛(ài)心表白,文中有非常詳細(xì)的代碼示例,對(duì)想要和男朋友或者女朋友表白的小伙伴們有很大幫助喲,需要的朋友可以參考下2021-04-04python實(shí)現(xiàn)數(shù)組求和與平均值
這篇文章主要介紹了python實(shí)現(xiàn)數(shù)組求和與平均值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05pycharm Tab鍵設(shè)置成4個(gè)空格的操作
這篇文章主要介紹了pycharm Tab鍵設(shè)置成4個(gè)空格的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02Python實(shí)現(xiàn)監(jiān)控Nginx配置文件的不同并發(fā)送郵件報(bào)警功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)監(jiān)控Nginx配置文件的不同并發(fā)送郵件報(bào)警功能,涉及Python基于difflib模塊的文件比較及smtplib模塊的郵件發(fā)送相關(guān)操作技巧,需要的朋友可以參考下2019-02-02pytorch中交叉熵?fù)p失(nn.CrossEntropyLoss())的計(jì)算過(guò)程詳解
今天小編就為大家分享一篇pytorch中交叉熵?fù)p失(nn.CrossEntropyLoss())的計(jì)算過(guò)程詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01