1. 场景描述
咖啡、可可和茶并称为世界著名的三大饮品。近十年来,咖啡倍受国人偏爱和追捧。因为咖啡文化与时尚生活、工作和休闲娱乐紧密地联系在一起,喝咖啡也似乎成为了小资生活与时尚生活的象征与标配。然而大部分中国人真正接受咖啡,并逐渐养成喝咖啡的习惯,不过是从星巴克进入中国后才开始的,至今也不过十几年的时间。咖啡馆不同于其他餐饮场所,自有其独特的魅力,由于其环境优雅,营造出放松的氛围,让处于快节奏工作和生活状态下的人们,可以借此放松身心、消除疲惫。咖啡馆避免了一些餐饮和饮品店的噪杂,所以它成为了人们聚会、洽谈生意、闲暇小憩和男女约会的理想之地,甚至成为一些人打发休闲时光的一个好去处。现代社会,人们进出咖啡馆不仅是一种消费行为,也参杂了社交、商务等需求,成为人们生活中的另一个空间。 正因如此,在城市商圈或者写字楼周边,咖啡店犹如雨后春笋随处可见,快乐时光咖啡屋就是其中之一。这是一家连锁的咖啡屋,在全国拥有20多家连锁店,具有强大的美誉度和良好的口碑。其特色之一就是其官网上推荐的营销活动:“特价咖啡天天喝”。每一天都有一款打折咖啡,但是工作日和周末的打折力度不同。这个活动受到众多年轻消费者的青睐。本案例中我们将通过Python开发一个WEB网站程序,再现“特价咖啡天天喝”的营销活动场景。
2. 编程思路
快乐时光网站要实现的核心功能就是根据工作日和周末,在网站上展示不同的咖啡价目单。
2.1 开发工具
Python提供了多种网站Web程序开发的解决方案,主流的开发工具有Flask和Django。Django适合大型网站开发,而Flask则对于小型WEB程序开发更加简洁和灵活。结合本案例的实际需要,我们选择Flask来开发快乐时光咖啡屋的网站程序更为恰当。
2.2 程序构成
我们的快乐时光网站由3个部分构成: 后台服务器程序:定义路由和试图函数,判断工作日和周末,生成不同的咖啡价目表。 模板程序:前端展示的网站页面,它包含支持Jinjia2的模板语句,实现动态数据的加载。我们需要创建目录templates,存放网站的模板文件。 静态资源:包含网站的图片文件、CSS网页格式文件。我们需要创建目录static存放网站静态资源,其下创建子目录images保存图片文件,创建子目录存放css文件。 有了以上的程序规划,我们就可以进行网站程序的编码工作了。
3. 程序代码
3.1 服务器程序 joytime.py
"""
joytime.py : 欢乐时光咖啡屋
"""
from flask import Flask, render_template
import datetime
joy_menus = [
('Cappuccino', '卡布诺奇', 32),
('Vanilla Latte', '香草拿铁', 35),
('Caramel Macchiato', '焦糖玛奇朵', 34),
('Latte', '拿铁', 30),
('Americano', '美式咖啡', 25),
('Mocha', '摩卡', 33),
('Brewed Coffee', '新鲜调制咖啡', 20)
] # ①
DISCOUNT = 0.85
app = Flask(__name__)
@app.route('/') # ②
def index(): # ③
today = datetime.datetime.now()
t_visit = today.strftime('%Y-%m-%d %H:%M:%S %A') # ④
menus = []
weekend = 0
if today.weekday() >= 5: # ⑤
for item in joy_menus:
menus.append((item[0], item[1], int(item[2]*DISCOUNT))) # ⑥
weekend = 1
else:
menus = joy_menus
return render_template('joytime.html', today=t_visit, menus=menus, weekend=weekend) # ⑦
if __name__ == '__main__':
app.run() # ⑧
重要语句说明: 语句①定义菜单列表,列表元素是一个元组,包括咖啡英文名称,中文名称和价格。 语句②定义路由,代表在浏览器中访问:localhost:5000,将执行视图函数index()。 语句③定义视图函数index()。 语句④将当前日期转换成字符串。 语句⑤判断今天是否是周末。 语句⑥动态创建咖啡价目表。 语句⑦渲染模块,实现动态页面展示。 语句⑧启动快乐时光的后台服务程序。
3.2 模板文件:joytime.html
<!—joytime.html 模板文件 -->
<!doctype html>
<html>
<head>
<meta charset='utf-8'/>
<title>快乐时光咖啡屋</title>
<link rel="stylesheet" href="{{url_for('static',filename='css/joytime.css/')}}" />
</head>
<body>
<div >
Welcome to Joy Time
</div>
<div >
<ul>
<li>Home</li>
<li>Members</li>
<li>About</li>
<li>Join Us</li>
</ul>
</div>
<div >
<img src="{{url_for('static',filename='images/joytime.png/')}}"
width='1300' height='300' alt='coffee picture'/>
</div>
<div >
{% if weekend==1 %}
<h2>Today specials</h2>
{% endif %}
<p>Date: {{today}}</p>
</div>
<div >
<ul>
{% for item in menus %}
<li>{{item[1]}} </li>
{% endfor %}
</ul>
</div>
<div >
<ul>
{% for item in menus %}
<li>...... ¥{{item[2]}}</li>
{% endfor %}
</ul>
</div>
<div >
<p>©Copyright : Joytime.com.cn</p>
</div>
</body>
</html>
3.3 css格式文件
/* joytime.css : 欢乐时光咖啡屋 */
body {
background-color: linen;
}
li {
list-style: none;
}
#header {
background-color: black;
color: white;
text-align: center;
padding: 5px;
}
#nav {
line-height: 35px;
background-color: #dddddd;
color: #700505;
height: 300px;
width: 150px;
float: left;
padding: 5px;
}
#section {
width: 1100px;
float: left;
padding: 5px;
text-align: center;
}
#visit {
clear: both;
float: left;
margin-left: 680px;
text-align: center;
}
#item {
width: 200px;
clear: both;
float: left;
padding: 5px;
margin-left: 630px;
line-height: 30px;
}
#price {
width: 500px;
float: left;
padding: 5px;
line-height: 30px;
}
#footer {
background-color: black;
color: white;
clear: both;
text-align: center;
padding: 5px;
}
3.4 网站图片文件:joytime.png
图片效果如下:
4. 执行效果
4.1 环境安装
快乐时光网站运行,需要安装Flask第三方开发库。你可以在Windows的命令行窗口中执行以上命令: pip install flask -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
4.2 程序执行
第一步启动后台服务器程序:
D:\cases\快乐时光咖啡屋>python joytime.py
* Serving Flask app 'joytime'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
第二步使用浏览器访问网站:127.0.0.1:5000或者localhost:5000,你将看到如下结果: 至此,大功告成。我们已经完成了快乐时光咖啡屋官网程序的开发。应该说这是一个功能非常简单的网站程序,但对于WEB网站开发的初学者来说,这是一个很好的起点,作为一个练手项目,是一个良好的开端。
5. 程序优化
我们建议对joytime.py进行两个方面的优化工作。具体说来就是: 1.咖啡价目表是以硬编码的方式写入程序,如果咖啡价格调整,我们需要手动修改程序,这种程序与数据构成方式我们称之为紧耦和; 2. 这一版程序目前仅实现了周末咖啡打折,并没有完全实现天天打折的业务需求。 为了解决以上两个问题,可有以下的解决方案。一是将咖啡价目表joy_menus列表内容以文本文件形式存放,在程序启动后进行一次性加载,实现程序与数据的分离;二是进一步优化视图函数index(),在条件分支语句中,针对今天是工作日的情况,随机选择一种咖啡打85折,以真正兑现“特价咖啡天天喝”这个庄严的营销承诺。具体工作如下:
5.1 咖啡价目表保存
将咖啡价目表保存到文本文件coffee_menu.txt中,内容如下:
Cappuccino 卡布诺奇 32
Vanilla Latte 香草拿铁 35
Caramel Macchiato 焦糖玛奇朵 34
Latte 拿铁 30
Americano 美式咖啡 25
Mocha 摩卡 33
Brewed Coffee 新鲜调制咖啡 20
每行数据代表一种咖啡,包含咖啡英文名称、咖啡中文名以及咖啡价格等三项数据,数据项之间使用tab键进行分隔。文件以UTF-8格式保存。你可以使用Windows notepad对这个文件进行编辑和修改。
5.2 在joytime.py模块中新增函数load_menu()
这个函数的主要作用是读取咖啡价目表文本文件。内容如下所示:
def load_menu(fname):
"""
加载咖啡价目表内容
"""
joy_menus = []
with open(fname, encoding='utf8') as infile:
lines = infile.readlines()
for line in lines:
items = line.strip().split('\t')
joy_menus += [(items[0], items[1], int(items[2]))]
return joy_menus
这个函数load_menu(fname)能够方便地将coffee_menu.txt读入一个Python的列表,列表的每一个元素是一个元组,其中包含了包含咖啡英文名称、咖啡中文名以及咖啡价格等内容。
5.3 修改joytime.py相关内容
"""
joytime.py : 欢乐时光咖啡屋
"""
from flask import Flask, render_template
import datetime
def load_menu(fname): # ①
"""
加载咖啡价目表内容
"""
joy_menus = []
with open(fname, encoding='utf8') as infile:
lines = infile.readlines()
for line in lines:
items = line.strip().split('\t')
joy_menus += [(items[0], items[1], int(items[2]))] # ②
return joy_menus
fname = 'coffee_menu.txt'
joy_menus = load_menu(fname) # ③
DISCOUNT = 0.85
app = Flask(__name__)
@app.route('/')
def index():
today = datetime.datetime.now()
t_visit = today.strftime('%Y-%m-%d %H:%M:%S %A')
menus = []
weekend = 0
if today.weekday() >= 5:
for item in joy_menus:
menus.append([item[0], item[1], int(item[2]*DISCOUNT)])
weekend = 1
else:
for item in joy_menus: # ④
menus.append([item[0], item[1], item[2]])
numbers = len(menus)
idx = today.weekday() % numbers # ⑤
menus[idx][-1] = int(menus[idx][-1]*DISCOUNT) # ⑥
return render_template('joytime.html', today=t_visit, menus=menus, weekend=weekend)
if __name__ == '__main__':
app.run()
重要语句说明如下: 语句①定义加载咖啡价目表的函数; 语句②构建咖啡价目表的列表项; 语句③执行函数以从文本文件coffee_menu.txt读入咖啡价目表; 语句④循环体完成列表的内容复制,当然这个循环你也可以使用列表推导式代替; 语句⑤工作日选取一种咖啡打折,这里的idx代表某种咖啡在列表menus中的序号; 语句⑥对打折咖啡的价格进行进行调整。 以上就是程序优化部分的全部内容和代码实现。