您的位置:首页 > 其它

Flask框架开发的毕业设计知识点总结

2020-06-05 07:00 141 查看

经过几个月的学习与开发,终于完成了我的毕业设计,今天来总结一下Flask的重要知识点。

1.为什么要使用Web框架
web网站发展至今,特别是服务器端,涉及到的知识、内容,非常广泛。这对程序员的要求会越来越高。如果采用成熟,稳健的框架,那么一些基础的工作,比如,网络操作、数据库访问、会话管理等都可以让框架来处理,那么程序开发人员可以把精力放在具体的业务逻辑上面使用Web框架开发Web应用程序可以降低开发难度,提高开发效率。

总结一句话:避免重复造轮子。

2.Flask框架定义与特点:
def:Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login),都需要用第三方的扩展来实现。比如可以用Flask-extension加入ORM、窗体验证工具,文件上传、身份验证等。Flask没有默认使用的数据库,你可以选择MySQL,也可以用NoSQL。其 WSGI 工具箱采用 Werkzeug(路由模块) ,模板引擎则使用 Jinja2 。

特点:
1.非常灵活,扩展性强。
2.开发效率高,开发人员把精力放在业务逻辑上即可。
3.代码量少,可实现快速开发。

3.Flask的主要扩展包,开发常用,并不用刻意记忆,因为常用:

4.创建Flask项目过程:
先创建一个 虚拟环境 ,这个环境能够安装所有的东西,而你的主 Python 不会受到影响。另外一个好处就是这种方式不需要你拥有 root 权限。打开一个终端窗口,选择一个你想要放置应用程序的位置以及创建一个包含它的新的文件夹。

安装好Python和Pycharm后,即可在Pycharm中新建一个Flask项目,过程是:file->new project->flask->设置python解释器(选择自己创建的虚拟环境,如果有虚拟环境,点击AddLocal选择虚拟环境下的python.exe;如果没有虚拟环境,点击创建虚拟环境即可)
如下图:

导入开发要用的扩展包:

5.flask重要知识点(重点):
1.路由模块(视图选择匹配)
当客户端想要获取资源时,一般会通过浏览器发起HTTP请求。此时,Web服务器使用WSGI(Web Server Gateway Interface)协议,把来自客户端的所有请求都交给Flask程序实例。WSGI是为 Python 语言定义的Web服务器和Web应用程序之间的一种简单而通用的接口,它封装了接受HTTP请求、解析HTTP请求、发送HTTP,响应等等的这些底层的代码和操作,使开发者可以高效的编写Web应用。
程序实例使用Werkzeug来做路由分发(URL请求和视图函数之间的对应关系)。根据每个URL请求,找到具体的视图函数。 在Flask程序中,路由的实现一般是通过程序实例的route装饰器实现。route装饰器内部会调用add_url_route()方法实现路由注册。
调用视图函数,获取响应数据后,把数据传入HTML模板文件中,模板引擎负责渲染响应数据,然后由Flask返回响应数据给浏览器,最后浏览器处理返回的结果显示给客户端。
Werkzeug是一个遵循WSGI协议的python函数库。其内部实现了很多Web框架底层的东西,比如request和response对象;与WSGI规范的兼容;支持Unicode;支持基本的会话管理和签名Cookie;集成URL请求路由等。
Werkzeug库的routing模块负责实现URL解析。不同的URL对应不同的视图函数,routing模块会对请求信息的URL进行解析,匹配到URL对应的视图函数,以此生成一个响应信息。

2.模板引擎
视图函数的主要作用是生成请求的响应,这是最简单的请求。实际上,视图函数有两个作用:处理业务逻辑和返回响应内容。在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本。
本节学到的模板,它的作用即是承担视图函数的另一个作用,即返回响应内容。
模板其实是一个包含响应文本的文件,其中用占位符(变量)表示动态部分,告诉模板引擎其具体值需要从使用的数据中获取。使用真实值替换变量,再返回最终得到的字符串,这个过程称为“渲染”。Flask使用Jinja2这个模板引擎来渲染模板。Jinja2能识别所有类型的变量,包括{}。 Jinja2模板引擎,Flask提供的render_template函数封装了该模板引擎,render_template函数的第一个参数是模板的文件名,后面的参数都是键值对,表示模板中变量对应的真实值。

<li class="layui-nav-item">
<a class="" href="javascript:;">图书管理</a>
<dl class="layui-nav-child">
<dd><a href="{{ url_for('addbook') }}">添加图书</a></dd>
<dd><a href="{{ url_for('books') }}">图书信息</a></dd>
<dd><a href="{{ url_for('searchbook') }}">图书信息查询</a></dd>
</dl>
</li>

添加图书后台返回相应内容,跳转代码:

