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制作刷网页流量工具
Apr 23 Python
python爬虫之模拟登陆csdn的实例代码
May 18 Python
Pandas Shift函数的基础入门学习笔记
Nov 16 Python
Python内置random模块生成随机数的方法
May 31 Python
vscode 配置 python3开发环境的方法
Sep 19 Python
Django1.11自带分页器paginator的使用方法
Oct 31 Python
Python换行与不换行的输出实例
Feb 19 Python
python数据类型可变不可变知识点总结
Mar 06 Python
python3的pip路径在哪
Jun 23 Python
Django crontab定时任务模块操作方法解析
Sep 10 Python
python实现猜拳游戏项目
Nov 30 Python
Python如何快速找到多个字典中的公共键(key)
Apr 29 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
一个域名查询的程序
2006/10/09 PHP
Apache2 httpd.conf 中文版
2006/11/17 PHP
PHP判断远程图片是否存在的几种方法
2014/05/04 PHP
javascript学习网址备忘
2007/05/29 Javascript
js select常用操作控制代码
2010/03/16 Javascript
jQuery Deferred和Promise创建响应式应用程序详细介绍
2013/03/05 Javascript
在javascript中执行任意html代码的方法示例解读
2013/12/25 Javascript
VUE 解决mode为history页面为空白的问题
2019/11/01 Javascript
js实现html滑动图片拼图验证
2020/06/24 Javascript
解决vue scoped html样式无效的问题
2020/10/24 Javascript
Javascript数组及类数组相关原理详解
2020/10/29 Javascript
vue实现动态表格提交参数动态生成控件的操作
2020/11/09 Javascript
如何在vue-cli中使用css-loader实现css module
2021/01/07 Vue.js
[02:16]卖萌的僵尸 DOTA2神话信使飞僵小宝来袭
2014/03/24 DOTA
[03:56]还原FTP电影首映式 DOTA2群星拼出遗迹世界
2014/03/26 DOTA
python实现定制交互式命令行的方法
2014/07/03 Python
python类继承用法实例分析
2015/05/27 Python
Python字符串拼接六种方法介绍
2017/12/18 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
2019/01/29 Python
python时间序列按频率生成日期的方法
2019/05/14 Python
Python闭包和装饰器用法实例详解
2019/05/22 Python
Python线上环境使用日志的及配置文件
2019/07/28 Python
django中使用事务及接入支付宝支付功能
2019/09/15 Python
Python json转字典字符方法实例解析
2020/04/13 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
2020/06/08 Python
芬兰攀岩、山地运动和户外活动用品购物网站:Bergfreunde
2016/10/06 全球购物
Abbacino官网:包、钱包和女士配饰
2019/04/15 全球购物
大学生专科学习生活的自我评价
2013/12/07 职场文书
园林施工员岗位职责
2013/12/11 职场文书
岗位安全生产责任书
2014/07/28 职场文书
第二批党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书
2015年控辍保学工作总结
2015/05/18 职场文书
详解盒子端CSS动画性能提升
2021/05/24 HTML / CSS
Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)
2022/02/12 Servers
浅谈redis的过期时间设置和过期删除机制
2022/03/18 MySQL