博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django自定义分页、bottle、Flask
阅读量:5103 次
发布时间:2019-06-13

本文共 5653 字,大约阅读时间需要 18 分钟。

一、使用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-8 -*-from django.shortcuts import renderfrom app01 import  modelsfrom 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 -1)*10    @property    def end(self):        return self.current_page*10    def page_str(self,all_item,base_url):        all_page,div = divmod(all_item,10)        if div>0:            all_page+=1        pager_list = []        if all_page <=11:   #分页功能优化,将当前页居中,并且从1开始            start =1            end = all_page        else:            if self.current_page <=6:                start = 1                end = 12            else:                start = self.current_page-5                end = self.current_page +6                if self.current_page +6 >all_page:                    start =all_page -11                    end = all_page +1        for i in range(start,end):   #让当前页永远居中            if  i == self.current_page:                temp = '%d' %(base_url,i,i)            else:                temp = '%d' %(base_url,i,i)            pager_list.append(temp)        #增加上一页和下一页功能        #上一页        if self.current_page >1:            pre_page = '上一页' %(base_url,self.current_page-1)        else:            pre_page = '上一页'        if self.current_page >=all_page:            next_page = '下一页'        else:            next_page = '下一页' %(base_url,self.current_page+1)        pager_list.insert(0,pre_page)        pager_list.append(next_page)        return mark_safe("".join(pager_list))   #在后端标记html是安全的,前端标记为安全的使用page_str|safedef user_list(request):    # for item in range(100,500):    #       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',1) # print current_page # current_page = int(current_page) # start = (current_page-1)*10 # end = current_page*10 # 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,10) # if div>0: # all_page+=1 # # pager_str = "" # for i in range(1,all_page+1): # temp = '%d' %(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})

 

模板语言文件

    
{
% for line in result %}
{
% endfor %}
{
{ line.username }}
{
{ line.age }}
{#
1#}{#
2#}{#
3#}{#
4#}{# {
{ pager_str|safe }}#} {
{ pager_str }}{# 一般对于返回到网页的字符串,django认为是不安全的,为了防止xss攻击,会将返回的字符串不作解析,以原始字符串的格式返回,使用safe表示我们认为返回的字符串是安全的,可以被浏览器解析#}

 

二、Bottle

1、只有一个文件,但是至少依赖于两个部件:wsgi和模板引擎;

2、只有在运行时依赖别的模块;

 

 

三、Flask

Flask有很多现成的插件可以使用,但是没有自己的模板引擎和wsgi,需要依赖于其他的模本引擎;

 

四、Tarnado

支持异步非阻塞,见下图

 

 

五、自定义Form表单

 

#!/usr/bin/env python# -*- coding:utf-8 -*-import tornado.ioloopimport tornado.webfrom hashlib import sha1import os, timeimport 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(8888)    tornado.ioloop.IOLoop.instance().start()

 

    
{
{name}}

hello

hostname:

ip:

port:

phone:

 

六、如何在自定义的脚本中调用model

#!/usr/bin/env python# _*_ coding:utf-8 _*___author__ = "charles"import osos.environ["DJANGO_SETTINGS_MODULE"]="s12crm.settings"import djangodjango.setup()from crm.models import UserProfileentry = UserProfile.objects.last()print entry

  

转载于:https://www.cnblogs.com/cqq-20151202/p/5731292.html

你可能感兴趣的文章
C++:同名隐藏和赋值兼容规则
查看>>
EntityFrameWork 实现实体类和DBContext分离在不同类库
查看>>
Microsoft .NET 远程处理:技术概述(代理模式)
查看>>
新手算法学习之路----二叉树(在一个二叉查找树中插入一个节点)
查看>>
autopep8
查看>>
GIT在Linux上的安装和使用简介
查看>>
java 类型转型
查看>>
基于C#编程语言的Mysql常用操作
查看>>
【转】Java反射 之 反射基础
查看>>
mysql数据库备份和还原的常用命令
查看>>
s3c2440实验---定时器
查看>>
HBase配置性能调优(转)
查看>>
MyEclipse10安装SVN插件
查看>>
[转]: 视图和表的区别和联系
查看>>
Regular Experssion
查看>>
python中的字符编码
查看>>
图论例题1——NOIP2015信息传递
查看>>
uCOS-II中的任务切换-图解多种任务调度时机与问题
查看>>
CocoaPods的安装和使用那些事(Xcode 7.2,iOS 9.2,Swift)
查看>>
Android 官方新手指导教程
查看>>