学习flask的番外3之读人家的源码 - 图1

项目实战

写在前面

  过了一个五一假期好久都没学习,是因为我懒(回家,毕竟是农村的孩子,路远),这一次是看人家的写项目,先看人家的代码,看懂然后再自己写。这次的代码是看《Flask+Web开发实战:入门、进阶与原理解析(李辉)》,他的代码在这里:
代码传送门
在线demo
然后呢会用这个来记录一些学习的之前没看到的。

开始看

看初始化文件

  首先来看一下这个项目的初始化文件,就是init文件。在Flask中,配置不仅可以通过config对象直接写入,还可以从文件 中读取。在SayHello中,把配置移动到一个单独的文件中,将其命名为 settings.py(也常被命名为config.py)。当在单独的文件中定义配置时, 不再使用config对象添加配置,而是直接以键值对的方式写出,和保存 环境变量的.flaskenv文件非常相似。

  1. app.config.from_pyfile('settings.py')

这是这个文件中来引入配置文件的语句,然后很多时候可以在settings使用class来写配置,然后使用from_object来引入,因为如果你有很多环境方便管理。然后你可以去看一下官方文档:
http://flask.pocoo.org/docs/1.0/config/
我比较喜欢使用使用对象来引入,这个主要是看项目要求和个人喜好。
模板配置:
在这个初始化文件中,还有对jinjia2模板的相关设置:

  1. app.jinja_env.trim_blocks = True
  2. app.jinja_env.lstrip_blocks = True

在flask中我们默认使用jinjia2的模板,然后在jinjia2中有一些空格控制,然后使用者两个配置可以然jinjia2在配置模板的时候去掉多余的空格,可以去看一下这个博客,你也许会了解了:flask配置之jinjia2
然后这里面使用了一个叫做flask-moment的扩展,作用是将给定的任意日期转换成多种不同的格式,具有强大的日期计算功能,同时也内置了能显示多样的日期形式的函数。和使用bootstrap集成一样,也是需要初始化。

看模板文件

  模板文件是来创建数据库的,所以是很重要的一个文件,然后这个项目的功能比较简单,所以也只有一张表。这个没有什么好说的,就是使用SQLalchemy来创建。这里面用到的配置在配置文件中。在最后这个时间里面默认时间是使用的协调世界时(这是个嘛玩意咱也不知道,咱也不敢问),然后index是指开启索引。

  1. class Message(db.Model):
  2. id = db.Column(db.Integer, primary_key=True)
  3. name = db.Column(db.String(20))
  4. body = db.Column(db.String(200))
  5. timestamp = db.Column(db.DateTime, default=datetime.utcnow, index=True)

看from文件

  在这个项目中有表单的存在,所以是使用的是flask-wtf这个扩展,所以要创建一个表单类。就定义了一个姓名、内容和提交按钮,其他的没有什么。

  1. class HelloForm(FlaskForm):
  2. name = StringField('Name', validators=[DataRequired(), Length(1, 20)])
  3. body = TextAreaField('Message', validators=[DataRequired(), Length(1, 200)])
  4. submit = SubmitField()

看配置文件

  配置文件一开始就执行了一个判断你开发环境的操作:

  1. WIN = sys.platform.startswith('win')
  2. if WIN:
  3. prefix = 'sqlite:///'
  4. else:
  5. prefix = 'sqlite:////'

通过判断你的环境是不是Windows系统,之所以做这个判断是因为Windows和Linux的转义不一样所以要做一个判断。然后就是生产数据库的连接,很多的都是将数据库的信息保存到本地环境然后读取相关配置避免将这些关键信息明文写出,不然如果你的项目出现了被开源的情况怎么办?就像是某哔和某疆,然后就是指定一个秘钥,在flask中使用session之类的会让你提供一个秘钥来对你的信息加密。其他然后都没什么好说的,就是数据库的配置。

  1. dev_db = prefix + os.path.join(os.path.dirname(app.root_path), 'data.db')
  2. SECRET_KEY = os.getenv('SECRET_KEY', 'secret string')
  3. SQLALCHEMY_TRACK_MODIFICATIONS = False
  4. SQLALCHEMY_DATABASE_URI = os.getenv('DATABASE_URI', dev_db)

看视图文件

  到了看最关键的文件的时候了,视图函数来处理我们的请求,然后来返回结果。然后这个很简单,只有一个视图函数。就是index

  1. @app.route('/', methods=['GET', 'POST'])
  2. def index():
  3. messages = Message.query.order_by(Message.timestamp.desc()).all()
  4. form = HelloForm()
  5. if form.validate_on_submit():
  6. name = form.name.data
  7. body = form.body.data
  8. message = Message(body=body, name=name)
  9. db.session.add(message)
  10. db.session.commit()
  11. flash('Your message have been sent to the world!')
  12. return redirect(url_for('index'))
  13. return render_template('index.html', form=form, messages=messages)

然后指定了路由和支持的请求方式,因为我们需要是展示留言那就是GET,如果有新的留言进来那么就是表单就是 POST,然后初始化了form和留言列表,查询所有留言然后展示出来,如果请求里面submit是被点击了的,那么就将数据存入数据库。然后将页面重定向到首页。

看看模板文件

  我们来看一下他是怎么在模板中渲染数据的,然后写了一个 base文件。因为错误页面和首页都有一样的一些东西,所以将这些东西抽出来然后封装一下。在base中,然后首先是使用消息闪现来显示,就是这个:

  1. {% for message in get_flashed_messages() %}
  2. <div class="alert alert-info">
  3. <button type="button" class="close" data-dismiss="alert">&times;</button>
  4. {{ message }}
  5. </div>
  6. {% endfor %}

然后就是展示数据。

写在后面

  这个项目整体来说很简单是一个很好的入门flask的项目,但是里面有很多可以借鉴之处。
  本文只是学习笔记,如果有损害到你的利益请联系删除