首页 > 其他分享 >【django框架】共4大模块50页md学习文档 第5篇:django的请求与响应详解

【django框架】共4大模块50页md学习文档 第5篇:django的请求与响应详解

时间:2023-11-09 22:33:49浏览次数:50  
标签:md url request 50 django session cookie user

当你考虑开发现代化、高效且可扩展的网站和Web应用时,Django是一个强大的选择。Django是一个流行的开源Python Web框架,它提供了一个坚实的基础,帮助开发者快速构建功能丰富且高度定制的Web应用

整套Django笔记直接地址: 请移步这里


共 10 章,31 子模块


请求与响应

学习目标

  • 掌握request对象使用
  • 掌握response对象使用
  • 掌握Django中cookie的使用
  • 掌握Django中session的使用

响应

  • 视图必须返回一个 HttpResponse 对象(或其子类对象),不能像Flask一样直接返回字符串
  • 可以将要返回的字符串数据传给 HttpResponse 对象再返回
  • HttpRequest对象由Django创建,HttpResponse对象由开发人员创建
  • HttpResponse 的常用子类
    • HttpResponseRedirect 重定向
    • JsonResponse 返回json数据

1. HttpResponse

  1. 可以使用django.http.HttpResponse来构造响应对象

    HttpResponse(content=响应体, content_type=响应体数据MIME类型, status=状态码)

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型:

* `text/html` html
* `text/plain` 普通文本
* `application/json` json
  1. 响应头设置: 可以直接将HttpResponse对象当做字典进行响应头键值对的设置

    response = HttpResponse('响应内容') response['Itcast'] = 'Python' # 自定义响应头Itcast, 值为Python

2. JsonResponse对象

  1. 帮助我们将数据转换为json字符串,再返回给客户端

  2. 会设置响应头 Content-Typeapplication/json

    from django.http import JsonResponse
    
    def resp(request):
        return JsonResponse({'city': 'beijing', 'subject': 'python'})
    
  3. 当包含的内容中包含中文时,会返回该中文对应的编码,例如:

def resp(request):
# 最终看到的效果是: {"name": "\u5f20\u4e09"}
response = JsonResponse({"name":"张三"})
     return response

解决:JsonResponse(data, json_dumps_params={'ensure_ascii':False})

4. JsonResponse可以接收非字典数据,需要指定 `safe=False`

3. redirect重定向

  • 重定向: 不返回具体显示内容给客户端,让客户端重新请求返回的地址,内容
from django.shortcuts import redirect

def resp(request):
    # 重定向到首页
    # return HttpResponseRedirect('/index')
    return redirect('/index')

reverse函数

reverse函数: 动态生成URL地址,解决url硬编码维护麻烦的问题。

使用方式:

1. 配置url
# 项目的urls.py
urlpatterns = [
    # 示例: 应用名可指定为 users
    url(r'^', include('users.urls', namespace='应用名')),  
]
# 应用的urls.py
urlpatterns = [
	# 示例: url配置项名 可指定为 index
    url(r'^index$', views.index, name='url配置项名'),
]
  1. 动态生成url地址
url = reverse('命名空间:url配置项名称')    
# 或者,可以没有命名空间:     
url = reverse('url配置项名称')
# 示例1: 生成的url的值为 /index
url = reverse('users:index')  
# 示例2: 生成的url的值为 /index
url = reverse('index')

Cookie

  • 浏览器请求服务器是无状态的
    • 浏览器的每一次请求对于服务器来说都是新的
    • 服务器默认不会保存用户的状态数据
  • 但很多时候,服务器需要保存用户的一些状态数据,比如:用户是否登录过,用户浏览过哪些商品等
  • 解决方案,有两种:
    • cookie
    • session

一、 关 于Cookie

  1. cookie及特点

    1. Cookie是由服务器(网站)生成的,存储在浏览器端的 键 值对数据(通常经过加密) 2. 在响应请求时,服务器会把生成 Cookie 数据 发给浏览器,浏览器会自动保存
      (前提:浏览器开启了cookie功能)

      1. 浏 览器请求服务器(网站)时,会自动上传该服务器(网站)生成的所有Cookie
      2. Cookie基于 域 名安全
    • 每个网站只能访问到自己生成的cookie,无法访问其它网站(域)生成的cookie
  2. Cookie的应用

    1. 保存登录状态:当用户登录某网站后,一定时间内不用再次输入用户名和密码登录。 2. 保存用户浏览器的商品: 再次访问网站时,把用户之前浏览过的商品记录显示出来

image

二、Django中Cookie的保存和读取

  1. 保 存cookie: 通过HttpResponse响应对象的set_cookie方法保存

    response.set_cookie('键', '值',max_age)

* `max_age` 有效期,一个整数,单位为秒,表示在多长时间后失效
* **Cookie 默认有效期**: 如果不指定有效期,或者`max_age`值为`None`,则关闭浏览器后Cookie数据就会过期
  1. 读 取cookie: 通过HttpRequest请求对象的COOKIES属性(字典类型)读取
