Django自定义分页、bottle、Flask
一、使用django实现之定义分页
1、自定义分页在django模板语言中,通过a标签实现;
2、前段a标签使用<a href="/user_list/?page=1">1</a>,将page的值传送到函数/user_list/中,后端在user_list中通过request.GET.get('page',1)获取当前页;
3、从数据库中获取特定行的数据,使用result = models.UserList.objects.all()[start:end]获取,start和end分别表示开始和结束的行;
3、自定义分页显示到模板语言中的html/css/js的字符串,在django view中,通过python字符串拼接生成;
4、获取分页的起始页,结束页,以及当前页居中等功能,抽象出来,放到一个类中实现;
5、Django默认认为返回给前段的字符串是不安全的(XSS),所有直接返回的html中,会显示为原始的字符串,可以通过在前段使用|safe或者在后端使用后make_safe实现将字符串能够让浏览器进行解析;
6、分页优化需要考虑:让当前页居中,增加上一页和下一页功能;
#-*- coding:utf- -*-
from django.shortcuts import render
from app01 import models
from django.utils.safestring import mark_safe # Create your views here. class Pager(object):
def __init__(self,current_page):
self.current_page = int(current_page)
@property
def start(self):
return (self.current_page -)* @property
def end(self):
return self.current_page* def page_str(self,all_item,base_url):
all_page,div = divmod(all_item,)
if div>:
all_page+= pager_list = [] if all_page <=: #分页功能优化,将当前页居中,并且从1开始
start =
end = all_page
else:
if self.current_page <=:
start =
end =
else:
start = self.current_page-
end = self.current_page +
if self.current_page + >all_page:
start =all_page -
end = all_page +
for i in range(start,end): #让当前页永远居中
if i == self.current_page:
temp = '<a style="color:red;font-size:26px;" href="%s%d">%d</a>' %(base_url,i,i)
else:
temp = '<a href="%s%d">%d</a>' %(base_url,i,i)
pager_list.append(temp) #增加上一页和下一页功能
#上一页
if self.current_page >:
pre_page = '<a href="%s%d">上一页</a>' %(base_url,self.current_page-)
else:
pre_page = '<a href="javascript:void(0);">上一页</a>' if self.current_page >=all_page:
next_page = '<a href="javascript:void(0);">下一页</a>'
else:
next_page = '<a href="%s%d">下一页</a>' %(base_url,self.current_page+)
pager_list.insert(,pre_page)
pager_list.append(next_page)
return mark_safe("".join(pager_list)) #在后端标记html是安全的,前端标记为安全的使用page_str|safe def user_list(request):
# for item in range(,):
# temp = {'username':"name %d" %item,'age':item}
# models.UserList.objects.create(**temp)
print models.UserList.objects.all().count()
#每页显示10条
#向用户显示页数
current_page = request.GET.get('page',)
# print current_page
# current_page = int(current_page)
# start = (current_page-)*
# end = current_page*
# result = models.UserList.objects.all()[start:end]
page_obj = Pager(current_page)
result = models.UserList.objects.all()[page_obj.start:page_obj.end]
print result.query #对应的sql语句
all_item = models.UserList.objects.all().count()
# all_page,div = divmod(all_item,)
# if div>:
# all_page+=
#
# pager_str = ""
# for i in range(,all_page+):
# temp = '<a href="/user_list/?page=%d">%d</a>' %(i,i)
# pager_str +=temp
pager_str = page_obj.page_str(all_item,"/user_list/?page=")
return render(request,'user_list.html',{'result':result,'pager_str':pager_str})
模板语言文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style>
a{
padding: 5px;
}
</style>
</head>
<body>
<table>
{% for line in result %}
<tr>
<td>{{ line.username }}</td>
<td>{{ line.age }}</td>
</tr>
{% endfor %}
</table> <div>
{# <a href="/user_list/?page=1"></a>#}
{# <a href="/user_list/?page=2"></a>#}
{# <a href="/user_list/?page=3"></a>#}
{# <a href="/user_list/?page=4"></a>#}
{# {{ pager_str|safe }}#}
{{ pager_str }}
{# 一般对于返回到网页的字符串,django认为是不安全的,为了防止xss攻击,会将返回的字符串不作解析,以原始字符串的格式返回,使用safe表示我们认为返回的字符串是安全的,可以被浏览器解析#}
</div>
</body>
</html>

二、Bottle
1、只有一个文件,但是至少依赖于两个部件:wsgi和模板引擎;
2、只有在运行时依赖别的模块;
三、Flask
Flask有很多现成的插件可以使用,但是没有自己的模板引擎和wsgi,需要依赖于其他的模本引擎;
四、Tarnado
支持异步非阻塞,见下图

五、自定义Form表单
#!/usr/bin/env python
# -*- coding:utf- -*- import tornado.ioloop
import tornado.web
from hashlib import sha1
import os, time
import re class MainForm(object):
def __init__(self):
self.host = "(.*)"
self.ip = "^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$"
self.port = '(\d+)'
self.phone = '^1[3|4|5|8][0-9]\d{8}$' def check_valid(self, request):
#request,用户提交的表单
form_dict = self.__dict__ #获取对象的所有字段
#{host:"","ip":""}
for key, regular in form_dict.items():
post_value = request.get_argument(key) #获取用户传过来的参数
# 让提交的数据 和 定义的正则表达式进行匹配
ret = re.match(regular, post_value)
print key,ret,post_value
if not ret:
return False
return True class MainHandler(tornado.web.RequestHandler):
def get(self):
self.render('index.html',name='Chales')
def post(self, *args, **kwargs): #获取用户form表中的数据,然后验证
obj = MainForm()
#验证通过
result = obj.check_valid(self)
print result
self.write('ok') settings = {
'template_path': 'template',
'static_path': 'static',
'static_url_prefix': '/static/',
} application = tornado.web.Application([
(r"/index", MainHandler),
], **settings) if __name__ == "__main__":
application.listen()
tornado.ioloop.IOLoop.instance().start()
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
{{name}}
<h1>hello</h1>
<form action="/index" method="post"> <p>hostname: <input type="text" name="host" /> </p>
<p>ip: <input type="text" name="ip" /> </p>
<p>port: <input type="text" name="port" /> </p>
<p>phone: <input type="text" name="phone" /> </p>
<input type="submit" value="submit" />
</form>
</body>
</html>
六、如何在自定义的脚本中调用model
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = "charles" import os os.environ["DJANGO_SETTINGS_MODULE"]="s12crm.settings"
import django django.setup() from crm.models import UserProfile
entry = UserProfile.objects.last() print entry
Django自定义分页、bottle、Flask的更多相关文章
- Django自定义分页并保存搜索条件
Django自定义分页并保存搜索条件 1.自定义分页组件pagination.py import copy class Pagination: def __init__(self, current_p ...
- Django 自定义分页类
分页类代码: class Page(object): ''' 自定义分页类 可以实现Django ORM数据的的分页展示 输出HTML代码: 使用说明: from utils import mypag ...
- Django—自定义分页
分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该显示在页面上的数据在数据库表中的起始位置. 确定分页需求: 1. 每页显示的数据条数 2. 每页显示页号链接数 3. 上一页 ...
- Django - 自定义分页、FBV和CBV
一.自定义分页(优势在于能够保存搜索条件) """ 分页组件使用示例: 1) 先取出所有数据USER_LIST 2) 实例化: obj = Pagination(requ ...
- Django——自定义分页(可调用)
1.view from django.shortcuts import render,HttpResponse # Create your views here. from app01.models ...
- django 自定义分页,网址存储缓存,CBV
1. 通过切片控制分页 自定义分页: from django.shortcuts import render # Create your views here. from app01.models i ...
- Django自定义分页
分页 自定义分页 稳扎稳打版 def book(request): # 从URL取参数(访问的页码) page_num = request.GET.get("page") try: ...
- django自定义分页控件
1.准备数据 在models创建测试表 from django.db import models class Host(models.Model): hostname = models.CharFie ...
- Django 自定义分页
1.路由 urls.py url(r'^index2.html/', views.index2), 2.views.py def index2(request): # 数据总条数 当前页 每页显示条数 ...
随机推荐
- UITabBarController常见代理方法的使用
//下面两个函数是成对出现的若第一个函数返回YES那么第二个方法自动触发执行 //是否允许选择不同的Item触发后续操作,YES是允许,NO是不允许 -(BOOL)tabBarController:( ...
- Java初学者入门应该掌握的30个概念
1.OOP中唯一关系的是对象的接口是什么,就像计算机的销售商她不管电源内部结构 是怎样的,他只关系能否给你提供电就行了,也就是只要知道can or not而不是how and why.所有的程序是由一 ...
- ✡ leetcode 168. Excel Sheet Column Title 26进制数字 --------- java
Given a positive integer, return its corresponding column title as appear in an Excel sheet. For exa ...
- RobotFramwork + Appium+ Andriod 环境搭建
RF+Appium+Android环境搭建教程 - 1.RF安装 一.适用操作系统 Win7 旗舰版Sp1 32位操作系统 RF环境搭建,请参考文档<RobotFramwork安装指南> ...
- JS(去掉前后空格或去掉所有空格)的用法 推荐使用jquery 方法
说明: 如果使用jQuery直接使用$.trim(str)方法即可,str表示要去掉前后所有空格的字符串. 推荐 1. 去掉字符串前后所有空格: 代码如下: function Tri ...
- Logistic回归原理及公式推导[转]
原文见 http://blog.csdn.net/acdreamers/article/details/27365941 Logistic回归为概率型非线性回归模型,是研究二分类观察结果与一些影响因素 ...
- 轻量级分布式 RPC 框架
@import url(/css/cuteeditor.css); 源码地址:http://git.oschina.net/huangyong/rpc RPC,即 Remote Procedure C ...
- python 之post、get与cookie实战
项目名称:登陆考勤管理系统爬取个人考勤信息并写入excel表格 编写目的: 公司经常要统计员工的考勤信息,而员工每次都要登陆考勤系统,再复制相关信息出来,贴到EXCEL,再转给统计人员,统计人员再挨个 ...
- 不使用spring的情况下原生java代码两种方式操作mongodb数据库
由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常. 主要原因实际上是和mongodb本身无关的,因为他们改的是配置 ...
- 关于CGContextSetBlendMode: invalid context 0x0的错误
在ios 7的模拟器中,选择一个输入框准备输入时,会触发这个错误,以下是出错详细日志: <Error>: CGContextSetBlendMode: invalid context 0x ...