写一下Cookie、重定向、Session

Cookie

测试代码,承接前面的代码:

路由: booktest/urls.py

urlpatterns = [
url('^$',views.index), # 路由到views.py中的index()函数
url('^index', views.index, name="index"),
url('^(\d+)$', views.integer),
url('^(?P<p2>\d+)/(?P<p3>\d+)/(?P<p1>\d+)$', views.date),
url('^req$', views.req),
url('^resp$', views.resp),
url('^cookie$', views.cookie),
]

booktest/views.py

def cookie(request):
resp = HttpResponse('cookie')
resp.set_cookie('name', 'zhangsan')
return resp

访问 http://127.0.0.1:8080/booktest/cookie  - “查看元素/检查”- “网络”- 左边选择浏览的网页 - 右边查看响应头

此时cookies就保存到浏览器上

然后可以把服务器上的代码set_cookie去掉

def cookie(request):
resp = HttpResponse('cookie')
#resp.set_cookie('name', 'zhangsan')
return resp

访问同一个网页 http://127.0.0.1:8080/booktest/cookie  检查

由于之前的cookies已经保存到浏览器上了,所以现在就把浏览器上的cookie发送到服务端。

接下来需要服务器去接收cookie

路由 booktest/urls.py

urlpatterns = [
url('^$',views.index), # 路由到views.py中的index()函数
url('^index', views.index, name="index"),
url('^(\d+)$', views.integer),
url('^(?P<p2>\d+)/(?P<p3>\d+)/(?P<p1>\d+)$', views.date),
url('^req$', views.req),
url('^resp$', views.resp),
url('^cookie$', views.cookie),
url('^cookie2$', views.cookie2),
]

视图 booktest/views.py

def cookie2(request):
resp = HttpResponse()
cookie = request.COOKIES
if 'name' in cookie:
resp.write(cookie['name'])
return resp

访问http://127.0.0.1:8080/booktest/cookie2  就会把cookie发送到服务器,然后服务器端获取name的值,并显示出来

重定向

重定向是指服务器端跳转。

直接把请求指向另外一个地方

路由 booktest/urls.py

urlpatterns = [
url('^$',views.index), # 路由到views.py中的index()函数
url('^index', views.index, name="index"),
url('^(\d+)$', views.integer),
url('^(?P<p2>\d+)/(?P<p3>\d+)/(?P<p1>\d+)$', views.date),
url('^req$', views.req),
url('^resp$', views.resp),
url('^cookie$', views.cookie),
url('^cookie2$', views.cookie2),
url('^redirect$', views.redirect),
url('^redirect2$'
, views.redirect2),
]

视图 booktest/views.py

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from django.template import loader, RequestContext
def redirect(request):
return HttpResponseRedirect('/booktest/redirect2') def redirect2(request):
return HttpResponse('这里重定向后的页面')

Session

首先需要打开数据库的功能。

django3/settings.py

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django3',
'USER': 'root',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': ''
}
}

确保INSTALL_APP中已经打开了session的功能

INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'booktest'
)

确保MIDDLEWARE_CLASSES中也添加了SESSION的功能

MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)

如果要禁用session的话,把上面两个值注释掉就好了

进行迁移。如果没有添加booktest的app,可以使用--empty参数

python manage.py makemigrations --empty booktest
python manage.py migrate

确保数据库中生成django_session表

编写首页

booktest/urls.py

urlpatterns = [
url('^$',views.index), # 路由到views.py中的index()函数
url('^index', views.index, name="index"),
url('^(\d+)$', views.integer),
url('^(?P<p2>\d+)/(?P<p3>\d+)/(?P<p1>\d+)$', views.date),
url('^req$', views.req),
url('^resp$', views.resp),
url('^cookie$', views.cookie),
url('^cookie2$', views.cookie2),
url('^redirect$', views.redirect),
url('^redirect2$', views.redirect2),
url('^session1$', views.session1),
]

booktest/views.py

def session1(request):
uname = None
context = {"uname":uname}
return render(request, 'booktest/session1.html', context)

templates/booktest/session1.html

<body>
欢迎:{{uname}}
<hr/>
<a href="#">登录</a>
<hr/>
<a href="#">退出</a>
</body>

编写登录页面

booktest/urls.py

