使用 python flask 框架实现一个简单的抽奖系统

Flask 实现一个简易的抽奖系统

项目前置知识

目前 python主流的框架: Django 、flask 、Tornado

image

简介:

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),以及后台管理。但是缺点也很明显,它偏重。就像是一个已经装修好的房子,它提供好了你想要的东西,直接拿去用就好了。

image

​ 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库:用于编写命令行框架

image

用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中运行结果

image

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装饰器,把装饰的函数注册为路由。路由映射关系如图所示。

image

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.实现效果

image

8.正则技巧

我这里使用的是sublime中的正则转换

image

写正则

image

转换后效果

image

参考文章:   //建议读一下

什么是框架(https://zhuanlan.zhihu.com/p/114189046)  
python flask框架(https://blog.csdn.net/qq_39838607/article/details/119563692)

posted @ 2022-11-02 16:15  柳~  阅读(645)  评论(0编辑  收藏  举报