python中的cookie和session

Cookie

有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。

Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明。Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,这样服务器可以知道该用户是否是合法用户以及是否需要重新登录等。服务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。Cookies最典型记住用户名。

Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用。

1、Cookie的特点

Cookie以键值对Key-Value形势进行信息的存储。
保存在用户浏览器端的键值对, 向服务端发请求时会自动携带
Cookie基于域名安全,不同域名的Cookie是不能互相访问的

2 、cookie的基本操作

    # 设置Cookies,可以通过HttpResponse对象中的set_cookie方法来设置cookie。
    HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
    max_age 单位为秒,默认为None。如果是临时cookie,可将max_age设置为None。
    例:response.set_cookie("cookie_key","value")
    
    # 获取Cookies(字典类型)
    value = request.COOKIES["cookie_key"]
    request.COOKIES.get('xx')
    
    # 删除Cookies
    response.delete_cookie("cookie_key",path="/",domain=name)
    
    # 检测Cookies
    if "cookie_name" is request.COOKIES :
    
    # rep.set_signed_cookie(key,value,salt='加密盐',...)
    参数:
        key,              键
        value='',         值
        max_age=None,     超时时间,表示多少秒数之后失效
        expires=None,     超时时间,表示失效的时间点。支持datetime 和 time.time
        path='/',         Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问
        domain=None,      Cookie生效的域名
        secure=False,     https传输
        httponly=False    只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

    由于cookie保存在客户端的电脑上,所以,JavaScript和jquery也可以操作cookie。
    <script src='/static/js/jquery.cookie.js'></script>
    $.cookie("list_pager_num", 30,{ path: '/' });

Session

称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。

1、Session 的作用

Session 的作用就是它在 Web服务器上保持用户的状态信息供在任何时间从任何设备上的页面进行访问。因为浏览器不需要存储任何这种信息,所以可以使用任何浏览器,即使是像 Pad 或手机这样的浏览器设备。

2、 Session的特点

一种存储数据的方式,依赖cookies
存储敏感、重要的信息
支持更多字节
Session共享问题
Session配置和存储
用户向服务端发送请求, 服务端做两件事,生成随机字符串,为此用户开辟一个独立的空间来存放当前用户独有的值.

3、启用Session

Django项目默认启用Session,可以在settings.py文件中查看
在这里插入图片描述
禁用session,将上图中的session中间件注释掉即可。

4、存储方式

在settings.py文件中,设置session数据的存储方式:内存缓存存储、文件存储、数据库存储。

Django中session相关的配置

SESSION_ENGINE=‘django.contrib.sessions.backends.db’
# Session的存储方式
SESSION_COOKIE_NAME = "sessionid" 
# Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_DOMAIN = None 
# api.baidu.com /www.baidu.com/ xxx.baidu.com
SESSION_COOKIE_PATH = "/" 
# Session的cookie保存的路径
SESSION_COOKIE_HTTPONLY = True 
# 是否Session的cookie只支持http传输
SESSION_COOKIE_AGE = 1209600 
# Session的cookie失效日期(2周)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False 
# 是否关闭浏览器使得Session过期
SESSION_SAVE_EVERY_REQUEST = False 
# 是否每次请求都保存Session,默认修改之后才保存

4.1 数据库存储

存储在数据库中,如下设置可以写,也可以不写,这是默认存储方式。

    SESSION_ENGINE=‘django.contrib.sessions.backends.db’

如果存储在数据库中,需要在项INSTALLED_APPS中安装Session应用。
在这里插入图片描述

4.2 文件

服务器端本地存储

SESSION_ENGINE ='django.contrib.sessions.backends.file'
SESSION_FILE_PATH = '/sssss/'

4.3 本地缓存

存储在用户端内存中,如果丢失则不能找回,比数据库的方式读写更快。

    SESSION_ENGINE=‘django.contrib.sessions.backends.cache’
    SESSION_CACHE_ALIAS = 'default'
    CACHES = {
        'default':{
            'BACKEND':'django.core.cache.backends.locmem.LocMemCache',
			'LOCATION': 'unique-snowflake',
		}
    }

4.4 混合存储

优先从用户端内存中存取,如果没有则从数据库中存取。

    SESSION_ENGINE=‘django.contrib.sessions.backends.cached_db’

4.5 Redis存储

在redis中保存session,需要引入第三方扩展,我们可以使用django-redis来解决。
1) 安装扩展

    pip install django-redis

2)配置
在settings.py文件中做如下设置

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/1",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

注意:
如果redis的ip地址不是本地回环127.0.0.1,而是其他地址,访问Django时,可能出现Redis连接错误,如下:
在这里插入图片描述
解决方法:
修改redis的配置文件,添加特定ip地址。打开redis的配置文件

sudo vim /etc/redis/redis.conf

在如下配置项进行修改(如要添加10.211.55.5地址)

在这里插入图片描述

重新启动redis服务

    sudo service redis-server restart

4.6 Django自带的sqlite存储

1)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中查看是否有’django.contrib.sessions.middleware.SessionMiddleware’ ,没有添加即可

2)使用django自带的模块处理session值,用sqlite数据库存储session需要初始化数据库,在manage.py文件所在目录下执行命令:

python manage.py makemigrations
python manage.py migrate

3)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)

4)请求的中间件

安全认证、请求过滤以及session的初始值 我们可以在中间件中处理。
在django common项目下,新增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后

5、Session操作

