Django — 会话

目录

  • 一、Cookie
    • 1、介绍
    • 2、作用
    • 3、工作原理
    • 4、结构
    • 5、用途
    • 6、设置
    • 7、获取
  • 二、Session
    • 1、介绍
    • 2、作用
    • 3、工作原理
    • 3、类型
    • 4、用途
    • 5、设置
    • 6、获取
    • 7、清空信息
  • 三、Cookie 和 Session 的区别
    • 1、存储位置
    • 2、安全性
    • 3、数据大小
    • 4、跨页面共享
    • 5、生命周期
    • 6、实现机制
    • 7、适用场景
  • 四、Python 连接远程
  • 五、使用 Ubuntu 里面的虚拟环境
  • 六、Redis 配置和使用
    • 1、在虚拟环境中下载 Redis 的安装包
    • 2、代码实现

一、Cookie

1、介绍

Cookie 是一种在 Web 开发中用于在客户端和服务器之间存储小型数据的机制。它通常用于跟踪用户的会话、存储用户首选项以及实现其他与用户相关的功能。

字典类型,不同页面的 Cookie 有不同的内容。

2、作用

浏览器的缓存,网站的访问记录,让下次访问的时候能够直接的找出这个网站的地址,实现状态的保持。

3、工作原理

  • 当用户访问一个网站时,服务器可以通过 HTTP 响应将一个或多个 Cookie 发送到用户的浏览器中。
  • 浏览器将这些 Cookie 存储在本地,并在随后的每个 HTTP 请求中将它们发送回服务器。
  • 服务器可以根据这些 Cookie 来识别用户、跟踪会话、存储数据等。

4、结构

  • 名称:Cookie 的名称,用于标识 Cookie。
  • 值:与 Cookie 相关联的数据。
  • 域名:指定了 Cookie 有效的域名。
  • 路径:指定了 Cookie 有效的路径。
  • 过期时间:指定了 Cookie 的过期日期和时间。
  • 安全标志:指示浏览器仅在 HTTPS 连接中发送 Cookie。
  • HttpOnly 标志:指示 Cookie 只能通过 HTTP 请求访问,JavaScript 无法访问。

5、用途

  • 跟踪用户会话:Cookie 常用于跟踪用户的会话,以便在用户浏览不同页面时保持用户的登录状态。
  • 存储用户首选项:网站可以使用 Cookie 来存储用户的首选语言、主题、字体大小等。
  • 记住用户:网站可以使用 Cookie 来记住用户的用户名,使其在下次访问时无需重新登录。
  • 分析用户行为:Cookie 还可用于收集用户行为数据,用于分析和改进网站。
  • 广告定位:广告公司可以使用 Cookie 来跟踪用户的兴趣,向他们展示相关的广告。

6、设置

浏览器访问 Django,响应的时候设置 Cookie。

# Project 项目中的 urls.py
from django.urls import path,include  # 导入 Django 的 path 函数,用于配置 URL 路由,include 函数,用于将其它 URL 模式包含在当前 URL 配置中

# URL 配置列表,定义了网站的所有 URL 路径和对应的处理程序
urlpatterns = [
    # 配置 URL 路由
    path('', include('users.urls'))
]
# users 子应用的 urls.py
from django.urls import path  # 导入 Django 的 path 函数,用于配置 URL 路由
from .import views  # 导入当前目录下的 views.py 文件中的模块或视图函数

# URL 配置列表,定义 URL 路径和对应的处理程序
urlpatterns = [
    # 配置 URL 路由,调用 views.py 中的 set_cookie 视图函数
    path('set_cookie/',views.set_cookie)
]
# 子应用的 views.py
from django.shortcuts import render  # 导入 Django 的 render 函数,用于渲染模板并返回响应
from django.http import HttpResponse  # 导入 Django 的 HttpResponse 类,用于创建 HTTP 响应对象

# Create your views here.

# 定义视图函数
def set_cookie(request):
    '''
    设置 cookie 信息
    :param request:
    :return:
    '''
    response = HttpResponse('设置 cookie 成功!')
    response.set_cookie('name','abc')
    response.set_cookie('age','18')
    response.set_cookie('gender', 'male')
    return response

Django — 会话_第1张图片

Django — 会话_第2张图片

访问网站的其它页面时,Cookie 还在,关闭浏览器后再访问,Cookie 会清空。

