HttpResponse
对象(或其子类对象),不能像Flask一样直接返回字符串HttpResponse
对象再返回HttpRequest
对象由Django创建,HttpResponse
对象由开发人员创建HttpResponse
的常用子类
HttpResponseRedirect
重定向JsonResponse
返回json数据可以使用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
帮助我们将数据转换为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`
from django.shortcuts import redirect
def resp(request):
# 重定向到首页
# return HttpResponseRedirect('/index')
return redirect('/index')
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 = reverse('命名空间:url配置项名称')
# 或者,可以没有命名空间:
url = reverse('url配置项名称')
# 示例1: 生成的url的值为 /index
url = reverse('users:index')
# 示例2: 生成的url的值为 /index
url = reverse('index')
一、 关 于Cookie
cookie及特点
Cookie是由服务器(网站)生成的,存储在浏览器端的 键 值对数据(通常经过加密)
2. 在响应请求时,服务器会把生成 Cookie 数据 发给浏览器,浏览器会自动保存
(前提:浏览器开启了cookie功能)
Cookie的应用
二、Django中Cookie的保存和读取
保 存cookie: 通过HttpResponse
响应对象的set_cookie
方法保存
response.set_cookie(‘键’, ‘值’,max_age)
* `max_age` 有效期,一个整数,单位为秒,表示在多长时间后失效
* **Cookie 默认有效期**: 如果不指定有效期,或者`max_age`值为`None`,则关闭浏览器后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数据
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键值对数据**
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 周后过期**
需求:
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解码
使用第三方包 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"