数据库的迁移
Response
可以指定状态码、内容等。
重定向
HttpResponseRedirect(简写 redirect)
def buy(request):
if random.randrange(10) > 5:
return HttpResponseRedirect('/App/hello/')
return HttpResponse('成功')
JsonResponse(简写 redirect)
- 以json格式返回数据
Cookies
名称 | 释义 |
---|---|
Cookie | 客户端会话技术(数据存储在客户端),键值对存储,支持过期时间, |
Session | 服务端会话技术,数据存储在服务器中,默认Session存储在内存中,Django中默认会把Session持久化到数据库中,数据使用了base64(并在前面添加了混淆串),依赖于Cookie |
Token | 服务端会话技术,由于session依赖cookie,而后者又依赖于浏览器 |
Cookie
views:
def login(request):
return render(request, 'login.html')
def dologin(request):
uname = request.POST.get('uname')
response = HttpResponseRedirect(reverse('App:home_page'))
response.set_cookie('uname', uname)
return response
def homepage(request):
uname = request.COOKIES.get('uname')
if uname:
return HttpResponse(uname)
return render(request, 'goto.html')
login.html:
<form action="{% url 'App:do_login' %}" method="post">
<span>用户名:</span> <input type="text" placeholder="请输入用户名" name="uname">
<br>
<button>登录</button>
</form>
goto.html:
<h3>没有cookie,正在跳转到登录页面...</h3>
<a href="{% url 'App:Login' %}">点击跳转</a>
我们首先输入/App/login/进到登录界面,输入用户名后,会发送一个post请求给dologin,
在dologin中设置了cookie,并重定向到homepage,如果能提取到cookie那么就输出;如果
没提取到(可能是直接访问了homepage),那么就会跳转到goto.html进而返回login页面。
但是关闭浏览器上述的cookie就失效了
这就需要看一下其他的参数(默认不支持中文):
参数 | 释义 |
---|---|
max_age | 指定秒数 |
上面写的程序cookie在浏览器中是明文的,如果想加密,则需要把
- response.set_cookie(‘uname’, uname)
换成:
- response.set_signed_cookie(‘content’, uname, ‘Rock’)
那么在解密时,要用request.get_signed_cookie(‘uname’, salt=‘Rock’)
添加退出登录功能
home.html:
<h2>欢迎回来{{ uname }}</h2>
<a href="{% url 'App:logout' %}">退出</a>
views:
def homepage(request):
# uname = request.COOKIES.get('uname')
try:
uname = request.get_signed_cookie('uname', salt='Rock')
if uname:
return render(request, 'home.html', context={'uname': uname})
except Exception as e:
return render(request,'goto.html')
def logout(request):
response = HttpResponseRedirect(reverse('App:Login'))
response.delete_cookie('uname')
return response
流程:登录后进入到home界面,点击退出选项时:
- 输入/App/login/,进入login view,render登录页面,输入用户名,点击登录
- 访问do_login view,这是个POST请求,因而设置cookie,设置成功后重定向home_page
- 访问home_page view,提取出uname cookie,若有则render home.html
- 进入到home.html,浏览器获得logout的url
- 然后进入到logout view,收到request请求,生成了一个重定向response(这个是要发回给浏览器的)
- 浏览器收到后,cookie已经被删掉了,接着去访问login
- 这时如果再去访问homepage,由于没有cookie,就会发生异常,返回至login页面
Session
views:
def login(request):
if request.method == 'GET':
return render(request, 'two_login.html')
elif request.method == 'POST':
username = request.POST.get('username')
request.session['username'] = username
return HttpResponse('登录成功')
def mine(request):
username = request.session.get('username')
return render(request, 'two_mine.html', context=locals())
def logout(request):
response = redirect(reverse('two:mine'))
# response.delete_cookie('sessionid')
# del request.session['username']
request.session.flush()
return response
- response.delete_cookie(‘sessionid’) 删除Cookie
- del request.session[‘username’] 删掉数据库中session(但还会有残留)
- request.session.flush() 最彻底
有些偷懒了…