当前位置: 移动技术网 > IT编程>脚本编程>Python > django项目搭建与Session使用详解

django项目搭建与Session使用详解

2018年11月09日  | 移动技术网IT编程  | 我要评论

四驱小子大陆版,bodoghaobc,草草cf

前言

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)

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

最终项目目录如下:

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

打开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)

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

三、请求的中间件

安全认证、请求过滤以及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及静态文件即可。

总结

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网