视图
概述
作用
视图接受Web请求,并且返回Web响应
本质
就是一个Python函数,在views.py文件中定义,也可以是一个类,称为视图类
响应
一般是一个网页的HTML内容、一个重定向、错误信息页面、json格式的数据
URLConf
概述
注意:
若要从url中捕获一个值,需要在它的周围设置一对圆括号
url(r’^index/(\d+)/(\w+)/$’, views.index)
def index(request, num, word):
return HttpResponse(‘Happy day, ’ + num + word)
project/urls.py
url(r'^', include('myApp.urls', namespace='myApp'))
项目目录下urls.py
url(r'^rdns/$', views.world, name='world')
反向解析
概述
如果在视图、模板中使用硬编码的链接,在urlconf发生变化时,维护起来非常的麻烦
在做链接时,通过指向urlconf的名称,动态生成链接地址可以很好的解决
视图:
django.core.urlresolvers.reverse('namespace:name')
模板:
去另个世界去看看
视图函数
定义视图
本质上就是一个函数,参数是一个HttpRequests对象,通过正则表达式组获得的关键字参数,在views.py文件中
错误试图
404视图
500视图
HttpRequest对象
概述
服务器收到http协议请求后,会根据报文创建出HttpRequest对象,将该对象传递给了视图,视图的第一个参数就是HttpRequest对象
属性
session:类似字典的对象
def requestFunc(request):
print(request.path)
print(request.method)
print(request.encoding)
print(request.GET)
print(request.Post)
print(request.FILES)
print(request.COOKIES)
print(request.session)
return HttpResponse(‘request’)
方法
QueryDict对象
定义在django.http.QueryDict
request对象属性中的GET、POST都是QueryDict类型的对象
与Python中的字典不一样,QueryDict可以处理一个键带有多个值得请求
方法:
GET属性
http://loclahost:8000/get1?a=1&b=2
def get1(request):
a = request.Get.get(‘a’)
b = request.GET.get(‘b’)
return HttpResponse(a + b)
http://localhost:8000/get2?a=1&a=2
def get2(request):
alist = request.GET.getlist(‘a’)
return HttpResponse(alist[0] + alist[1])
POST属性
def postReq(request):
if request.method == 'GET':
# 展示注册页面
return render(request, 'post.html')
else:
# 响应注册界面里点击的提交请求
# 获取POST请求的参数
username = request.POST.get('username')
return HttpResponse('接收到POST请求')
HttpResponse对象
概述
在django.http中定义HttpResponse类,HttpResponse对象是Django自动创建的,HttpResponse对象需要由程序员手动创建
用法
属性
content_type:指定输出的MIME类型
def response(request):
res = HttpResponse()
res.content = b’Nice day’
res.charset = ‘utf-8’
res.status_code = 200
res.content_type = ‘text/plain’
return res
方法
set_cookie(key, value, max_age=None, expire=None):设置cookie
def cookie(request):
cookies = request.COOKIES
res = HttpResponse()
res.content = cookies[‘nian’]
res.set_coookie(‘nian’, ‘Nice’)
return res
子类HttpResponseRedirect类
重定向,服务器跳转
def redirect1(request):
return HttpResponseRedirect('/redirect2')
def redirect2(request):
return HttpResponse('redirect2')
# 简写
def redirect1(request):
retrn redirect('/redirect2/')
def redirect2(request):
return HttpResponse('redirect2')
子类JsonResponse类
返回json数据,一般用于异步ajax请求
状态保持
概念
http协议是无状态的,每一次请求都是一次新的请求,不知道之前都做过什么(通信状态)
每一次客户端请求服务器都是一次性通信,即一次会话
实现状态保持的方式:
在客户端存储与会话有关的数据
存储的方式:
使用cookie时,所有数据存储在客户端,注意不要存储敏感数据
推荐使用session方式,所有的数据保存在客户端,注意不要存储敏感数据
状态保持的目的:在一段时间内,可以实现跨页面访问当前请求者的数据信息
放心一点:不同的请求者之间不会共享数据,与请求者一一对应
启用session
在settings.py文件中:
INSTALLED_APPS:'django.contrib.sessions'
MIDDLEWARE:'django.contrib.sessions.middleware.SessionMiddleware'
使用session
状态保持示例
url(r'^show/$', views.show),
url(r'^login/$', views.login),
url(r'^quit/$', views.quit),
def show(request):
# 提取session中名为myname的值
myname = request.session.get('myname', '未登录')
return render(request, 'show.html', {'username':myname})
def login(request):
if request.method == 'GET':
# 展示登陆界面
return render(request, 'login.html')
else:
username = reuqest.POST.get('username')
passwd = request.POST.get('passwd')
if username == 'nian' and passwd == '123':
# 登陆成功,重定向到主页上
# 将用户名存储到session里
request.session['username'] = username
return HttpResponseRedirect('/show/')
else:
# 登陆失败
return redirect('/login/')
from django.contrib.auth import logout
def quit(request):
logout(request)
return redirect('/show/')
过期时间
设置过期时间:
set_expiry(value):
value可以为0,让会话的cookie在用户关闭浏览器时过期
value可以为None, 永不过期
如果没有指定,两个星期后失效
存储session
基于数据库的存储
默认的会话存储方式:SESSION_ENGINE = ‘django.contrib.sessions.backends.db’
基于缓存的存储
存储在内存,如果丢失不能找回,比数据库读写速度快:ESSION_ENGINE = ‘django.contrib.backends.cache’
缓存和数据库同时使用
现在缓存中取,如果找不到再去数据库取:SESSION_ENGINE = ‘django.contrib.backends.cache_db’
使用Redis缓存session
SESSION_ENGINE = ‘redis_sessions.session’
SESSION_REDIS_HOST = ‘localhost’
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 0
SESSION_REDIS_PASSWORD = ”
SESSION_REDIS_PREFIX = ‘session’