通过HttpRequest对象的session属性进行会话的读写操作。

    # 以键值对的格式写session
    request.session[‘键’]=# 根据键读取值
    request.session[‘键’] (没有数据会报错)
    request.session.get(‘键’)
    
    #清除所有session,在存储中删除值部分
    request.session.clear()
    
    #清除session数据,在存储中删除session的整条数据
    request.session.flush()
    
    # 删除session中的指定键及值,在存储中只删除某个键及对应的值
    del request.session[‘键’]
    
    # 设置session的有效期
    request.session.set_expiry(value)
    注:
    如果value是一个整数,session将在value秒没有活动后过期。
    如果value为0,那么用户session的Cookie将在用户的浏览器关闭时过期。
    如果value为None,那么session有效期将采用系统默认值,默认为两周,可以通过在settings.py中设置SESSION_COOKIE_AGE来设置全局默认值。
    
    # 其他操作
    request.session.keys()    # 取键
    request.session.values()  # 取值
    request.session.items()   # 取键值对
    request.session.set_expiry(value)  # 设置过期时长, 可以是整数(秒), 可以是datetime
    request.session.session_key # 取随机字符串
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python爬虫cookiesession是两个重要的概念。 Cookie是服务器在客户端存储的一小段文本信息,用于记录用户的登录状态、浏览历史等信息。在Python爬虫,我们可以使用requests库cookies参数来设置和获取cookie信息。 Session是一种记录用户状态的机制,它可以在不同的请求之间保持用户的登录状态。在Python爬虫,我们可以使用requests库Session对象来创建一个会话,从而实现登录、保持登录状态等操作。通过Session对象,我们可以方便地管理cookie信息,实现自动登录和持久化会话等功能。 ### 回答2: Python爬虫是指使用Python语言编写程序,自动获取互联网上的信息并进行数据分析或者存储的技术。而CookieSession则是爬虫程序常用的两种技术,它们的作用是帮助爬虫程序模拟网站的登录情况和维持网站和爬虫程序之间的会话状态,以便进行身份认证和绕过防护机制。 Cookie是存储在浏览器客户端的数据,主要用于表示用户身份、用户访问时间、用户信息等,如用户访问某个网站时会在浏览器创建一个Cookie,这个Cookie信息会被服务器进行读取和处理。当爬虫程序需要模拟网站登录时,需要获取并保存服务器返回的Cookie,以便后续更好的请求和响应网站数据。Python通过requests模块进行Cookie的使用。requests模块有一个Session对象,默认情况下,Session对象会存储Cookie到本地,这就相当于保存了用户的登录状态,方便后面的请求使用。在requests的get和post方法调用时,通过传递session对象作为第一个参数,就可以在整个请求过程使用保存过的Cookie信息。具体使用方法如下: ``` # 创建session对象 import requests session = requests.Session() # 网站登录请求 session.post(login_url, data=user_data) # 获取用户信息 user_info = session.get(user_url) ``` 而Session则是保存Web应用程序会话的数据结构,即Session是由Web应用程序使用的一种机制,该机制通过在客户端存储或通过增加HTTP Cookie的方式传递标识符来维护状态信息。Session的数据保存在服务器端,每次请求时都会带上保存在CookieSession ID,服务器根据Session ID来查找对应的Session对象。在Python,我们可以通过Flask、Django等Web框架来实现Session的使用。 综上,CookieSession是爬虫程序非常重要的技术,能够帮助爬虫程序更好地模拟登录和保持会话,让爬虫程序更快速、准确地抓取网站信息。但需要注意的是,爬虫程序的使用需要遵守网站的相关规定和道德底线,不得违反相关法律法规和道德规范。 ### 回答3: Python爬虫是一个广泛应用于网络数据抓取和处理的技术。在Python爬虫cookiesession是非常重要的概念,它们有助于实现身份验证和保持用户会话状态。在本篇文章,我们将具体介绍cookiesessionPython爬虫的应用。 1. Cookie Cookie是一种客户端存储机制,通常由Web服务器在HTTP响应头返回。Cookie可以包含存储在客户端计算机上的信息,并在相应的HTTP请求发送回服务器。Python的Requests库可以方便地处理Cookie,使用方法如下: ``` import requests # 创建Session对象 s=requests.Session() # 访问登陆页,获取cookie s.get('http://www.example.com/login') # 从响应读取cookie cookie=s.cookies.get_dict() # 发送带有cookie的请求 s.get('http://www.example.com/user',cookies=cookie) ``` 从上面的代码可以看出,通过创建一个Session对象,我们可以在访问登陆页时获取Cookie,在后续请求Cookie发送回服务器。这种方式可以模拟用户登陆状态,方便爬取需要用户身份验证的数据。 2. Session Session是另一种用于跟踪用户会话状态的机制。与Cookie不同,Session是由Web服务器在服务器端管理的。当用户发送请求时,服务器会为用户创建一个Session,该Session在Web服务器上存储。Python也可以方便地使用Session来处理会话状态,使用方法如下: ``` import requests # 创建Session对象 s=requests.Session() # 在Session发起请求 s.get('http://www.example.com/user') ``` 通过创建一个Session对象,我们可以在爬取时保持用户的会话状态,实现一些需要用户登录后才能进行的操作。与Cookie不同,Session的内部机制是由Web服务器实现的,并不需要我们自己去处理。 总结 从上述内容可以看出,CookieSessionpython爬虫起着至关重要的作用。Cookie可以方便地处理用户身份验证,从而实现一些需要用户身份验证的操作。而Session则可以方便地处理用户会话状态,为用户提供一种无缝的体验,在爬虫也有广泛的应用。因此,Python爬虫开发者应该熟练掌握CookieSession的用法,以便在爬取数据时更加高效、方便。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值