模型:
每个模型都是一个Python类,这些类继承django.db.models.Model。
模型类的每个属性都相当于一个数据库的字段
ORM(对象关系映射):为了解决面向对象于数据库存在的互不匹配的现象的技术。
cookie:
cookie是浏览器为web服务器存的一小信息。每次浏览器从某个服务器请求页面时,都会自动带上以前收到的cookie。cookie保存在客户端,安全性差。
用法:
1、设置cookie
HttpResponse.set_cookie(key, value='', max_age=None, expires=None,path='/', domain=None, secure=None, httponly=False)
参数:
- key: cookie的名称(*)
- value: cookie的值,默认是空字符
- max_age:cookies的持续有效时间(以秒计),如果设置为 None,cookies 在 浏览器关闭的时候就失效了。
- expires:cookies的过期时间,格式:“Wdy, DD-Mth-YY HH:MM:SS GMT” 如果设置这个参数,它将覆盖max_age。
- path: cookie⽣效的路径前缀,浏览器只会把cookie回传给带有该路径的⻚ ⾯,这样你可以避免将cookie传给 站点中的其他的应⽤。/ 表示根路径,特殊的:根路径的cookie可以被任何url的⻚⾯访问
- domain: cookie⽣效的站点。你可⽤这个参数来构造⼀个跨站cookie。如, domain=".example.com"所构造的 cookie对下⾯这些站点都是可 读的: www.example.com 、 www2.example.com。 如果该参数设置为None,cookie只能由设置它的站点读取。
- secure: 如果设置为 True ,浏览器将通过HTTPS来回传cookie。
- httponly: 仅http传输 不能使⽤js获取cookie
2、 获取cookie
HttpRequest.COOKIES.get(key)
获取加“盐”的cookie
HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='',max_age=None)
3、 删除cookie
HttpResponse.delete_cookie(key, path='/', domain=None)
session:
cookie看似解决了HTTP(短连接、⽆状态)的会话保持问题,但把全部⽤户数据保存在客户端,存在安全隐患,于是session出现了。我们可以 把关于⽤户的数据保存在服务端,在客户端cookie⾥加⼀个sessionID(随机字符串)。
工作流程:
- 当⽤户来访问服务端时,服务端会⽣成⼀个随机字符串;
- 当⽤户登录成功后 把 {sessionID :随机字符串} 组织成键值对加到cookie⾥发送给⽤户;
- 服务器以发送给客户端 cookie中的随机字符串做键,⽤户信息做值,保存⽤ 户信息;
- 再访问服务时客户端会带上sessionid,服务器根据sessionid来确认⽤户是否 访问过⽹站
cookie和session的区别与联系
- 区别:
–session将数据存储与服务器端,cookie存储在客户端
-cookie 存储在客户端,不安全,sess存储在服务器端,客户端只存sesseionid,安全
-cookie在客户端存储值有⼤⼩的限制,⼤约⼏kb。session没有限制 - 联系:
-session 基于cookie
session操作:
- session设置:
def doregister(request):
'''
request.session['username'] = username
- session获取:
def index(request):
'''
# session获取
username = request.session.get('username')
- session删除:
clear() 清空所有session,但是不会将session表中的数据删除
flush()清空所有,并删除表中的数据
logout()退出登录,清除所有,并删除表中的数据
del req.ression[‘key’]删除某一个session值
def logout(request):
'''
request.session.flush()
- session过期时间:
req.session.set_expiry(5)
分页
Paginator 分页器
Paginator⽤于分⻚,但Paginator并不具体管理具体的⻚的处理,⽽是使⽤Page对象管理具体⻚⾯。
-
创建分页器对象
格式:Paginator(<query_set查询集>,每⻚显示数据的条数) -
对象的属性
count 分页对象的个数
num_pages 总页数
page-range 页码的列表 -
方法
page(num) 返回page对象,如果给定的页码不存在,就抛出异常
page对象
page对象具体负责每⻚的处理,包括每⻚的数据,当前⻚的⻚码,是否有上⼀⻚或下⼀⻚等。
类别、名称 | 说明 |
---|---|
属性、object_list | 当前页码上的所有数据 |
属性、number | 当前页码值 |
属性、paginator | 返回Paginator的对象 |
方法、has_next | 是否有下一页 |
方法、has_previous | 是否有上一页 |
方法、has_other_pages | 是否有上一页或下一页 |
方法、has_page_number | 返回下一页的页码 |
方法、previous_page_number | 返回上一页的页码 |
方法、len | 返回当前页数据的个数 |
- 实例
# 路由
url(r'^userlist/$',views.userlist,name='userlist'),
url(r'^userlist/(\d+)/$',views.userlist,name='userlist1'),
# views.py
def userlist(request,page=1):
users = User.objects.all()
# 实例化分⻚对象,⼀⻚两条记录
pagination = Paginator(users,2)
page = pagination.page(page) #某⼀⻚的分⻚对象
return render(request,'userlist.html',context={
'data':page.object_list, #当前⻚的数据(列表)
'page_range':pagination.page_range,#⻚码范围
'page':page
})
# 模板文件
<ul class="pagination">
{% if page.has_previous %}
<li>
<a href="{% url 'app:userlist1'page.number|add:'-1' %}" aria-label="Previous">
<span aria-hidden="true">«</span></a>
</li>
{% else %}
<li class="disabled">
<span href="{% url 'app:userlist1'page.number|add:'-1' %}" aria-label="Previous">
<span aria-hidden="true">«</span></span>
</li>
{% endif %}
{% for num in pagerange %}
{% ifequal num page.number %}
<li class="active"><a href="{% url'app:userlist1' num %}">{{ num }}</a></li>
{% else %}
<li><a href="{% url 'app:userlist1'num %}">{{ num }}</a></li>
{% endifequal %}
{% endfor %}
{% if page.has_next %}
<li>
<a href="{% url 'app:userlist1'page.number|add:'1' %}" aria-label="Next">
<span aria-hidden="true">»</span></a>
</li>
{% else %}
<li class="disabled">
<span href="#" aria-label="Next">
<span aria-hidden="true">»</span></span>
</li>
{% endif %}
</ul>