urlpatterns = [
url('^$',views.index), # 路由到views.py中的index()函数
url('^index', views.index, name="index"),
url('^(\d+)$', views.integer),
url('^(?P<p2>\d+)/(?P<p3>\d+)/(?P<p1>\d+)$', views.date),
url('^req$', views.req),
url('^resp$', views.resp),
url('^cookie$', views.cookie),
url('^cookie2$', views.cookie2),
url('^redirect$', views.redirect),
url('^redirect2$', views.redirect2),
url('^session1$', views.session1),
url('^session2$', views.session2),
]

booktest/views.py

def session2(request):
return render(request, 'booktest/session2.html')

templates/booktest/session1.html

<body>
欢迎:{{uname}}
<hr/>
<a href="/booktest/session2">登录</a>
<hr/>
<a href="#">退出</a>
</body>

templates/booktest/session2.html

<body>
<form method="post" action="/booktest/session2_handler">
<input type="text" name="uname"/>
<input type="submit" value="登录"/>
</form>
</body>

处理登录请求

booktest/urls.py

urlpatterns = [
url('^$',views.index), # 路由到views.py中的index()函数
url('^index', views.index, name="index"),
url('^(\d+)$', views.integer),
url('^(?P<p2>\d+)/(?P<p3>\d+)/(?P<p1>\d+)$', views.date),
url('^req$', views.req),
url('^resp$', views.resp),
url('^cookie$', views.cookie),
url('^cookie2$', views.cookie2),
url('^redirect$', views.redirect),
url('^redirect2$', views.redirect2),
url('^session1$', views.session1),
url('^session2$', views.session2),
url('^session2_handler$', views.session2_handler),
]

booktest/views.py

def session2_handler(request):
post = request.POST
uname = post['uname']
request.session['uname'] = uname
return HttpResponseRedirect('/booktest/session1')

数据库的django_session表中出现了

这里的session_key是故意写的这么复杂,以防重复的。而session_data是经过base64编码的,可以使用 https://base64.supfree.net/ 进行解码

解码后的结果如下:

修改session1,从session中获取值

booktest/views.py

def session1(request):
uname = request.session.get('uname', '未登陆')
context = {"uname":uname}
return render(request, 'booktest/session1.html', context)

登录后,则显示用户名

退出登录

booktest/urls.py

urlpatterns = [
url('^$',views.index), # 路由到views.py中的index()函数
url('^index', views.index, name="index"),
url('^(\d+)$', views.integer),
url('^(?P<p2>\d+)/(?P<p3>\d+)/(?P<p1>\d+)$', views.date),
url('^req$', views.req),
url('^resp$', views.resp),
url('^cookie$', views.cookie),
url('^cookie2$', views.cookie2),
url('^redirect$', views.redirect),
url('^redirect2$', views.redirect2),
url('^session1$', views.session1),
url('^session2$', views.session2),
url('^session2_handler$', views.session2_handler),
url('^session3$', views.session3),
]

booktest/views.py

def session3(request):
request.session['uname'] = None
return HttpResponseRedirect('/booktest/session1')

添加退出登录的链接

templates/booktest/session3.html

<body>
欢迎:{{uname}}
<hr/>
<a href="/booktest/session2">登录</a>
<hr/>
<a href="/booktest/session3">退出</a>
</body>

通过set_expiry()函数设置过期时间。如果没有设置,默认在两个星期后过期

如果你想浏览器退出的时候马上过期,可以设置参数为0

def session2_handler(request):
post = request.POST
uname = post['uname']
request.session['uname'] = uname
request.session.set_expiry(0)
return HttpResponseRedirect('/booktest/session1')

把session保存到redis中

django3/settings.py

SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 0
SESSION_REDIS_PASSWORD = ''
SESSION_REDIS_PREFIX = 'session'

需要安装插件django-redis-sessions

pip install django-redis-sessions

登录后就可以在redis中查看session的信息了

