cookie session
Posted saoqiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cookie session相关的知识,希望对你有一定的参考价值。
今日内容
装饰器要加入functools.wrap装饰
orm字段中的verbose_name
路由系统中记得加入终止符 $
用户名和密码检测
模板查找顺序
cookie
通过js设置cookie
path的作用
session
Http协议
django请求生命周期
functools
增加@functools.wraps(f), 可以保持当前装饰器去装饰的函数的 name 的值不变
由此函数使用装饰器时,函数的函数名即 __name__已经被装饰器改变.
一般定义装饰器的话可以不用考虑这点,但是如果多个函数被两个装饰器装饰时就报错,因为两个函数名一样,第二个函数再去装饰的话就报错.
解决方案就是引入 functools.wraps ,
import functools
def wrapper(f):
@functools.wraps(f)
def inner(*args,**kwargs):
ret = f(*args,**kwargs)
return ret
return inner
'''
index=wrapper(index)
'''
@wrapper
def index(a1,a2):
return a1+a2
index(1,2)
print(index.__name__) #函数名
print(index.__doc__)#查看函数的注释'''这个是注释'''
什么是HTTP协议?
请求头之间 分割
请求头与请求体
请求体之间
超文本传输协议
关于连接:一次请求一次响应之后断开连接(无状态、短连接)
关于格式:
请求:请求头+请求体 (http:www.baidu.com/index/? a=123) send("GET /index/?a=123 http1.1
host:www.baidu.com
user- agent:Chrome
")
end("GET /index/?a=123 http1.1
host:www.baidu.com
user- agent:Chrome
")
send("POST /index/ http1.1
host:www.baidu.com
user- agent:Chrome
username=alex&pwd=123")
响应:响应头+响应体 Content-Encoding: gzip
Cache-Control: private
网页看到的html内容
扩展:常见的请求头都有哪些?
- user-agent:用什么浏览器访问的网站。
- content-type: 请求体的数据格式是什么?(服务端按照 格式要求进行解析)
扩展:常见的请求方式?
- GET - POST
django请求生命周期
文字描述
用户输入www.baidu.com 先wsgi协议(外部服务网关接口 实现这个协议的有两个wsgiref[本地测试用] uwsgi.[性能高]) 本质是socket 后面才是django
先到路由系统(路由匹配) 在到视图函数(执行逻辑 两步先通过orm 数据库取值 然后给模板渲染) 最后通过wsji返回给用户
案例:博客系统
第一步用户输入login进入登录页面
配置数据库
settings配置文件中
自己先在数据库中创建库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'cs',
'USER':'root',
'PASSWORD':'123',
'HOST':'127.0.0.1',
'PORT':3306,
}
}
2 项目文件夹下的init文件中写上下面内容,用pymysql替换mysqldb
import pymysql
pymysql.install_as_MySQLdb()
settings配置文件中将 USE_TZ 的值改为 False
# USE_TZ = True
USE_TZ = False # 告诉mysql存储时间时按照当地时间来寸,不要用utc时间
使用pycharm的数据库客户端的时候,时区问题要注意
键表
class UserInfo(models.Model):
"""
用户表
"""
username = models.CharField(verbose_name='用户名',max_length=32)
password = models.CharField(verbose_name='密码',max_length=64)
配置路由系统
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/$', views.login),
url(r'^index/$', views.index),
]
配置视图
from django.shortcuts import render,redirect
from app01 import models
def login(request):
"""
用户登录
:param request:
:return:
"""
if request.method == 'GET':
return render(request, 'login.html')
# 获取用户提交的用户名和密码
user = request.POST.get('user')
pwd = request.POST.get('pwd')
# 去数据库检查用户名密码是否正确
# user_object = models.UserInfo.objects.filter(username=user,password=pwd).first()
# user_object = models.UserInfo.objects.filter(username=user, password=pwd).exists()
user_object = models.UserInfo.objects.filter(username=user, password=pwd).first()
if user_object:
# 用户登录成功
request.session['user_name'] = user_object.username
request.session['user_id'] = user_object.pk
return redirect('/index/')
# 用户名或密码输入错误
return render(request,'login.html',{'error':'用户名或密码错误'})
def auth(func):
def inner(request,*args,**kwargs):
name = request.session.get('user_name')
if not name:
return redirect('/login/')
return func(request,*args,**kwargs)
return inner
@auth
def index(request):
"""
博客后台首页
:param request:
:return:
"""
return render(request,'index.html')
配置模板
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div style="width: 500px;margin: 0 auto;border: 1px solid #dddddd;">
<form class="form-horizontal" method="post">
<div class="form-group">
<label class="col-sm-2 control-label">用户名</label>
<div class="col-sm-10">
<input type="text" class="form-control" placeholder="请输入用户名" name="user">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">密码</label>
<div class="col-sm-10">
<input type="password" class="form-control" placeholder="请输入密码" name="pwd">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-default">提 交</button>
<span style="color: red;">{{ error }}</span>
</div>
</div>
</form>
</div>
</body>
</html>
cookie
白话版
登录成功向其客户端发送一个令牌 (保存在用户器上的键值对) 用于下次确认身份
# 用户登录成功
result = redirect('/index/')
result.set_cookie('xxxxxxxx',user)
return result
用户输入index网址 后台进行判断
def index(request):
"""
博客后台首页
:param request:
:return:
"""
user = request.COOKIES.get('xxxxxxxx')#判断有没这个值
if not user:
return redirect('/login/')
return render(request,'index.html',{'user':user})
在下面3种情况都可以设置cookie
return HttpResponse('...')
return render('...')
return redirect('...')
# 设置cookie
data = redirect('...')
data.set_cookie()
# 读取cookie
request.COOKIES.get('xx')
return data
必须背会一下三个参数:
key 键, value='' 值, max_age=None 秒 多少秒后失效 path 路径
1.通过js设置cookie
document. cookie = ' k1=wy222 ;path=/ '
$. cookie('k1', 'wy222' ,{path:'/'})
注意: path不同会导致设置不同.
2. path的作用
/,当前网站中所有的URL都能读取到此值.
",只能在当前页面访问的到此数据
/index/ ,只能在/index/xxx的网页中查看.
菜鸟教程
https://www.runoob.com/js/js-cookies.html
session
依赖cookie 是一种存储数据的方式,依赖于cookie,
实现本质: 用户向服务端发送请求,服务端做两件事:第一步为此用户开辟一个独立的空间来存放当前用户独有的值.第2步生成随机字符串发给客户端 他保存在游览器中
在空间中如何想要设置值:
request.session['x1'] = 123
request.session['x2'] = 456
在空间中取值:
request.session['x2']
request.session.get('x2') 推荐
视图函数中的业务操作处理完毕,给用户响应,在响应时会 将随机字符串存储到用户浏览器的cookie中.
数据 django默认存在数据库中
装饰器
cookie和session的区别?
答:
cookie是存储在客户端浏览器上的键值对,发送请求时浏 览器会自动携带.
session是一种存储数据方式,基于cookie 实现,将数据存储在服务端(django默认存储到数据库).
其本质是:用户向服务端发送请求,服务端做两件事:生成随机字符串;
为此用户开辟一个独立的空间来存放当前用户独有的值. 在空间中如何想要设置值:
request.session['x1'] = 123 request.session['x2'] = 456
在空间中取值:
request.session['x2']
request.session.get('x2')
视图函数中的业务操作处理完毕,给用户响应,在响应时会 将随机字符串存储到用户浏览器的cookie中.
django和session相关的配置
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_DOMAIN = None #那个域名可以用 读取的到 none代表全部子域名
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径 /默认所有的
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输 True只可以读不可以改
SESSION_COOKIE_AGE = 1209600 #单位秒 Session的cookie失效日期(2周)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认false定时过期时间 如果改为true刷新一次过期时间程序计算
django中的session如何设置过期时间?
SESSION_COOKIE_AGE = 1209600 # Session的 cookie失效日期(2周)
django的session默认存储在数据库,可以放在其他地方吗?
小系统:默认放在数据库即可. 大系统:缓存(redis)
在settings文件 里面加入里面的代码
# 文件
# SESSION_ENGINE = 'django.contrib.sessions.backends.file'
# SESSION_FILE_PATH = '/sssss/'
# 缓存(内存)
# SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
# SESSION_CACHE_ALIAS = 'default'
#
# CACHES = {
# 'default': {
# 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
# 'LOCATION': 'unique-snowflake',
# }
# }
# 缓存(redis)
# SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
# SESSION_CACHE_ALIAS = 'default'
# CACHES = {
# "default": {
# "BACKEND": "django_redis.cache.RedisCache",
# "LOCATION": "redis://127.0.0.1:6379",
# "OPTIONS": {
# "CLIENT_CLASS": "django_redis.client.DefaultClient",
# "CONNECTION_POOL_KWARGS": {"max_connections": 100}
# # "PASSWORD": "密码",
# }
# }
# }
操作session
# 设置(添加&修改) request.session['x1'] = 123 request.session['x2'] = 456
# 读取 request.session['xx'] request.session.get('xx')
# 删除 del request.session['xx'] 其实是修改了过期时间
内容总结
1. 装饰器要加入functools.wrap装饰
2. orm字段中的verbose_name
3. 路由系统中记得加入终止符 $
4. 用户名和密码检测
5. 模板查找顺序
request.session.keys() request.session.values() request.session.items() request.session.set_expiry(value) request.session.session_key
通过js设置cookie
document.cookie = 'k1=wy222;path=/'
$.cookie('k1','wy222',{path:'/'})
注意:path不同会导致设置不同.
path的作用
/ , 当前网站中所有的URL都能读取到此值.
"",只能在当前页面访问的到此数据.
/index/ ,只能在/index/xxx 的网页中查看.
以上是关于cookie session的主要内容,如果未能解决你的问题,请参考以下文章