Flask-day05

一、批量数据产生(数据库存储过程)

商品列表表

商品模型类

class Goods(db.Model):
# 商品id,主键
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
# 商品名称
name = db.Column(db.String(20))
# 商品图片
icon = db.Column(db.String(255))
# 商品价格
price = db.Column(db.Integer)
# 商品描述
detail = db.Column(db.String(255))

表单结构goods

mysql> desc goods;
+--------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| icon | varchar(255) | NO | | NULL | |
| price | int(11) | NO | | NULL | |
| detail | varchar(255) | NO | | NULL | |
+--------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

存储过程: 创建商品数据

insert into goods(name,icon,price,detail) value(name,icon,price,detail)

delimiter //
create procedure add_goods(num int(4))
begin
# 定义变量
declare _i,_price,_temp int(4) default 0;
declare _name,_icon,_detail varchar(255) default '';
declare BASE_PATH varchar(255) default '/static/img/';

# 循环
while _i<num do
    # 设置变量
    set _temp = round(rand()*10000+1000);
    set _name = concat(_temp,'-商品名称');
    set _temp = round(rand()*5+1);
    case _temp
    when 1 then
        set _icon = concat(BASE_PATH,'1.jpg');
    when 2 then
        set _icon = concat(BASE_PATH,'2.jpg');
    when 3 then
        set _icon = concat(BASE_PATH,'3.jpg');
    when 4 then
        set _icon = concat(BASE_PATH,'4.jpg');
    when 5 then
        set _icon = concat(BASE_PATH,'5.jpg');
    when 6 then
        set _icon = concat(BASE_PATH,'6.jpg');
    else
        set _icon = concat(BASE_PATH,'1.jpg');
    end case;
    set _temp = round(rand()*10000+1000);
    set _price = _temp;
    set _temp = round(rand()*10000+1000);
    set _detail = concat(_temp,'-Apple/苹果 iPhone 7 Plus苹果7代7pluss国行美版三网5.5寸7p手机');

    # 插入数据
    insert into goods(name,icon,price,detail) value(_name,_icon,_price,_detail);

    # 修改次数
    set _i = _i + 1;
end while;

# 显示数据
select * from goods;

end
//
delimiter ;

调用存储过程

call add_goods(30);

备注: 存储过程的添加是要在表单对应的数据库中进行操作!!!

二、SQLAlchemy数据查询之分页操作(手动)

手动操作(自己查询关联)

@blue.route('/goodslist/<int:num>/<int:per>/')
def goodslist(num,per):
# 第num页
# 每页显示per行
goods = Goods.query.offset((num-1) * per).limit(per)

return render_template('goodslist.html', goods=goods

flask自带(paginate)

  • 当前页面(属性)
    page

  • 当前页面中的记录(属性)
    items

  • 上一页页码(属性)
    prev_num

  • 下一页页码(属性)
    next_num

  • 如果有上页返回True(属性)
    has_prev

  • 如果有下页返回True(属性)
    has_next

  • 查询得到总页数(属性)
    pages

  • 每一页显示记录的数量(属性)
    per_page

  • 查询返回的记录总数(属性)
    total

  • 返回一个分页导航中显示列表
    iter_pages

    这个列表最左边左边显示left_edeg页,
    当前页的左边显示left_current页,
    当前页的右边显示right_current页,
    最右边显示right_edeg页。

    例如: 在一个100页的页码中,当前页为第50页,使用默认配置。
    这个方法返回以下页数: 1、2、None、48、49、50、51、52、53、54、55、None、99、100
    None表示页数之间的间隔。

@blue.route('/goodslist/<int:num>/<int:per>/')
def goodslist(num,per):
paginate = Goods.query.paginate(num,per)

return render_template('goodslist.html', paginate=paginate)

paginate对象中传递到模板中进行使用,可以使用上述属性和方法。

三、SQLAlchemy数据查询之分页操作
接下来以 Jinja2 宏的形式实现的分页导航,但默认这里的处理是通过get请求方式处理的,例如page=1,page=2。
所以想要使用这里,在后续处理中,需要修改模板,还需要对数据请求方式修改为get,而不能通过path方式传参数,否则使用不了。

Jinja2 宏定义的形式实现的分页导航,分页模板(_macros.html)

{% macro pagination_widget(pagination, endpoint) %}
<ul class="pagination">
<li{% if not pagination.has_prev %} class="disabled"{% endif %}>
<a href="{% if pagination.has_prev %}{{ url_for(endpoint,page = pagination.page - 1, **kwargs) }}
{% else %}#{% endif %}">«
</a>
</li>
{% for p in pagination.iter_pages() %}
{% if p %}
{% if p == pagination.page %}
<li class="active">
<a href="{{ url_for(endpoint, page = p, **kwargs) }}">{{ p }}</a>
</li>
{% else %}
<li>
<a href="{{ url_for(endpoint, page = p, **kwargs) }}">{{ p }}</a>
</li>
{% endif %}
{% else %}
<li class="disabled">
<a href="#">…</a>
</li>
{% endif %}
{% endfor %}
<li{% if not pagination.has_next %} class="disabled"{% endif %}>
<a href="{% if pagination.has_next %}{{ url_for(endpoint,page = pagination.page + 1, **kwargs) }}{% else %}#{% endif %}">»</a>
</li>
</ul>
{% endmacro %}

pagination_widget(pagination, endpoint),需要传入pagination对象,endpoint反向解析位置(即是蓝图名.函数名)

index.html文件中

{# 商品展示#}
<ul class="goods">
{% for goods in pagination.items %}
<li>
<p class="goodsid">商品序号: {{ goods.id }}</p>
<p class="name">商品名称: {{ goods.name }}</p>
<p class="price">商品价格: ¥{{ goods.price }}</p>
<p class="detail">商品描述: {{ goods.detail }}</p>
</li>
{% endfor %}
</ul>

{# 宏定义形式实现的分页导航#}
{% import "_macros.html" as macros %}
{% if pagination %}
<div class="pagination">
{{ macros.pagination_widget(pagination, 'blue.index') }}
</div>
{% endif %}

备注: 分页导航使用的使用bootstrap中的css样式!!!

views.py文件中

首页

@blue.route('/')
def index():
# 传递的页码数量
page = int(request.args.get('page') or 1)
# goodslist = Goods.query.all()

# 页码page,每页显示10条
pageObj = Goods.query.paginate(page,5)

return render_template('index.html', pagination=pageObj)

pagination包含了所有需要的参数,包括数据,即一个pagination对象搞定所有。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容

  • 刚刚结束了项目期,最近对ecshop用的也算比较熟了,所以给大家分享出来,如果不是一定要用ecshop大家最好还是...
    寄去远方的盛夏阅读 1,783评论 1 4
  • 在使用flask进行开发的过程是不免要涉及到分页功能的开发,我使用的是flask_sqlalchemy,对于继承自...
    1lin24阅读 5,558评论 0 1
  • 第十一章 博客文章 本章将实现Flasky博客的核心功能,允许用户读取和撰写文章。你将学到一些关于模板重用、长项目...
    易木成华阅读 1,012评论 0 1
  • 生活中,有些人在做事之前,会进行周密安排,尽善尽美的制定计划,反复斟酌,做足万全准备,然而结果却时常差强人意。有些...
    土豆南瓜阅读 392评论 0 1
  • 为期三个月的暑假课终于结束了。后期每天一节课‘对于有些人来说,或许会觉得这种安排很棒,但是对于我这种肩上还有其他任...
    老坑姑娘阅读 151评论 0 0