当你考虑开发现代化、高效且可扩展的网站和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扩展类

未完待续 下一期下一章

完整笔记请看文章开头