最近在学习flask框架,最快的学习方式一方面是看官方文档。在看完官方文档给的示例项目后,还想再看一些初学的项目来熟悉此框架。因此,本系列博客只要是来记录自己学习flask框架所看的项目源代码。
本篇主要是对sayHello项目
1. 项目简介
项目github地址为
https://github.com/greyli/sayhello
该项目主要有如下几个文件组成
根据README.md中的讲解,在安装好相关环境依赖后,通过如下方式启动项目
$ flask forge
$ flask run
* Running on http://127.0.0.1:5000/
使用浏览器打开页面后,是这样的效果:
此项目的功能逻辑较为简单,主要是发送消息,然后所有人都可以看到。
2.过程讲解
我们可以按照刚才执行的步骤来一步一步的阅读相关的代码。
2.1 forge方法
首先在启动之前,我们执行了一条命令
flask forge
此命令看字面意思是,让flask框架去执行一个叫forge的方法,从源代码中,我们可以搜索下是否有个这个 forge 关键字的代码:
在commands.py文件中,确实有个叫forge的方法。通过阅读注释,可以知道这个方法的主要作用是虚拟出一些信息。而且有个count参数,代表要虚拟出具体多少条消息。对于具体的实现,则是通过一个叫Faker的对象,来生产出数据,然后根据count值来生成具体多少条信息:
for i in range(count):
message = Message(
name=fake.name(),
body=fake.sentence(),
timestamp=fake.date_time_this_year()
)
2.2 index方法
在我们在网页输入上对应的IP:PORT后,会跳转到主页。因此,我们可以查看主页的代码是如何实现的。在view.py中,可以找到对于路由为’/'对应的方法:
此方法包含了前端信息提交以及信息展示两个功能。
首先是判断是否有合规提交,若有合规提交,就将数据写入到数据库中并重新加载主页。对于数据的提交,在获取到前端传入的数据后,会执行一个叫flash的方法,此方法主要是给前端用户返回一条提示性的消息。此消息在渲染模板时,通过模板中的get_flashed_messages() 方法来的获取并渲染:
在加载主页前,会将message数据经过排序后,传入到模板中填充,并返回给前端:
messages = Message.query.order_by(Message.timestamp.desc()).all()
return render_template('index.html', form=form, messages=messages)
3.入口讲解
在此项目中,入口为__init__.py文件
首先是定义了此app的名字为sayhello,并且从settings.py中加载了配置文件。然后通过根据加载配置文件的数据来初始化数据库,bootstrap等。
最后是将views, errors, commands都加载到程序中。接下来,我们可以先看看配置文件里边都写了什么
首先是根据不同的平台,对于数据库前缀有所不同。然后是设置SECRET_KEY,以及数据库相关的配置。
4.其他讲解
由于此项目逻辑较为简单,刚才已经将此项目中主流程所运行的代码都说了一遍。但是还有一些代码并不在主流程中,我们可以单独拎出来说一下。
4.1 errors.py
errors中主要是定义了两个回调方法,在出现404,500时候,分别调用这两个方法。
我们可以试一下404的回调。在浏览器中输入ip:port,并且跟上一个没有在后端中声明的路径,就可以出现404
4.2 forms.py
forms里边主要是定义了一个结构体,是前端给后端发送提交信息的结构体。此结构体继承了FlaskForm,因此此结构体主要作用就是前后端传输数据时使用的。主要分成三个属性:姓名,内容,提交。
4.3 models.py
models里边主要是一个Message类,此类继承自db.Model。因此可以猜出此类主要作用是和存储数据库相关的。每条记录都会成为一个Message对象,并存入数据库中
5.收获
通过此项目,我主要学到了如下的技巧
5.1 flash
flash可以返回给用户一些交互的信息。比如登录账号时候不管是成功还是失败,都需要给用户一个提示。通过flash写的数据,在前端模板文件中可以使用get_flashed_messages()方法来获取到。我们可以做个验证。
在view.py下再写一个接口
@app.route('/flash',methods=['GET','POST'])
def test():
flash('测试一下flash')
return render_template('test.html')
然后在templates里边新建一个test.html
<head>text</head>
<body>
{{get_flashed_messages()}}
</body>
这样,这个接口就写完成了。然后通过访问 localhost:5000/flash就可以验证这个:
5.2 404,500等页面回调
flash可以使用 @app.errorhandler(状态码) 的注解来回调遇到对应状态码该调用哪个方法,如404,500等。