标签:nta login 也会 ruby 求和 不可用 main direct 详细说明
上节课内容回顾:ORM增删改查
Django提供的分页器使用以及分析讲解
Cookie和session讲解与在Django中的使用
ajax的讲解与简单使用
要使用Django实现分页器,必须从Django中导入Paginator模块
from django.core.paginator import Paginator
假如现在有150条记录要显示,每页显示10条
>>> from django.core.paginator import Paginator#导入Paginator模块
>>> list1=[i for i in range(0,150)]#使用列表生成器生成一个包含150个数字的列表
>>> page1=Paginator(list1,10)#生成一个Paginator对象
>>> print(page1.count)#打印总的记录数,即列表list1的长度
150
>>> print(page1.num_pages)#打印总的页数,即总记录数除以每页显示的条目数
15
>>> print(page1.page_range)#页数的列表
range(1, 16)
>>> print(page1.page(1))#打印第一页的page对象
<Page 1 of 15>
>>> page1.page(1).object_list#打印第一页的所有记录
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> page1.page(2).object_list#打印第二页的所有记录
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> page1.page(2).next_page_number()#打印当前的页(第2页)的下一页的页码
3
>>> page1.page(2).has_next()#第2页是否有下一页
True
>>> page1.page(2).has_previous()#第2页是否有上一页
True
>>> page1.page(2).has_other_pages()#第2是否有其他页
True
>>> page1.page(2).start_index()#第2页第一条记录的序号
11
>>> page1.page(2).end_index()#第2页最后一条记录的序号
20
>>> page1.page(0)#第0页是否有记录,会报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
...
raise EmptyPage(_(‘That page number is less than 1‘))
django.core.paginator.EmptyPage: <exception str() failed>
>>> page1.page(15)#打印第15页的对象
<Page 15 of 15>
例子,使用Django实现一个分页效果
前端代码:
{% load staticfiles %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static ‘bootstrap/css/bootstrap.css‘ %}">
</head>
<body>
<div class="container">
<h4>分页器</h4>
<ul>
#遍历boot_list中的所有元素
{% for book in book_list %}
#打印书籍的名称和价格
<li>{{ book.title }}{{ book.price }}</li>
{% endfor %}
</ul>
<ul class="pagination" id="pager">
{#上一页按钮开始#}{# 如果当前页有上一页#}{% if book_list.has_previous %}{# 当前页的上一页按钮正常使用#}
<li class="previous"><a href="/?page={{ book_list.previous_page_number }}">上一页</a></li>
{% else %}{# 当前页的不存在上一页时,上一页的按钮不可用#}
<li class="previous disabled"><a href="#">上一页</a></li>
{% endif %}{#上一页按钮结束#}{# 页码开始#}{% for num in paginator.page_range %}{% if num == currentPage %}
<li class="item active"><a href="/?page={{ num }}">{{ num }}</a></li>
{% else %}
<li class="item"><a href="/?page={{ num }}">{{ num }}</a></li>
{% endif %}{% endfor %}{#页码结束#}{# 下一页按钮开始#}{% if book_list.has_next %}
<li class="next"><a href="/?page={{ book_list.next_page_number }}">下一页</a></li>
{% else %}
<li class="next disabled"><a href="#">下一页</a></li>
{% endif %}{# 下一页按钮结束#}
</ul>
</div>
</body>
</html>
后端代码:
#导入render和HttpResponse模块 from django.shortcuts import render,HttpResponse #导入Paginator,EmptyPage和PageNotAnInteger模块 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger #从Django项目的应用中导入模块 from app01.models import * def index(request): #获取Book数据表中的所有记录 book_list=Book.objects.all() #生成paginator对象,定义每页显示10条记录 paginator = Paginator(book_list, 10) #从前端获取当前的页码数,默认为1 page = request.GET.get(‘page‘,1) #把当前的页码数转换成整数类型 currentPage=int(page) try: print(page) book_list = paginator.page(page)#获取当前页码的记录 except PageNotAnInteger: book_list = paginator.page(1)#如果用户输入的页码不是整数时,显示第1页的内容 except EmptyPage: book_list = paginator.page(paginator.num_pages)#如果用户输入的页数不在系统的页码列表中时,显示最后一页的内容 return render(request,"index.html",locals())
效果图
#!/usr/bin/env python # _*_ coding:utf-8 _*_ import os from django.core.paginator import Paginator objects = [‘john‘,‘paul‘,‘george‘,‘ringo‘,‘lucy‘,‘meiry‘,‘checy‘,‘wind‘,‘flow‘,‘rain‘]<br> p = Paginator(objects,3) # 3条数据为一页,实例化分页对象 print p.count # 10 对象总共10个元素 print p.num_pages # 4 对象可分4页 print p.page_range # xrange(1, 5) 对象页的可迭代范围 page1 = p.page(1) # 取对象的第一分页对象 print page1.object_list # 第一分页对象的元素列表[‘john‘, ‘paul‘, ‘george‘] print page1.number # 第一分页对象的当前页值 1 page2 = p.page(2) # 取对象的第二分页对象 print page2.object_list # 第二分页对象的元素列表 [‘ringo‘, ‘lucy‘, ‘meiry‘] print page2.number # 第二分页对象的当前页码值 2 print page1.has_previous() # 第一分页对象是否有前一页 False print page1.has_other_pages() # 第一分页对象是否有其它页 True print page2.has_previous() # 第二分页对象是否有前一页 True print page2.has_next() # 第二分页对象是否有下一页 True print page2.next_page_number() # 第二分页对象下一页码的值 3 print page2.previous_page_number() # 第二分页对象的上一页码值 1 print page2.start_index() # 第二分页对象的元素开始索引 4 print page2.end_index() # 第2分页对象的元素结束索引 6
https://www.cnblogs.com/kongzhagen/p/6640975.html 参考
老师的博客:http://www.cnblogs.com/yuanchenqi/articles/7609586.html
cookie与session的实现原理
HTTP被设计为”无状态”,每次请求都处于相同的空间中。 在一次请求和下一次请求之间没有任何状态保持,我们无法根据请求的任何方面(IP地址,用户代理等)来识别来自同一人的连续请求。上图很明显的展示了Django的session与cookie的实现原理。服务器会生成两份相同的cookie字符串,一份保存在本地,一份发向请求的浏览器。浏览器将收到的cookie字符串保存下来,当下次再发请求时,会将信息与这段cookie一同发送到服务器,服务器得到这段cookie会与本地保存的那份判断是否相同,如果相同就表示用户已经登录成功,保存用户登录成功的状态。Django的session保存在数据库中的数据相当于一个大字典,key为cookie的字符串,value仍是一个字典,字典的key和value为用户设置的相关信息。这样就可以方便的存取session里面的信息。
Cookies
cookies 是浏览器为 Web 服务器存储的一小段信息。 每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies。它保存在浏览器下的某个文件夹下。
浏览器下的cookie:
Session
Django的Session机制会向请求的浏览器发送cookie字符串。同时也会保存到本地一份,用来验证浏览器登录是否为同一用户。它存在于服务器,Django默认会把session存入到数据库中。
Session依赖于Cookie,如果浏览器不能保存cooki那么session就失效了。因为它需要浏览器的cooki值去session里做对比。session就是用来在服务器端保存用户的会话状态。
操作session
根据网友lvusyy的友情提示,在操作session之前,你需要同步一下Django的数据库。我用的是Django自带的sqlite3.所以需要执行同步的命令:
还有一点,在django处理请求的过程中,需要经过中间件的过滤,涉及到跨站请求伪造时,django会把请求阻止过滤掉,所以我们要在setting.py中禁用跨站请求伪造的中间件,如果不禁用,记得好像会报一个403的错误黄页。关于跨站请求伪造,之后的章节我会详细说明其功能用处:
Django中操作session:
获取session:request.session[key] request.session.get(key)
设置session:reqeust.session[key] = value
删除session:del request[key]
request.session是每一个客户端相当于在上图中对应的value
一段简单的Django中实现session的代码,判断用户是否已经成功登录:
1 def login(request): 2 if request.method ==‘POST‘: 3 username = request.POST.get(‘username‘) 4 pwd = request.POST.get(‘pwd‘) 5 if username ==‘lisi‘ and pwd == ‘12345‘: 6 request.session[‘IS_LOGIN‘] = True 设置session 7 return redirect(‘/app01/home/‘) 8 9 return render(request,‘login.html‘) 10 11 def home(request): 12 is_login = request.session.get(‘IS_LOGIN‘,False) 获取session里的值 13 if is_login: 14 return HttpResponse(‘order‘) 15 else: 16 return redirect(‘/app01/login/‘)
过期时间
cookie可以有过期时间,这样浏览器就知道什么时候可以删除cookie了。 如果cookie没有设置过期时间,当用户关闭浏览器的时候,cookie就自动过期了。 你可以改变 SESSION_EXPIRE_AT_BROWSER_CLOSE 的设置来控制session框架的这一行为。缺省情况下, SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为 False ,这样,会话cookie可以在用户浏览器中保持有效达 SESSION_COOKIE_AGE 秒(缺省设置是两周,即1,209,600 秒)。 如果你不想用户每次打开浏览器都必须重新登陆的话,用这个参数来帮你。如果 SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为 True ,当浏览器关闭时,Django会使cookie失效。
SESSION_COOKIE_AGE:设置cookie在浏览器中存活的时间
在settings.py中添加:
例子
结合前端实现的cookie与session会话机制:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form action="/app01/login/" method="post"> <input type="text" name="username" /> <input type="password" name="pwd" /> <input type="submit" value="submit"/> </form> </body> </html> login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <style> .header{ height: 48px; } </style> </head> <body> <div class="header"> <div style="float: right">{{ username }}</div> <div style="float: right"><a href="/app01/logout/">注销</a></div> </div> <div style="height: 500px;background-color: #ddd"></div> </body> </html> home.html
views.py
def login(request): if request.method == "POST": username = request.POST.get(‘username‘) pwd = request.POST.get(‘pwd‘) if username == ‘alex‘ and pwd == ‘123‘: request.session[‘IS_LOGIN‘] = True request.session[‘USRNAME‘] = ‘alex‘ return redirect(‘/app01/home/‘) elif username == ‘eirc‘ and pwd == ‘123‘: request.session[‘IS_LOGIN‘] = True request.session[‘USRNAME‘] = ‘eirc‘ return redirect(‘/app01/home/‘) return render(request, ‘login.html‘) def home(request): is_login = request.session.get(‘IS_LOGIN‘, False) if is_login: username = request.session.get(‘USRNAME‘, False) return render(request, ‘home.html‘, {‘username‘: username}) else: return redirect("/app01/login/")
(1)数据库配置(默认):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。 a. 配置 settings.py SESSION_ENGINE = ‘django.contrib.sessions.backends.db‘ # 引擎(默认) SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认) SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认) SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认) SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认) |
(2)缓存配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
a. 配置 settings.py SESSION_ENGINE = ‘django.contrib.sessions.backends.cache‘ # 引擎 SESSION_CACHE_ALIAS = ‘default‘ # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 SESSION_COOKIE_SECURE = False # 是否Https传输cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存 |
(3)文件配置
1
2
3
4
5
6
7
8
9
10
11
12
|
a. 配置 settings.py SESSION_ENGINE = ‘django.contrib.sessions.backends.file‘ # 引擎 SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 SESSION_COOKIE_SECURE = False # 是否Https传输cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后 |
python学习点滴记录-Day20(分页、cookie/session、ajax)
标签:nta login 也会 ruby 求和 不可用 main direct 详细说明
原文地址:http://www.cnblogs.com/tianleblog/p/7898965.html