响应对象
HttpResponse
respone = HttpResponse(content=响应体, content_type=响应体数据MIME类型, status=状态码)
respone['响应头key'] = 响应头值
JsonResponse【重点】
# 传递字典类型的数据 content_type: application/json
JsonResponse({"city":"广州"})
# 传递列表数据
JsonResponse([{"city":"广州"}, {'name': '北京'}], safe=False)
重定向
def resp(request):
# 重定向到首页 状态码:302
# HttpResponseRedirect
return redirect('/index')
reverse函数【知道-用得较少】
动态地生成url地址,解决url重定向硬编码维护麻烦的问题
url配置:
# 项目的urls.py
url(r'^', include('users.urls', namespace='命名空间')),
# 应用的urls.py
url(r'^index$', views.index, name='url配置项名'),
# 生成方式
url = reverse('命名空间:url配置项名称')
<RegexURLPattern index ^index$>,
<RegexURLPattern None ^resp$>,
<RegexURLPattern None ^my_redirect$>,
<RegexURLPattern None ^set_cookie$>,
示例
# 项目的urls.py
url(r'^', include('users.urls', namespace='users')),
# 应用的urls.py
url(r'^home$', views.index, name='index'),
def my_redirect(request):
# 生成的url的值为 /home
url = reverse('users:index')
return redirect(url) # 重定向
状态保存【理解】
cookie
特点:
- 由服务器生成保存在客户端的键值对数据
操作
-
保存cookie:使用 响应对象:
response.set_cookie('键', 值)
-
读取cookie: 使用 request对象:
request.COOKIES.get('键)
有效期:默认为关闭浏览器后 cookie 就失效
session
-
session工作原理
-
django默认保存session到数据库表中
-
一条记录保存一个浏览器(一个用户)的所有的session键值对数据
-
通过sessionid来区分不同的浏览器(不同用户)
-
-
通过session相关命令
request.session['键']= 值 # 保存 request.session.get('键') # 读取 request.session.set_expiry(value) # 设置有效期,默认为2周 del request.session['键'] # 删除一个键值 request.session.flush() # 删除当前访问用户所有session数据: 删除一条表记录 request.session.clear() # 删除当前访问用户所有session数据: 清空字段中的值
-
session默认有效期:两周
Django是如何保存和注销用户登录状态的【扩展】
- 管理后台登录界面
- 登录成功调用login方法,通过session保存登录用户id
- 注销一个用户会清除session数据
- 登录之后,通过 request.user 就能得到登录用户对象
类视图
类视图使用【重点】
-
定义类视图,继承View类,在类视图中定义get, post, put等相关方法
class PostView(View): def get(self, request): return render(request, 'post2.html') def post(self, request): return HttpResponse('执行发帖操作')
-
配置路由时,调用类视图的.as_view()方法
urlpatterns = [ ... url(r'^post2$', views.PostView.as_view()), ]
类视图使用装饰器
- method_decorator: 为函数装饰器补充第一个self参数,使它可以应用到类的方法中。
方式1:
class PostView(View):
def get(self, request):
return render(request, 'post2.html')
@method_decorator(check_ip)
def post(self, request):
return HttpResponse('处理发帖操作')
方式2:
@method_decorator(check_ip, name='get')
#@method_decorator(check_ip, name='dispatch')
class PostView(View):
def get(self, request):
return render(request, 'post2.html')
def post(self, request):
return HttpResponse('处理发帖操作')
中间件【理解】
作用:在视图执行前或执行后,作一些额外的操作,比如:
- 在视图执行前判断ip是否为黑名单
中间件的执行顺序
中间件使用
- 定义中间件
class MyMiddleware(MiddlewareMixin):
def process_request(self, request):
print('before 视图')
# 注意:可以返回None或者response对象,如果返回response对象,则视图函数就不会再执行了
def process_response(self, request, response):
print('after 视图')
return response # 必须要有返回值
- 在settings文件中配置
MIDDLEWARE = [
...
'middlewares.MyMiddleware', # 注册中间件
]
request.user对象从何而来【扩展】
- django提供了一个认证中间件
- 在视图执行前会查询登录的用户对象
- get_user方法:会取出用户id查去查询
- 从session读取出用户id