# 设置 cookie 过期时间,是用秒进行计算,不要一起用
max_age=None  # 最大多少秒过期
expires=None  # 过期时间
# 子应用的 views.py
from django.shortcuts import render  # 导入 Django 的 render 函数,用于渲染模板并返回响应
from django.http import HttpResponse  # 导入 Django 的 HttpResponse 类,用于创建 HTTP 响应对象

# Create your views here.

# 定义视图函数
def set_cookie(request):
    '''
    设置 cookie 信息
    :param request:
    :return:
    '''
    response = HttpResponse('设置 cookie 成功!')
    response.set_cookie('name','abc',max_age=3600)
    response.set_cookie('age','18',max_age=3600)
    response.set_cookie('gender', 'male')
    return response

关闭浏览器后再访问其它页面时,设置时间的 Cookie 还在,没设置的会清空。

# users 子应用的 urls.py
from django.urls import path  # 导入 Django 的 path 函数,用于配置 URL 路由
from .import views  # 导入当前目录下的 views.py 文件中的模块或视图函数

# URL 配置列表,定义 URL 路径和对应的处理程序
urlpatterns = [
    # 配置 URL 路由,调用 views.py 中的 set_cookie2 视图函数
    path('set_cookie2/',views.set_cookie2)
]
# 子应用的 views.py
from django.shortcuts import render  # 导入 Django 的 render 函数,用于渲染模板并返回响应
from django.http import HttpResponse  # 导入 Django 的 HttpResponse 类,用于创建 HTTP 响应对象

# Create your views here.

# 定义视图函数
def set_cookie2(request):
    '''
    设置 cookie 信息
    :param request:
    :return:
    '''
    res = HttpResponse('设置 cookie')
    res.set_cookie('username','abc')
    return res

7、获取

作用:作为验证。

# users 子应用的 urls.py
from django.urls import path  # 导入 Django 的 path 函数,用于配置 URL 路由
from .import views  # 导入当前目录下的 views.py 文件中的模块或视图函数

# URL 配置列表,定义 URL 路径和对应的处理程序
urlpatterns = [
    # 配置 URL 路由,调用 views.py 中的 get_cookie 视图函数
    path('get_cookie/',views.get_cookie)
]
# 子应用的 views.py
from django.shortcuts import render  # 导入 Django 的 render 函数,用于渲染模板并返回响应
from django.http import HttpResponse  # 导入 Django 的 HttpResponse 类,用于创建 HTTP 响应对象

# Create your views here.

# 定义视图函数
def get_cookie(request):
    '''
    获取 cookie 信息
    :param request:
    :return:
    '''
    print(request)
    cookies = request.COOKIES
    print(cookies)
    return HttpResponse('获取 cookie')

二、Session

1、介绍

会话(Session)是一种在 Web 开发中用于跟踪用户状态和存储用户数据的机制。它允许在不同的 HTTP 请求之间保持用户的身份和数据,并且比 Cookie 更安全和灵活。

保持网站中用户访问的具体信息,必须依托于 Cookie,保存在服务器的数据库(Redis)里面。

2、作用

方便用户以后进行登录的状态保持

3、工作原理

  • 会话在服务器端维护,通常将会话数据存储在服务器上的一个数据存储区域中(如内存、数据库、缓存等)。
  • 当用户访问网站时,服务器为用户创建一个唯一的会话标识符(通常是会话 ID),并将该标识符存储在 Cookie 中或通过 URL 参数传递给客户端。
  • 客户端在随后的 HTTP 请求中发送会话 ID 给服务器,服务器使用该 ID 来识别用户并检索相应的会话数据。

3、类型

字典类型

4、用途

  • 跟踪用户会话:会话用于跟踪用户的登录状态,以确保用户在不同页面之间保持登录状态。
  • 存储用户数据:会话允许存储用户相关的数据,如购物车内容、用户首选项、用户配置等。
  • 跨页面共享数据:会话数据可以在不同页面之间共享,无需重复查询数据库或使用 Cookie。

5、设置

# Project 项目中的 urls.py
from django.urls import path,include  # 导入 Django 的 path 函数,用于配置 URL 路由,include 函数,用于将其它 URL 模式包含在当前 URL 配置中

# URL 配置列表,定义了网站的所有 URL 路径和对应的处理程序
urlpatterns = [
    # 配置 URL 路由
    path('', include('users.urls'))
]
# users 子应用的 urls.py
from django.urls import path # 导入 Django 的 path 函数,用于配置 URL 路由
from .import views # 导入当前目录下的 views.py 文件中的模块或视图函数