Django:视图views(三)的更多相关文章

  1. Django基础之视图(views)层、模板层

    目录 Django基础之视图(views)层.模板层 JsonResponse 向前端返回一个json格式字符串的两种方式 重写Django中的json的某个方法 form表单上传文件 FBV与CBV ...

  2. django 中的视图(Views)

    Views Django中views里面的代码就是一个一个函数逻辑, 处理客户端(浏览器)发送的HTTPRequest, 然后返回HTTPResponse, http请求中产生两个核心对象: http ...

  3. django视图函数解析(三)

    1 视图views概述 1 作用: 视图接受web请求并响应web请求 2 本质: 视图就是python中的处理函数 3 响应: 一般是一个网页的HTML内容.一个重定向.错误信息页面.json格式的 ...

  4. 【Django笔记1】-视图(views)与模板(templates)

    视图(views)与模板(templates) 1,视图(views) ​ 将接收到的数据赋值给模板(渲染),再传递给浏览器.HTML代码可以直接放在views.py(文件名可任意更换),也可以放在t ...

  5. Django视图层之路由配置系统(urls)

    视图层之路由配置系统(urls) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个U ...

  6. Django视图(一)

    Django视图(一) 一. 概述 作用:视图接受web请求,并相应请求 本质:视图是自定义的一个python中的函数 响应内容:正常视图,重定向视图,错误视图(404,500,400) 响应过程: ...

  7. Django 2.0 学习(07):Django 视图(进阶-续)

    接Django 2.0 学习(06):Django 视图(进阶),我们将聚焦在使用简单的表单进行处理和精简代码. 编写简单表单 我们将用下面的代码,来替换之前的detail模板("polls ...

  8. 【Mac系统 + Python + Django】之开发一个发布会系统【Django视图(二)】

    此学习资料是通过虫师的python接口自动化出的书学习而来的,在此说明一下,想学习更多的自动化的同学可以找虫师的博客园,非广告,因为我python+selenium自动化也是跟虫师学的,学习效果很好的 ...

  9. [diango]理解django视图工作原理

    前言:正确理解django视图view,模型model,模板的概念及其之间的关联关系,才能快速学习并上手使用django制作网页 本文主要讲解自己在学习django后对视图view的理解 在进入正文之 ...

  10. Django 2.0 学习(03):Django视图和URL(下)

    接上篇博文,继续分析Django基本流程. 编写第一个(view)视图函数 1.打开文件polls/views.py,输入下面的Python代码: from django.http import Ht ...

随机推荐

  1. Android adb input 命令介绍

    input命令是用来向设备发送模拟操作的命令: 因为版本不同,input命令也有所不同 以下为Android 4.0的input命令: usage:input text <string> ...

  2. java反编译工具(Java Decompiler)

    1,下载地址,包括GUI,Eclipse插件 http://jd.benow.ca/ 2,Eclipse插件的安装参看 https://blog.csdn.net/yh_zeng2/article/d ...

  3. java构造函数修饰符

    java 构造函数,可以被访问修饰符修饰,而不能被特殊修饰符修饰:(在编译器经过测试) 访问修饰符: public (最常用,其他类的任何位置都可以访问) protected(能够在同一包中被子类访问 ...

  4. Java知多少(16)StringBuffer与StringBuider

    String 的值是不可变的,每次对String的操作都会生成新的String对象,不仅效率低,而且耗费大量内存空间. StringBuffer类和String类一样,也用来表示字符串,但是Strin ...

  5. vmware-hostd.exe 占用443端口导致Apache无法正常启动?

    问题: [Apache]  Problem detected!16:23:19  [Apache]  Port 443 in use by ""D:\vmware\VMware W ...

  6. Unity3D中Layers和LayerMask解析

    Unity中是用int32来表示32个Layer层.int32表示二进制一共有32位(0—31).在Unity中可编辑的Layer如下图所示:   在Unity中每个GameObject都有Layer ...

  7. [Android Studio] Using API of OpenCV DNN

    前言 一.故事背景 NDK方法人脸识别 OpenCV4Android系列: 1. OpenCV4Android开发实录(1):移植OpenCV3.3.0库到Android Studio 2.OpenC ...

  8. [Node.js] 01 - How to learn node.js

    基本概念 链接:https://www.zhihu.com/question/47244505/answer/105026648 链接:How to decide when to use Node.j ...

  9. SpringBoot------MockMvc单元测试

    1.添加测试依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www. ...

  10. Java处理Exception无法捕获的异常

    场景: 使用try...catch(Exception e){}来捕获异常,执行过程中线程中断或阻塞了,但是catch块中却并没有捕获到异常信息. try{ // 此处可能是调用一个远程的接口,或是调 ...