上篇文章中讲到 Django 如何启动以及配置 sessions 功能。sessions 功能用是跟踪用户的状态,经常结合 Cookie 功能实现自动登录功能。 所谓的“自动登录”指的是:我们登录一些网站,在不关闭浏览器以及距离上次登录时间不是很长的情况下。无论我们在新的标签页打开网站,还是关闭页面重新打开网站,登录状态一直保持着。本文内容有两个:一是利用 Django 实现自动登录功能,二是揭开“自动登录”的神秘面纱。

1 新建项目

我为了将本系列所有文章的示例代码保持集中状态,所以直接在 Django_demo 项目中创建应用。如果第一次看这文章,需要先创建项目(project),再创建应用(app)。我新建的应用是 demo_session

 
点击查看大图

然后在 setting.py 中启动请用,并检查 sessions 组件是否启动。

 
点击查看大图

因为需要 Cookie 功能,所以同样需要在 settings.py 增加一些配置。

SESSION_COOKIE_NAME = "sessionid"       # Session的cookie保存在浏览器上时的key
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False # 是否Https传输cookie
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否设置关闭浏览器使得Session过期
SESSION_COOKIE_AT_BROWSER_CLOSE = False # 是否每次请求都保存Session,默认修改之后才能保存

如果你将 SESSION_SAVE_EVERY_REQUEST 设置为 True, 那么关闭浏览器之后,需要重新登录。

2 流程

应用中会涉及到 3 个页面,所以我绘制流程图帮助理解。

 
点击查看大图

3 实现

3.1 新建 model

服务器接收到浏览器传送过来登录信息,需要验证账号和密码等信息。所以需要新建 model 保存信息,以便后续跟数据库做校验。这里我只是简单保存信息,登录验证后续讲解。

class User(models.Model):
username = models.CharField(max_length=20) # 账号
password = models.CharField(max_length=20) # 密码
nickname = models.CharField(max_length=20) # 昵称

3.2 新建 form

用户将登录信息发送给服务器是用到 POST 请求,所以需要创建表单。在应用目录下新建名为 forms 目录,然后创建 forms.py 文件。

from django.forms import ModelForm, TextInput, PasswordInput
from demo_session.models import User class UserForm(ModelForm):
class Meta:
model = User
fields = ['username', 'password', ] # 只显示 model 中指定的字段
# 指定呈现样式字段、指定 CSS 样式
widgets = {
'username': TextInput(attrs={'class': 'text',
'value': 'monkey'}),
'password': PasswordInput(attrs={'value': '13245678', })
}

3.3 新建视图

页面一共有三个,分别是登录、首页、登出。具体实现如下:

# view.py
from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import render
from demo_session.form.forms import UserForm # 用户登录
def login_view(request):
# 过滤 POST 方法的请求
if request.method == 'POST':
userfrom = UserForm(request.POST)
# 验证表单
if userfrom.is_valid():
username = userfrom.cleaned_data['username']
password = userfrom.cleaned_data['password']
# ... 执行验证登录信息操作 # 将等你信息传递给 Session 对象, 实际应用中不建议这么操作
request.session['username'] = username
# 跳转到页面
return HttpResponseRedirect('/index/')
else:
# 不是 GET 请求则显示表单
userfrom = UserForm()
template_view = 'login.html'
return render(request, template_view, {'userfrom': userfrom}) # 成功登录之后, 跳转首页
def index_view(request):
username = request.session.get('username', '')
# print(username)
template_view = 'index.html'
return render(request, template_view, {'username': username}) # 登出操作
def logout_view(request):
# 删除 session
del request.session['username']
return HttpResponse('登出成功')

3.4 对应模板

视图 login_view, index_view 对应的模板是 login.html, index.html。
其中 login.html 的实现如下:

{% load staticfiles %}
<!DOCTYPE html>
<html lang="{{ LANGUAGE_CODE|default:"en-us" }}">
<head>
<meta charset="UTF-8">
<title>登录</title>
<link href="{% static 'css/style.css' %}" rel="stylesheet" type='text/css' >
<!--webfonts-->
<link href="{% static 'css/font.css' %}" rel='stylesheet' type='text/css'>
<meta name="viewport" content="width=device-width, initial-scale=1">
<script type="application/x-javascript">
addEventListener("load", function() { setTimeout(hideURLbar, 0); }, false);
function hideURLbar(){ window.scrollTo(0,1); }</script>
</head>
<body>
<div class="main">
<div class="login-form">
<h1>Member Login</h1>
<div class="head">
<img src="{% static 'images/user.png' %}" alt=""/>
</div>
<form action="" method="POST">
{% csrf_token %}
{{ userfrom.username }}
{{ userfrom.password }}
<div class="submit"><input type="submit" value="login" ></div>
<p><a href="#">Forgot Password ?</a></p>
</form>
</div>
</div>
</body>
</html>

index.html 的实现如下:

<!DOCTYPE html>
<html lang="{{ LANGUAGE_CODE|default:"en-us" }}">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<div >
<h3>欢迎 {{username}} 到来~</h3>
<div class="submit"><a href="/logout"><input type="submit" value="退出登录" ></a></div>
</div>
</body>
</html>

3.5 配置路由

最后一步,在 urls.py 中配置访问路径:

from demo_session.views import login_view, index_view, logout_view

urlpatterns = [
# demo_session
path('login/', login_view, name='login'),
path('index/', index_view, name='index'),
path('logout/', logout_view, name='index'),
]

4 实现效果

用户访问 http://127.0.0.1/login 进行登录操作。

 
点击查看大图

当点击 login 成功之后,会跳转到首页,首页会显示用户名。同时,Cookie 中多了一个 sessionid 的字段。这字段名就是我们在 setttings.py 定义的。

 
点击查看大图

查询数据库 django_session 表的内容,会多出一条数据。

 
点击查看大图

表中的字段含义如下:

  • session_key: 就是服务器给用户返回的id。在浏览器当中,这个值是保存为sessionid
  • session_data: 这是一个加密后的信息,用来保存用户名和密码等信息
  • expire_data: 过期时间,Django可以设置过期时间

在新的标签页中打开首页,依然能看到 username 信息。这证明能自动登录。

 
点击查看大图

如果用户退出登录,再访问首页。这时会发现看不到了 username 信息了。

 
点击查看大图

5 小结

实现自动登录功能其实不难,只需要在 Django 的 Sessions 组件。然后根据场景需要,在 settings.py 配置 session 以及 cookie 等信息。


往前 Django 学习笔记文章
Django 学习笔记之环境搭建
Django 学习笔记之初始
Django 学习笔记之视图与URL配置
Django 学习笔记之模板
Django 学习笔记之模型(上)
Django 学习笔记之模型(下)
Django 学习笔记之后台管理
Django 学习笔记之模型表单
Django 学习笔记之使用旧数据库
Django 实战1:搭建属于自己社工查询系统(上)
Django 实战1:搭建属于自己社工查询系统(下)
Django 学习笔记之模型高级用法(上)
Django 学习笔记之模型高级用法(下)
Django 实现分页功能
Django 使用会话( sessions )功能

作者:猴哥Yuri
链接:https://www.jianshu.com/p/3dafba4d1cda
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