# URL 配置列表,定义 URL 路径和对应的处理程序
urlpatterns = [
    # 配置 URL 路由,调用 views.py 中的 set_session 视图函数
    path('set_session/',views.set_session)
]
# 子应用的 views.py
from django.shortcuts import render # 导入 Django 的 render 函数,用于渲染模板并返回响应
from django.http import HttpResponse # 导入 Django 的 HttpResponse 类,用于创建 HTTP 响应对象

# Create your views here.

# 定义视图函数
def set_session(request):
    '''
    设置 session
    :param request: 在请求参数中使用 session 方法,session是字典类型存储的
    :return:
    '''
    request.session['username'] = 'tang'
    request.session['age'] = 18
    return HttpResponse('设置 session')

Django — 会话_第3张图片

6、获取

# users 子应用的 urls.py
from django.urls import path # 导入 Django 的 path 函数,用于配置 URL 路由
from .import views # 导入当前目录下的 views.py 文件中的模块或视图函数

# URL 配置列表,定义 URL 路径和对应的处理程序
urlpatterns = [
	# 配置 URL 路由,调用 views.py 中的 get_session 视图函数
	path('get_session/',views.get_session)
]
# 子应用的 views.py
from django.shortcuts import render # 导入 Django 的 render 函数,用于渲染模板并返回响应
from django.http import HttpResponse # 导入 Django 的 HttpResponse 类,用于创建 HTTP 响应对象

# Create your views here.

# 定义视图函数
def get_session(request):
    '''
    获取 session
    :param request: 在哪里设置就从哪里拿
    :return:
    '''
    username = request.session['username']
    age = request.session['age']
    print(username)  # tang
    print(age)  # 18
    return HttpResponse('获取 session')

7、清空信息

# users 子应用的 urls.py
from django.urls import path # 导入 Django 的 path 函数,用于配置 URL 路由
from .import views # 导入当前目录下的 views.py 文件中的模块或视图函数

# URL 配置列表,定义 URL 路径和对应的处理程序
urlpatterns = [
	# 配置 URL 路由,调用 views.py 中的 flush_session 视图函数
    path('flush_session/',views.flush_session)
]
# 子应用的 views.py
from django.shortcuts import render # 导入 Django 的 render 函数,用于渲染模板并返回响应
from django.http import HttpResponse # 导入 Django 的 HttpResponse 类,用于创建 HTTP 响应对象

# Create your views here.

# 定义视图函数
def flush_session(request):
    '''
    清空 session 信息
    :param request:
    :return:
    '''
    request.session.flush()
    return HttpResponse('xxx')

Django — 会话_第4张图片

三、Cookie 和 Session 的区别

1、存储位置

  • Cookie 数据存储在客户端浏览器中。
  • Session 数据存储在服务器上。

2、安全性

  • Cookie 相对不够安全,因为数据存储在客户端,可能被篡改。
  • Session 更安全,数据存储在服务器端,不易被访问或修改。

3、数据大小

  • Cookie 通常有大小限制,每个 Cookie 较小。
  • Session 通常能够存储更多数据,不受大小限制。

4、跨页面共享

  • Cookie 可在不同页面之间共享,因为存储在客户端。
  • Session 也可在不同页面共享,但需要通过会话 ID 关联数据,存储在服务器端。

5、生命周期

  • Cookie 的生命周期由设置的过期时间或浏览器会话控制。
  • Session 通常在用户关闭浏览器或一段时间不活动后过期,由服务器控制。

6、实现机制

  • Cookie 由服务器发送到客户端,由浏览器管理。
  • Session 由服务器创建和管理,通常通过Web框架提供的工具。

7、适用场景

  • Cookie 适合存储少量不敏感数据,如用户首选项。
  • Session 适合存储敏感数据,如用户身份验证信息,需要安全管理的数据。

四、Python 连接远程

1、在 Ubuntu 终端输入命令查看 IP:

指路 Ubuntu 的安装

ip add

Django — 会话_第5张图片

2、在 PyCharm 里点击”工具“,选择”部署“,选择”配置“(连接远程需要用 PyCharm 专业版);

Django — 会话_第6张图片

3、点击“+”,选择“SFTP”;

Django — 会话_第7张图片

4、添加名称后,点击“确定”;

