使用 python flask 框架实现一个简单的抽奖系统
Flask 实现一个简易的抽奖系统#
项目前置知识#
目前 python主流的框架: Django 、flask 、Tornado
简介:
1.框架#
框架? 为什莫使用框架? (前置知识讲解比较冗杂,望谅解)
框架:英文名为 (Framework),意思是框架、机制、基准。最高源于建筑行业,现在框架这个概念使用十分广泛,尤其是在软件行业。 在软件工程中,框架被定义为整个或部分系统的可重用设计,表现为一组可重用设计,是可被应用开发者定制的骨架。
通俗来说,一个框架是实现某种功能或者是项目的半成品,提供了一些常用的工具和一些基础通用的组件,可以使开发人员在此基础上,更高效的实现业务需求的设计。“使用框架,可以使开发者重复造轮子,而是直接调用其类或者函数就可以实现需求的功能 ”
举个例子帮助大家理解,相信大家日常生活都了解过ppt。我们来看一下ppt的使用逻辑,当我们打开一个 office Power Point或者是WPS ,然后直接新建空白演示文稿就可以直接些内容,想要什么背景,字体,主题风格等,都可以直接在空白文稿中添加,实际上这个过程中,我们就在使用框架。还记得我们前面说的吧,框架是实现某种功能或者是项目的半成品,这里就和我们导入的ppt模板是一个道理,当我们导入一个ppt模板之后,只需要在里面添加我们要写入的内容就可以了,不用再担心字体库、风格库、动画库等。这些基础内容都是框架搭建好的基础支撑。
那我们做了这么多的赘述,其实就是想知道,我们为啥要在计算机行业使用框架,这个在前面其实已经提到了。互联网软件系统随着业务的发展,变得越来越复杂,不同领域的业务所涉及到的知识、内容、问题非常非常多,那么一定程度上使用框架就可以避免程序员重复造轮子,使我们把重心放在要实现的功能上面。
2.python flask框架#
flask是python中基于WSGI的轻量级 web开发框架,也被我们称之为web微框架。微框架中的"微" 表示flask的目标是保持核心简单而又可扩展。flask不会替你做出很多决定,比如选用何种数据,使用何种模板引擎,这些在flask中都非常容易改变。"Flask可以变成你想要的任何东西,一切恰到好处,由你做主 "
这与python中最出名的Django框架形成了鲜明的对比。Django框架功能全面,它提供一站式解决方案,集成了MVT(Model-View-Template)和ORM(Object Relational Mapping),以及后台管理。但是缺点也很明显,它偏重。就像是一个已经装修好的房子,它提供好了你想要的东西,直接拿去用就好了。
Flask相对于Diango而言是轻量级的web框架。和Django不同,Flask轻巧、简洁,通过定制第三方扩展来实现具体的功能。就像是已经刷好墙的房子,你想要什么家具就自己添加。
//flask 包下载之后,会自动下载依赖库
Flask依赖于两个外部库——Werkceug和Jnija 2。Werkrcup是一个WSGI(在Web应用和多种服务器之间的标准Python接口)工具集,Jnija 2负责渲染模板。所以,在安装Flask时,会自动安装这两个库。
为了更好地管理Python应用,通常情况下会在虚拟环境中安装Flask框架。安装命令如下:
pip install flask
MarkupSafe 库:附带Jinjia,用于转义渲染模板不受信任的输入
itsDangerous:保护flask会话的cookie
Click库:用于编写命令行框架
用Flask实现随机抽奖应用#
1.基础代码#
//新建项目后的第一个简单的flask应用就诞生了
#导入库
from flask import Flask
app = Flask(__name__) #创建一个Flask实例
@app.route('/')
def index(): # 视图函数
return 'Hello World!'
if __name__ == '__main__':
app.run()
//那,这段代码是什么意思呢?
¤ 导入Flask库,定义Flask实例化对象app
¤ 实例化一个对象 app 时,传入 __name__ :目的是接受包或者模块的名称作为参数,让flask.helpers.get_root_path以便获得静态文件和模板文件的目录 “__name__ 可以简单认为代表目前这个文件。有了这个参数Flask会读取参数所提供的文件的内容,来获取app模板或是静态文件。”
¤ 使用route() 装饰器告诉Flask什么样的URL能触发执行被装饰的函数。
这个装饰函数就是视图函数,它返回显示在用户浏览器中的信息。
¤ 使用run()函数来让应用运行在本地服务器上。其中“ if _ name _ main _” 可确保服务器只在该脚本被Python解释器直接执行时才会运行。
// if __name__ == '__main__' 解释
¤ 由于pyton文件既可以做为一个脚本执行,也可以作为一个包被引用。 所以当我们只想让他作为一个脚本被执行时,就可以使用 if __name__ == '__main__' 来限定。原因是因为 当 print(__name__)直接被当作脚本执行时,会返回__main__ ,但如果被当作包引入时,print则不会输出任何结果。那么这个==判断就会失效,该程序下面的run函数就不会被执行。
2.在pycharm中运行结果#
3.开启调试模式#
虽然run() 方法使用于启动本机的开发服务器,但是每次修改代码后都要手动的重启它,比较烦琐,此时可是使用Flask 调试模式解决。
app.run(debug=True)
此外可以啊绑定ip和端口
app.run(host='0.0.0.0', port=80, debug=True)
0.0.0.0代表电脑所有的IP。80是HTTP网站服务的默认端口。什么是默认?比如,我们访问网站http://www.example.com,其实是访问的http://www.example.com:80,只不过:80可以省略不写。
由于绑定了80端口,需要使用root权限运行server.py。也就是:
$ sudo python3 server.py
4.路由#
客户端(如Web浏览器)把请求发送给Web服务器后,Web服务器会把请求发送给Flask程序实例。程序实例需要知道对每个URL请求运行哪些代码,所以保存了一个URL到Pybon函数的映射关系。处理URL和函数之间关系的程序称为路由。
在Flask程序中,定义路由的最简便方式是使用程序实例提供的app. route装饰器,把装饰的函数注册为路由。路由映射关系如图所示。
5.模板#
模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请求的上下文中才能知道。使用真实值替换变量,再返回最终得到的响应字符串,这一过程称为渲染。为了渲染模板,Flask使用了一个名为
Jinja2的强大模板引擎。
render_template('tempalta_name.html',temolate_val = name)
第一个参数是渲染的模板名称 , 其余为模板中的变量的值
例如下面代码中的 return render_template('index.html',hero1=hero,h = hero[num])
如果在视图函数中调用代码,则会渲染tempales目录下的index.html模板文件,并将模板文件中的{{hero1}} 使用hero替代
6.项目代码#
// flask/app.py
// index.html是在tempales文件夹中,且tempales文件夹必须要与 运行的文件(调用它的文件app.py)同级。
from flask import Flask, render_template
from random import randint
app = Flask(__name__)
hero = ['安琪拉', '白起', '老夫子', '不知火舞', '妲己', '狄仁杰', '典韦', '韩信', '刘邦', '刘禅', '鲁班七号', '墨子',
'孙膑', '孙尚香', '孙悟空',
'项羽', '亚瑟', '周瑜', '庄周', '蔡文姬', '武则天', '廉颇', '程咬金', '后羿', '扁鹊', '钟无艳', '花木兰',
'小乔', '王昭君', '虞姬', '甄姬',
'李元芳', '张飞', '刘备', '牛魔', '张良', '兰陵王', '露娜', '东皇太一', '貂蝉', '达摩', '曹操', '芈月', '阿轲',
'高渐离', '钟馗', '关羽',
'李白', '宫本武藏', '吕布', '嬴政', '娜可露露', '赵云', '姜子牙', '橘右京', '干将莫邪', '鬼谷子', '诸葛亮',
'安其拉', '白起', '不知火舞',
'妲己', '狄仁杰', '典韦', '韩信', '老夫子', '刘邦', '干将莫邪', '刘禅', '鲁班七号', '墨子', '孙膑', '孙尚香',
'孙悟空', '项羽', '亚瑟',
'周瑜', '庄周', '蔡文姬', '甄姬', '廉颇', '程咬金', '后羿', '扁鹊', '大乔', '钟无艳', '小乔', '王昭君', '虞姬',
'李元芳', '张飞', '刘备',
'牛魔张良', '兰陵王', '露娜', '貂蝉', '达摩', '曹操', '芈月', '荆轲', '高渐离', '钟馗', '花木兰', '关羽',
'李白', '宫本武藏', '吕布',
'嬴政', '娜可露露', '武则天', '赵云', '姜子牙','戈亚','海月']
@app.route("/index")
def index():
return render_template('index.html', hero=hero)
@app.route("/choujiang")
def choujiang():
num = randint(0,len(hero)-1)
return render_template('index.html',hero=hero,h = hero[num])
app.run(debug=True)
// flask/templates/index.html ,这里可以自己利用去美化前端页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ hero1 }}<br/><br/><br/>
<a href="/choujiang">随机抽取</a></br></h1>
<h1>你抽到的英雄是 : {{ h }}</h1>
</body>
</html>
7.实现效果#
8.正则技巧#
我这里使用的是sublime中的正则转换
写正则
转换后效果
参考文章: //建议读一下
什么是框架(https://zhuanlan.zhihu.com/p/114189046)
python flask框架(https://blog.csdn.net/qq_39838607/article/details/119563692)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具