python独立环境virtualenv(并在pycharm中指定)的更多相关文章

  1. python独立环境——virtualenv

    安装: pip3 intall virtualenv   创建独立运行环境: 1. 进入项目文件夹根目录 2. 创建环境 Mac:myproject michael$ virtualenv --no- ...

  2. python3 独立环境 virtualenv & conda

    python3 独立环境 virtualenv & conda virtualenv 创建独立python环境 virtualenv env_name -p /usr/bin/python3 ...

  3. python 独立环境安装

    python 即使是单独编译安装的,库文件的安装还是会与其它python的库存放到相同的地方 使用同版本库不会有问题,但是需要升级库的时候,就会出现冲突,导致依赖这个旧库的python出现问题 这时候 ...

  4. pycharm中指定ip和端口

    pycharm中指定ip和端口 环境: 系统:win7 本机ip:192.168.0.100 1.建立工程请参照:https://www.cnblogs.com/effortsing/p/103945 ...

  5. Mac下安装virtualenv, 并在PyCharm中使用

    今天在安装一个leader写的package的时候,同事建议安装到虚拟环境中,再在PyCharm里使用该虚拟环境即可.此处记录下经过: 开发Python应用的时候,有时会遇到不同的Python应用依赖 ...

  6. Python 编程环境搭建(Windows 系统中)

    由于大家普遍使用 Windows 系统,所以本文只介绍 Windows 系统中 Python 环境的安装. 在 Windows 中安装 Python 与安装普通软件没什么差别,下载所需版本的安装包后, ...

  7. 在windows中python安装sit-packages路径位置 在Pycharm中导入opencv不能自动代码补全问题

    在Pycharm中导入opencv不能自动代码补全问题 近期学习到计算机视觉库的相关知识,经过几个小时的探讨,终于解决了opencv不能自动补全代码的困惑, 我们使用pycharm安装配置可能会添加多 ...

  8. Python 隔离环境 virtualenv

    1) 安装 $ sudo pip3 install virtualenv 2) 创建并进入工程目录,例如 myproject $ mkdir myproject $ cd myproject 3) 在 ...

  9. Ubuntu下python的第三方module无法在pycharm中导入

    换了台笔记本,新安装的requests module无法在pycharm导入: Traceback (most recent call last): File "/home/winsterc ...

随机推荐

  1. controlfile作为RMAN的repository时,对 keep time 的测试

    4月2日,首先查看系统状况: SQL> show parameter control NAME                                 TYPE        VALUE ...

  2. mfc CListCtrl 报表格式

    知识点: CListCtrl报表格式 CListCtrl报表格式添加列 CListCtrl报表格式添加行 CListCtrl报表格式设置单元格 一.CListCtrl报表格式 类名:SysListVi ...

  3. 【RDB】MariaDB 之事务、复制、集群

    目录 简介 安装启动 权限 事务 脏读.不可重复读.幻读 MVCC 复制 异步复制 半同步复制 GTID复制 集群(Galera) 配置 监控(Zabbix) 简介 环境: CentOS 7.4.17 ...

  4. memcached 和redis比较

    同属于NOSQL存储,网上流传很多memcached能做的是redis都可以做,为什么基本现在两种都火,原因他们有各自擅长的地方. memcahed内部采用多核模式,单列运行很快.memcached采 ...

  5. 记录一次Docker For Windows10镜像加速器配置

    1.访问https://www.daocloud.io 注册账号 2.访问资源->加速器,或者直接访问网址https://www.daocloud.io/mirror,页面中间有加速配置,例如我 ...

  6. 关于java线程池的一丢丢

    线程池应用达到的目的 1.降低资源消耗:可以重复利用已创建的线程从而降低线程创建和销毁所带来的消耗. 2.提高响应速度:当任务到达时,不需要等线程创建就可以立即执行. 3.提高线程的可管理性:使用线程 ...

  7. unity2D以最小的角度旋转到目标方向(y方向为角色的主方向)

    一.使用向量原理转换到目标方向 为了让角色的自身y转向目标方向,并且以最小角度旋转,要点是获得当前方向与目标方向的叉值,从而判断应该旋转的方向 float rotateSpeed; //相对目标位置运 ...

  8. Linux 终端快捷键整理

    一.历史命令相关快捷键 快捷键 说明 ↑.↓ 显示历史命令 !! 执行上一个命令 !n 执行历史命令中第 n 条命令 !-n 执行历史命令中倒数第 n 条命令 二.移动相关快捷键 快捷键 说明 Ctr ...

  9. Vue 路由详解

    Vue 路由详解 对于前端来说,其实浏览器配合超级连接就很好的实现了路由功能.但是对于单页面应用来说,浏览器和超级连接的跳转方式已经不能适用,所以各大框架纷纷给出了单页面应用的解决路由跳转的方案. V ...

  10. PAT甲题题解-1127. ZigZagging on a Tree (30)-中序、后序建树

    根据中序遍历和前序遍历确定一棵二叉树,然后按“层次遍历”序列输出.输出规则:除根节点外,接下来每层的节点输出顺序是:先从左到右,再从右到左,交替输出 #include <iostream> ...