当你考虑开发现代化、高效且可扩展的网站和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
-
可以使用
django.http.HttpResponse
来构造响应对象HttpResponse(content=响应体, content_type=响应体数据MIME类型, status=状态码)
MIME(Multipurpose Internet Mail Extensions)
多用途互联网邮件扩展类型:
* `text/html` html
* `text/plain` 普通文本
* `application/json` json
-
响应头设置: 可以直接将
HttpResponse
对象当做字典进行响应头键值对的设置response = HttpResponse('响应内容') response['Itcast'] = 'Python' # 自定义响应头Itcast, 值为Python
2. JsonResponse对象
-
帮助我们将数据转换为json字符串,再返回给客户端
-
会设置响应头
Content-Type
为application/json
from django.http import JsonResponse def resp(request): return JsonResponse({'city': 'beijing', 'subject': 'python'})
-
当包含的内容中包含中文时,会返回该中文对应的编码,例如:
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配置项名'),
]
- 动态生成url地址
url = reverse('命名空间:url配置项名称')
# 或者,可以没有命名空间:
url = reverse('url配置项名称')
# 示例1: 生成的url的值为 /index
url = reverse('users:index')
# 示例2: 生成的url的值为 /index
url = reverse('index')
Cookie
- 浏览器请求服务器是无状态的
- 浏览器的每一次请求对于服务器来说都是新的
- 服务器默认不会保存用户的状态数据
- 但很多时候,服务器需要保存用户的一些状态数据,比如:用户是否登录过,用户浏览过哪些商品等
- 解决方案,有两种:
- cookie
- session
一、 关 于Cookie
-
cookie及特点
-
Cookie是由服务器(网站)生成的,存储在浏览器端的 键 值对数据(通常经过加密) 2. 在响应请求时,服务器会把生成 Cookie 数据 发给浏览器,浏览器会自动保存
(前提:浏览器开启了cookie功能)- 浏 览器请求服务器(网站)时,会自动上传该服务器(网站)生成的所有Cookie
- Cookie基于 域 名安全 的
- 每个网站只能访问到自己生成的cookie,无法访问其它网站(域)生成的cookie
-
-
Cookie的应用
- 保存登录状态:当用户登录某网站后,一定时间内不用再次输入用户名和密码登录。 2. 保存用户浏览器的商品: 再次访问网站时,把用户之前浏览过的商品记录显示出来
二、Django中Cookie的保存和读取
-
保 存cookie: 通过
HttpResponse
响应对象的set_cookie
方法保存response.set_cookie('键', '值',max_age)
* `max_age` 有效期,一个整数,单位为秒,表示在多长时间后失效
* **Cookie 默认有效期**: 如果不指定有效期,或者`max_age`值为`None`,则关闭浏览器后Cookie数据就会过期
- 读 取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数据
-
实现参考
-
url配置
urlpatterns = [ url(r'^set_cookie$', views.set_cookie), url(r'^get_cookie$', views.get_cookie), ]
-
视图函数
-
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)
- 测试
保存cookie键值对数据
读取cookie数据
Session
一 、Session介绍
1. `session`与`cookie`对比
1. `cookie`是在浏览器端保存键值对数据,而`session`是在服务器端保存键值对数据
2. 重要敏感的数据(银行卡账号,验证码,余额等),建议存储在服务器端,不能通过cookie保存到浏览器
3. `session` 的使用依赖 `cookie`
2. Django中`session`数据的保存
1. 生活例子
2. session键值对数据保存
3. `session`数据默认保存在django项目的一张数据库表中(表名为:`django_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',
]
-
生 成django项目默认的数据库表
-
session
数据默认保存在django项目的一张数据库表中(表名为:django_session
)2. **在 保存session数据库前,需要先生成django项目默认的数据库表** 3. 如何生成: 打开终端,并进入到项目根目录下,再执行以下2个命令生成数据库表: python manage.py makemigrations python manage.py migrate
-
-
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到redis中
使用第三方包 django-redis
实现**
- 在虚拟环境下安装包
pip install django-redis==4.8.0
- 修改
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"
- 测试: 启 动Redis服务器,登录一次,再查看session是否有保存到 redis 1号数据库中
类视图
学习目标
- 掌握Django中类视图的使用
- 掌握类视图中使用装饰器
- 能够使用类视图多继承和mixin扩展类