Django — 会话_第8张图片

5、点击“…”;

Django — 会话_第9张图片

6、点击“+”;

Django — 会话_第10张图片

7、主机里填之前查询到的 IP,用户名是 pyvip,密码是 pythonvip (Ubuntu 的用户名和密码),选择“保存密码”,点击“测试连接”;

Django — 会话_第11张图片

8、点击”确定“;

Django — 会话_第12张图片

9、点击”确定“;

Django — 会话_第13张图片

10、点击”测试连接“,点击”确定“;

Django — 会话_第14张图片

11、点击“自动检测”,会自动填入;

Django — 会话_第15张图片

12、在 Ubuntu 的终端里输入命令;

查看当前路径下的文件:ls

查看当前路径:pwd

创建文件夹:mkdir 文件夹名称

Django — 会话_第16张图片

13、点击“映射”,点击“部署路径”的“文件夹”,选择刚刚在 Ubuntu 里创建的文件夹;

Django — 会话_第17张图片

14、点击“确定”;

Django — 会话_第18张图片

15、在项目上右键点击,选择“部署”,选择“上传”,将本地的文件上传到 Ubuntu 的文件夹里面;

Django — 会话_第19张图片

16、在 Ubuntu 里查看已经上传的文件。

进入文件夹:cd 文件夹名称

查看当前路径下的文件:ls

Django — 会话_第20张图片

五、使用 Ubuntu 里面的虚拟环境

1、在 PyCharm 里点击“文件”,“设置”,找到“Python 解释器”,点击“添加解释器”,选择“SSH”;

Django — 会话_第21张图片

2、选择“现有”,点击“…”;

Django — 会话_第22张图片

3、选择想要的配置,点击“确定”;

Django — 会话_第23张图片

4、点击“移动”,点击“下一步”;

Django — 会话_第24张图片

5、点击“下一步”;

Django — 会话_第25张图片

6、在 Ubuntu 的终端中输入命令:

创建虚拟环境:mkvirtualenv -p python3 文件夹名称

查看:pip list

安装 django:pip install django==3.1.7

7、选择“现有”,点击“…”;

Django — 会话_第26张图片

8、找到“python3.6”,点击“确定”;

Django — 会话_第27张图片

9、点击“同步文件夹”的“文件夹”;

Django — 会话_第28张图片

10、把“远程路径”改成 /,点击“确定”;

Django — 会话_第29张图片

11、点击“创建”;

Django — 会话_第30张图片

12、点击“确定”;

Django — 会话_第31张图片

13、点击“工具”,选择“部署”,选择“配置”;

Django — 会话_第32张图片

14、点击“自动检测”;

Django — 会话_第33张图片

15、点击“映射”,点击“部署路径”的“文件夹”,选择对应文件夹,点击“确定”;

Django — 会话_第34张图片

16、点击“确定”;

Django — 会话_第35张图片

17、在项目文件夹上右键点击,选择“部署”,选择“上传”;

Django — 会话_第36张图片

18、点击“是”;

Django — 会话_第37张图片

19、再运行,就是运行远程的代码了,点击“编辑配置”;

Django — 会话_第38张图片

20、输入 IP 和端口号,点击“确定”;

Django — 会话_第39张图片

21、在 settings.py 文件里修改以下位置代码;

# settings.py
# 设置允许的主机列表(ip 地址、服务器地址、Ubuntu 的 ip),留空表示允许所有主机
ALLOWED_HOSTS = ['*']

22、在 manage.py 里运行代码,就可以在远程地址访问了。

Django — 会话_第40张图片

六、Redis 配置和使用

1、在虚拟环境中下载 Redis 的安装包

1、选择“工具”,选择“启动 SSH 会话”;

2、选择要连接的主机;

3、在终端输入命令。

pip install django-redis

2、代码实现

# setting.py
# Redis 配置,缓存数据库
CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/0',
        'OPTIONS': {
            'CLIENT_CLASS':'django_redis.client.DefaultClient',
        }
    },
    'code': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {
            'CLIENT_CLASS':'django_redis.client.DefaultClient',
        }
    },
}
# default 库名是不能修改的
# SESSION_ENGINE='django.contrib.sessions.backends.cache_db'  # 混合存储
# SESSION_ENGINE='django.contrib.sessions.backends.db'  # 缓存指定采用的数据库类型 默认采用数据库
# SESSION_ENGINE='django.contrib.sessions.backends.cache'  # redis
# SESSION_CACHE_ALIAS = "default"  # 指定缓存的数据库