return redirect(url_for('addbook'))

3.web表单
web表单是web应用程序的基本功能。

它是HTML页面中负责数据采集的部件。表单有三个部分组成:表单标签、表单域、表单按钮。表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器。

在Flask中,为了处理web表单,我们一般使用Flask-WTF扩展,它封装了WTForms,并且它有验证表单数据的功能
表单类的定义代码:

class Login(FlaskForm):
username = StringField(label='用户名', validators=[DataRequired()])
password = PasswordField(label='密码', validators=[DataRequired()])
submit = SubmitField(label='登录')

视图中获取表单数据代码:

from flask import Flask,render_template,request

@app.route('/login',methods=['GET','POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
print username,password
return render_template('login.html',method=request.method)

模板页面代码:

<form class="layui-form" method="post">
{{ form.csrf_token }}
<div class="layui-input-inline">
{{ form.username(class="layui-input",placeholder="管理员账号") }}
</div>
<div class="layui-input-inline">
{{ form.password(class="layui-input",placeholder="管理员密码") }}
</div>
<div class="layui-input-inline login-btn">
{{ form.submit(class="layui-btn") }}
</div>
</form>

4.数据库

1.Flask-SQLAlchemy
在Flask-SQLAlchemy中,插入、修改、删除操作,均由数据库会话管理。会话用db.session表示。在准备把数据写入数据库前,要先将数据添加到会话中然后调用commit()方法提交会话。

数据库会话是为了保证数据的一致性,避免因部分更新导致数据不一致。提交操作把会话对象全部写入数据库,如果写入过程发生错误,整个会话都会失效。

数据库会话也可以回滚,通过db.session.rollback()方法,实现会话提交数据前的状态。在Flask-SQLAlchemy中,查询操作是通过query对象操作数据。最基本的查询是返回表中所有数据,可以通过过滤器进行更精确的数据库查询。
连接数据库的配置类:

#连接mysql数据库
class Config(object):
SQLALCHEMY_DATABASE_URI = 'mysql://root:root@127.0.0.1:3306/bookManagementSystem'
SQLALCHEMY_TRACK_MODIFICATIONS = True
SECRET_KEY = "hhjkuiiisfdadd"
#SQLALCHEMY_ECHO = True

使用模型类创建数据库的表代码:

#3 book 图书
class Book(db.Model):
__tablename__ = 'book'
isbn = db.Column(db.String(13), primary_key=True)
name = db.Column(db.String(64))
author = db.Column(db.String(64))
type = db.Column(db.String(64)) #图书类别
status = db.Column(db.Boolean, default=True)  #是否在馆
number = db.Column(db.Integer) #图书数量
description = db.Column(db.String(100)) #图书简介

数据库查询代码query:

#管理员登录
@app.route('/login',methods=['GET','POST'])
def login():
form = Login()
if form.validate_on_submit():
admin = Admin.query.filter_by(id=form.username.data, password=form.password.data).first()
if admin is None:
msg = '账号或密码错误!'
return render_template('login.html', form=form, msg=msg)
else:
login_user(admin)
session['adminId'] = admin.id
print(admin.id)
session['name'] = admin.name
print("管理员登录测试:" + admin.name + "  成功登录")
return redirect(url_for('admin_main'))
return render_template('login.html', form=form)

2.数据库迁移
在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库。最直接的方式就是删除旧表,但这样会丢失数据。

更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用到数据库中。

在Flask中可以使用Flask-Migrate扩展,来实现数据迁移。并且集成到Flask-Script中,所有操作通过命令就能完成。
为了导出数据库迁移命令,Flask-Migrate提供了一个MigrateCommand类,可以附加到flask-script的manager对象上。
首先要在虚拟环境中安装Flask-Migrate。
5.蓝图(即模块化)
我们学习Flask框架,是从写单个文件,执行hello world开始的。我们在这单个文件中可以定义路由、视图函数、定义模型等等。但这显然存在一个问题:随着业务代码的增加,将所有代码都放在单个程序文件中,是非常不合适的。这不仅会让代码阅读变得困难,而且会给后期维护带来麻烦。

问题:一个程序执行文件中,功能代码过多。就是让代码模块化。根据具体不同功能模块的实现,划分成不同的分类,降低各功能模块之间的耦合度。python中的模块制作和导入就是基于实现功能模块的封装的需求。

尝试用模块导入的方式解决: **我们把上述一个py文件的多个路由视图函数给拆成两个文件:app.py和admin.py文件。**app.py文件作为程序启动文件,因为admin文件没有应用程序实例app,在admin文件中要使用app.route路由装饰器,需要把app.py文件的app导入到admin.py文件中。

本文包含flask开发的基础重要的知识,但还有很多flask开发的知识没有写上,后期会更新。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: