前言
Django完全支持也匿名会话,简单说就是使用跨网页之间可以进行通讯,比如显示用户名,用户是否已经发表评论。session框架让你存储和获取访问者的数据信息,这些信息保存在服务器上(默认是数据库中),以 cookies 的方式发送和获取一个包含 session ID的值,并不是用cookies传递数据本身。
本文给大家详细介绍了关于django项目搭建与Session使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧
django+session+中间件
一、使用命令行创建django项目
在指定路径下创建django项目
1
|
django-admin startproject djangocommon
|
在项目目录下 创建app
1
2
|
cd djangocommon
python manage.py startapp commoncore(django-admin startapp commoncore)
|
新增static文件夹和templates文件夹,static---用于存储静态文件,例如js、css、image、txt等文件,templates用于存储项目中需要使用的模板文件,例如html。
最终项目目录如下:
修改settings文件,新增:
注意在settings文件中的变量,必须全部用大写
1
2
3
|
STATIC_ROOT = ''
STATIC_URL = '/static/'
STATICFILES_DIRS = ( os.path.join(os.path.dirname(__file__), '../static/' ).replace( '\\', ' / '),)
|
===================================================================================================
TEMPLATES中指定路由检索 路径DIRS为:[BASE_DIR + "/templates", ]
--------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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
----------------
1
2
3
4
5
6
7
8
9
|
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缓存:
1
2
3
4
|
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配置如下:
1
2
3
4
5
|
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文件所在目录下执行命令:
1
|
python manage.py makemigrations(python manage.py migrate)
|
打开sqlite,结构如下:
至此,session准备工作已经完成。但是需要注意的是session失效,只是时间上失效,其值还是存在库中,因此需要定期删除,也可以在代码中逻辑删除,具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
# 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文件,代码大致如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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' 如下:
1
2
3
4
5
6
7
8
9
10
|
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及静态文件即可。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:http://www.cnblogs.com/lovenethui/p/9760808.html