django项目搭建与Session使用详解


Posted in Python onOctober 10, 2018

前言

Django完全支持也匿名会话,简单说就是使用跨网页之间可以进行通讯,比如显示用户名,用户是否已经发表评论。session框架让你存储和获取访问者的数据信息,这些信息保存在服务器上(默认是数据库中),以 cookies 的方式发送和获取一个包含 session ID的值,并不是用cookies传递数据本身。

本文给大家详细介绍了关于django项目搭建与Session使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧

django+session+中间件

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

在指定路径下创建django项目

django-admin startproject djangocommon

在项目目录下 创建app

cd djangocommon
python manage.py startapp commoncore(django-admin startapp commoncore)

django项目搭建与Session使用详解

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

最终项目目录如下:

django项目搭建与Session使用详解

修改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)

django项目搭建与Session使用详解

打开sqlite,结构如下:

django项目搭建与Session使用详解

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python元组操作实例解析
Sep 23 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
Aug 15 Python
Python+微信接口实现运维报警
Aug 27 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
Feb 03 Python
python安装模块如何通过setup.py安装(超简单)
May 05 Python
python selenium自动上传有赞单号的操作方法
Jul 05 Python
Python OOP类中的几种函数或方法总结
Feb 22 Python
Python3.5实现的三级菜单功能示例
Mar 25 Python
windows下安装Python虚拟环境virtualenvwrapper-win
Jun 14 Python
python文件绝对路径写法介绍(windows)
Dec 25 Python
python各种excel写入方式的速度对比
Nov 10 Python
matplotlib绘制正余弦曲线图的实现
Feb 22 Python
Python 变量类型详解
Oct 10 #Python
Python中几种属性访问的区别与用法详解
Oct 10 #Python
Python的argparse库使用详解
Oct 09 #Python
详解Python3中的迭代器和生成器及其区别
Oct 09 #Python
不知道这5种下划线的含义,你就不算真的会Python!
Oct 09 #Python
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
Oct 09 #Python
详解如何将python3.6软件的py文件打包成exe程序
Oct 09 #Python
You might like
利用 window_onload 实现select默认选择
2006/10/09 PHP
用来给图片加水印的PHP类
2008/04/09 PHP
php 将字符串按大写字母分隔成字符串数组
2010/04/30 PHP
smarty巧妙处理iframe中内容页的代码
2012/03/07 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
php跨站攻击实例分析
2014/10/28 PHP
PHP使用new StdClass()创建空对象的方法分析
2017/06/06 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
laravel高级的Join语法详解以及使用Join多个条件
2019/10/16 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
优秀js开源框架-jQuery使用手册(1)
2007/03/10 Javascript
JavaScript 高级篇之函数 (四)
2012/04/07 Javascript
js如何判断用户是否是用微信浏览器
2014/06/05 Javascript
基于jQuery的图片不完全按比例自动缩小
2014/07/11 Javascript
jQuery学习笔记之jQuery+CSS3的浏览器兼容性
2015/01/19 Javascript
AngularJS入门教程之Helloworld示例
2016/12/25 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
js实现关闭网页出现是否离开提示
2017/12/07 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
2018/03/01 Javascript
如何实现小程序tab栏下划线动画效果
2019/05/18 Javascript
Node.js之删除文件夹(含递归删除)代码实例
2019/09/09 Javascript
Vue自定义组件的四种方式示例详解
2020/02/28 Javascript
基于JS正则表达式实现模板数据动态渲染(实现思路详解)
2020/03/07 Javascript
[04:22]DOTA2上海特级锦标赛主赛事第四日TOP10
2016/03/06 DOTA
在python的WEB框架Flask中使用多个配置文件的解决方法
2014/04/18 Python
python开启多个子进程并行运行的方法
2015/04/18 Python
Django如何防止定时任务并发浅析
2019/05/14 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
2021/03/04 Python
css3 条纹化和透明化表格Firefox下测试成功
2014/04/15 HTML / CSS
苹果美国官方商城:Apple美国
2016/08/24 全球购物
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
华为python面试题
2016/05/03 面试题
公司门卫工作职责
2014/06/28 职场文书
领导干部民主生活会自我剖析材料范文
2014/09/20 职场文书
监守自盗观后感
2015/06/10 职场文书
2016元旦晚会主持人开场白和结束语
2015/12/03 职场文书