request.COOKIES['键']
# 或者:
request.COOKIES.get('键')

三、案例

1. 需求: 使用cookie保存登录的用户名和用户id 

* 访问 `http://127.0.0.1:8000/set_cookie` 界面时,保存cookie数据
* 访问 `http://127.0.0.1:8000/get_cookie` 界面时,读取cookie数据
  1. 实现参考

    1. url配置

      urlpatterns = [
       url(r'^set_cookie$', views.set_cookie),
       url(r'^get_cookie$', views.get_cookie),
      ]
      
    2. 视图函数

 
def set_cookie(request):
    """保存cookie键值对数据"""
    response = HttpResponse('保存cookie数据成功')
    response.set_cookie('user_id', 10)
    response.set_cookie('user_name', 'admin')
    return response

def get_cookie(request):
    """读取cookie键值对数据"""
    user_id = request.COOKIES.get('user_id')
    user_name = request.COOKIES.get('user_name')
    text = 'user_id = %s, user_name = %s' % (user_id, user_name)
    return HttpResponse(text)

  1. 测试

保存cookie键值对数据

读取cookie数据

Session

一 、Session介绍

1. `session`与`cookie`对比

       1. `cookie`是在浏览器端保存键值对数据,而`session`是在服务器端保存键值对数据
              2. 重要敏感的数据(银行卡账号,验证码,余额等),建议存储在服务器端,不能通过cookie保存到浏览器
                     3. `session` 的使用依赖 `cookie`
2. Django中`session`数据的保存

       1. 生活例子

session模块

2. session键值对数据保存

session模块

3. `session`数据默认保存在django项目的一张数据库表中(表名为:`django_session`),保存格式如下:

session模块

  * 不同的用户使用各自不同的浏览器,可以认为:一个浏览器代表一个用户
  * 【重要】表中一条记录,保存着一个浏览器(用户)所有的session键值对数据
  * 【重要】`sessionid` 是什么: 浏览器标识(用户标识),代表着一个用户, **通 过`sessionid` 可以找到该用户所有的session键值对数据**

二 、Session使用

1. 开启session功能【默认已经开启】

django封装了session模块,用来简化session数据操作。请参见settings.py 配置文件中session配置:

INSTALLED_APPS = [
    ...
    # 默认导入了django自带的session模块
    'django.contrib.sessions',
]

MIDDLEWARE = [
    ...
    # 开启session中间件
    'django.contrib.sessions.middleware.SessionMiddleware',
]
  1. 生 成django项目默认的数据库表

    1. session数据默认保存在django项目的一张数据库表中(表名为:django_session)

      2. **在 保存session数据库前,需要先生成django项目默认的数据库表**
      3. 如何生成: 打开终端,并进入到项目根目录下,再执行以下2个命令生成数据库表:
      python manage.py makemigrations
      python manage.py migrate
      
  2. session数据操作

request.session属性:类型为 django.contrib.sessions.backends.db.SessionStore

* 保存session数据( **键 值对**)
    
request.session['键']=值


* 读取session数据
    
request.session.get('键', 默认值)
* 删除命令
# 删除一个sessoin键值对(注意:键不存在会报错 `KeyError`)
del request.session['键']
# 清除当前访问用户所有的session数据
request.session.flush()  # 删除一条表记录
request.session.clear()  # 清空字段中的session键值对数据
* 设置session数据有效时间; **如 果不设置,默认过期时间为两周**

request.session.set_expiry(value)
* 如果value是一个整数,则 session数据 将在value秒没有活动后过期
* 如果value为0,则 session数据 将在用户 **关 闭浏览器时过期**
* 如果value为None,则 session数据 将在 **2 周后过期**

三 、案例

  • 需求:

    • 使用session保存 登录用户名 和 验证码:
    • 访问 http://127.0.0.1:8000/set_session 界面时,保存session数据
    • 访问 http://127.0.0.1:8000/get_session 界面时,读取session数据
  • 实现参考

# url配置
url(r'^set_session$', views.set_session),
url(r'^get_session$', views.get_session),

# 视图函数
def set_session(request):
    """保存session键值对数据"""
    request.session['user_id'] = 10
    request.session['user_name'] = 'admin'
    return HttpResponse('保存session成功')

def get_session(request):
    """读取session键值对数据"""
    user_id = request.session.get('user_id')
    user_name = request.session.get('user_name')
    text = 'user_id = %s, user_name = %s' % (user_id, user_name)
    return HttpResponse(text)

测试:保存结果,需要作base64解码

session模块

四、保存session到redis中

使用第三方包 django-redis实现**

  1. 在虚拟环境下安装包
pip install django-redis==4.8.0
  1. 修改settings.py文件,新增如下选项:
