上篇文章中讲到 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. C标准库string.h中几个常用函数的使用详解

    strlen 计算字符串长度 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符. 函数实现: int Strlen(cons ...

  2. SSIS 你真的了解事务吗?

    事务用于处理数据的一致性,事务的定义是,处于同一个事务中的操作是一个工作单元,要么全部执行成功,要么全部执行失败.把事务的概念应用到在实际的SSIS Package场景中,如何在Package中实现事 ...

  3. java拦截器(Interceptor)学习笔记

    1,拦截器的概念    java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了 ...

  4. NetBeans 插件开发简介

    希望 NetBeans 为您提供更多功能吗? 您希望倾心投入到 NetBeans 的开发中,并希望它能激发您开发另一个应用程序的热情.您希望聆听音乐.浏览网页.查看邮件.存储喜欢的 URL,以及维护日 ...

  5. Markdown之语法入门篇

    Markdown语法入门 一.什么是Markdown语言 我相信有很多小伙伴没有听说过Markdown语言.的确,对于一般人来说,有word足够了.但是有这么一群人,受够了word那糟糕的排版方式,需 ...

  6. Asp.Net_Form验证跟授权

    配置文件的<system.web></system.web>结点下添加如下代码: <!--身份验证方式--> <authentication mode=&qu ...

  7. Python+Selenium+Unittest+Ddt+HTMLReport分布式数据驱动自动化测试框架结构

    1.Business:公共业务模块,如登录模块,可以把登录模块进行封装供调用 ------login_business.py from Page_Object.Common_Page.login_pa ...

  8. 记录Appium-desktop踩过的坑could not find devices

    最近了解到一个自动化入门的新工具appium-desktop,看网上各种文章,感觉这个工具是很简单的一个入门级工具,下载试用了一下. 官网下载,输入网址appium.io,点击下载. 一路傻瓜式安装, ...

  9. B1014. 福尔摩斯的约会

    14/20 #include<bits/stdc++.h> using namespace std; map<char,string> day; int main(){ day ...

  10. R语言做相关性分析

    衡量随机变量相关性的方法主要有三种:pearson相关系数,spearman相关系数,kendall相关系数: 1.       pearson相关系数,亦即皮尔逊相关系数 pearson相关系数用来 ...