# session 的存储配置
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 将 sessin 保持到 redis 中
SESSION_CACHE_ALIAS = 'default'  # 指定缓存的数据库

# 设置 session 失效时间,单位为秒
SESSION_COOKIE_AGE = 60*5
# Project 项目中的 urls.py
from django.urls import path,include  # 导入 Django 的 path 函数,用于配置 URL 路由,include 函数,用于将其它 URL 模式包含在当前 URL 配置中

# URL 配置列表,定义了网站的所有 URL 路径和对应的处理程序
urlpatterns = [
    # 配置 URL 路由
    path('', include('users.urls'))
]
# users 子应用的 urls.py
from django.urls import path  # 导入 Django 的 path 函数,用于配置 URL 路由
from .import views # 导入当前目录下的 views.py 文件中的模块或视图函数

# URL 配置列表,定义 URL 路径和对应的处理程序
urlpatterns = [
    # 配置 URL 路由,调用 views.py 中的 cx_redis 视图函数
    path('cx_redis/',views.cx_redis),
    # 配置 URL 路由,调用 views.py 中的 cx_redis2 视图函数
    path('cx_redis2/',views.cx_redis2)
]
# view.py
from django_redis import get_redis_connection  # 用于获取已配置的 Redis 连接,并返回一个与 Redis 服务器的连接对象

def cx_redis(request):
    '''
    Redis 缓存示例
    :param request: Django 请求对象
    :return: HttpResponse
    '''
    # 获取 Redis 连接,'default' 是 Redis 缓存配置中的别名
    conn = get_redis_connection('default')
    # 打印连接对象,可选,用于调试和检查连接是否正常
    print(conn)  # Redis>>
    # 设置一个名为 'age' 的键,对应的值为 100
    conn.set('age', 100)
    # 使用哈希数据结构设置 'k1' 键下的 'name' 字段的值为 '张三'
    conn.hset('k1', 'name', '张三')
    # 保存对Redis的修改(可选,取决于配置,有些情况下不需要手动保存)
    conn.save()
    # 获取 'age' 键的值并打印
    age = conn.get('age')
    print(age)  # b'100'
    # 获取 'k1' 键的所有字段及其对应的值,并打印
    k1_data = conn.hgetall('k1')
    print(k1_data)  # {b'name': b'\xe5\xbc\xa0\xe4\xb8\x89'}
    # 返回一个成功设置的消息
    return HttpResponse('设置成功')


def cx_redis2(request):
    '''
    Redis 缓存示例
    :param request: Django 请求对象
    :return: HttpResponse
    '''
    # 获取Redis连接,'code' 是 Redis 缓存配置中的别名
    conn = get_redis_connection("code")
    # 打印连接对象,可选,用于调试和检查连接是否正常
    print(conn)  # Redis>>
    # 设置一个名为 'age' 的键,对应的值为 100
    conn.set('age', 100)
    # 使用哈希数据结构设置 'k1' 键下的 'name' 字段的值为 '张三'
    conn.hset('k1', 'name', '张三')
    # 获取 session 中的 'name' 值(前提是需要在请求中有一个名为 'name' 的 session 值)
    session = request.session.get('name')
    print(session)  # None
    # 保存对 Redis 的修改(可选,取决于配置,有些情况下不需要手动保存)
    conn.save()
    # 获取 'age' 键的值并打印
    age = conn.get('age')
    print(age)  # b'100'
    # 获取 'k1' 键的所有字段及其对应的值,并打印
    k1_data = conn.hgetall('k1')
    print(k1_data)  # {b'name': b'\xe5\xbc\xa0\xe4\xb8\x89'}
    # 获取不存在的 'k2' 键的所有字段及其对应的值,并打印(会返回空字典)
    k2_data = conn.hgetall('k2')
    print(k2_data)  # {}
    # 删除 'k1' 键下的 'name' 字段
    conn.hdel('k1', 'name')
    # 打印删除后的 'k1' 键的所有字段及其对应的值('name' 字段已被删除)
    print(conn.hgetall('k1'))  # {}
    # 返回一个成功获取的消息作为 HTTP 响应
    return HttpResponse("获取成功")

记录学习过程,欢迎讨论交流,尊重原创,转载请注明出处~

你可能感兴趣的:(Django,django,python)