# django项目的缓存配置
CACHES = {
"default": {
 "BACKEND": "django_redis.cache.RedisCache",
 "LOCATION": "redis://127.0.0.1:6379/1",
 "OPTIONS": {
     "CLIENT_CLASS": "django_redis.client.DefaultClient",
         "PASSWORD": ""
 }
}
}
# session数据缓存到Redis中
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

  1. 测试: 启 动Redis服务器,登录一次,再查看session是否有保存到 redis 1号数据库中

类视图

学习目标

  • 掌握Django中类视图的使用
  • 掌握类视图中使用装饰器
  • 能够使用类视图多继承和mixin扩展类

未完待续 下一期下一章

完整笔记请看文章开头

标签:md,url,request,50,django,session,cookie,user
From: https://blog.51cto.com/u_13578013/8285986

相关文章

  • 【Django-DRF笔记】使用md笔记0基础到高手. 第(5)篇:Django-DRF序列化和反序列化
    本文从分析现在流行的前后端分离Web应用模式说起,然后介绍如何设计RESTAPI,通过使用Django来实现一个RESTAPI为例,明确后端开发RESTAPI要做的最核心工作,然后介绍DjangoRESTframework能帮助我们简化开发RESTAPI的工作。DRF完整版笔记直接地址:请移步这里共5章,24子模块,总计......
  • Django 三板斧的使用 链接数据库
    Django三板斧的使用全局配置文件静态文件的配置request对象的几个方法pycharm链接数据库MySQLDjango链接数据库MySQLORM的使用今日内容详细三板斧的使用三个方法:HttpResponserenderredirectdefindex(request):print('request')#returnHttpResponse......
  • Django框架的基本使用
    在启动django项目的时候一定要确保一个端口只有一个项目创建项目后必须检查settings的app是否注册和templates的DIRSdjango默认的端口号是8000浏览器缓存(开发者面板操作)浏览器右键检查-settings设置-networks网络-disablecache(禁用缓存)命令行操作先选择要创建项目的存储......
  • Django简介
     django官方文档:https://docs.djangoproject.com/ 技术方面翻译文档:https://yiyibooks.cn/ 大而全:自身携带的功能非常多缺陷:开发小项目时使用该框架过于笨重(不建议)django默认端口号:8000   django框架版本计算机名称内最好不要含有中文(我的电脑-右键-属性)......
  • 【python进阶】14大模块200页知识体系md笔记,第5篇:python下的linux命令使用
    本文从14大模块展示了python高级用的应用。分别有Linux命令,多任务编程、网络编程、Http协议和静态Web编程、html+css、JavaScript、jQuery、MySql数据库的各种用法、python的闭包和装饰器、mini-web框架、正则表达式等相关文章的详细讲述。全套Python笔记直接地址:请移步这里共......
  • 方法|基于T507开发板讲如何将占用引脚配置为普通GPIO
    方法|基于T507开发板讲如何将占用引脚配置为普通GPIO根据T5用户手册描述,只有在不使用多路复用功能的情况下,这些端口才可以配置为GPIO,所以我们需要把引脚的复用功能关闭。将被占用引脚配置为普通1.查看引脚默认功能配置2.关闭引脚默认功能配置以UART4-TX的PI13为例,这是PI13引脚复用......
  • 方法|基于T507开发板讲如何将占用引脚配置为普通GPIO
    根据T5用户手册描述,只有在不使用多路复用功能的情况下,这些端口才可以配置为GPIO,所以我们需要把引脚的复用功能关闭。将被占用引脚配置为普通 GPIO方法思路1.查看引脚默认功能配置2.关闭引脚默认功能配置以UART4-TX的PI13为例,这是PI13引脚复用表,打开T5_Series_User_Manual_V1.0手册......
  • 全志T507-H技术帖 | 去掉IO扩展芯片后保留扩展引脚功能的实现方法
    飞凌嵌入式推出的OKT507-C作为一款广受欢迎的开发板拥有丰富的功能接口,而实际上OKT507-C开发板的CPU引脚资源是比较紧缺的,那么它究竟是如何提供如此丰富的接口资源的呢?答案就是IO扩展芯片——TCA6424A。这是一个24位I2C和系统管理总线(SMBus),输入输出(I/O)扩展器有中断输出......
  • [Python]PIL-CVE-2018-16509 复现
    [Python]PIL-CVE-2018-16509复现这个问题跟上一个差不多。exp:%!PS-Adobe-3.0EPSF-3.0%%BoundingBox:-0-0100100userdict/setpagedeviceundefsavelegal{nullrestore}stopped{pop}if{legal}stopped{pop}ifrestoremark/OutputFile(%pipe%pytho......
  • 使用cmd设置Windows环境变量
    一、查看1、查看全部环境变量set2、查看pa开头的环境变量(其他开头的类似)rem键值中存在空格等特殊符号的使用双引号包裹,下同。setpa二、新增1、临时环境变量set"KEY"="value"2、永久环境变量a、用户变量setx"KEY""value"b、系统变量setx"KEY""value"/m......