2020/5/8
富文本编辑器改成Markdown编辑器
装饰器
装饰器==拓展原来函数的一种函数,这个函数的特殊之处在于它的返回值也是一个函数。
使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。
参考:https://blog.csdn.net/xiangxianghehe/article/details/77170585
@app.route('/')
def hello():
print('hello')
- @app.route(’/’) == app.add_url_rule(’/’, ‘hello’, hello)。
- app是类的实例,调用了app实例中的route()方法,把下面的hello函数绑定成web页面的/。
- @下面的def就是被装饰的函数,它叫视图函数,最终在页面上显示的内容在这个函数里面。
- / 可以变为/post,/login。还可以变成/post/,其中是变量,它是被装饰函数的参数。
- url_for(‘hello’) 江湖返回’/’,加上_externa=True就会变成绝对地址。
web开发服务器
flask自带web开发服务器,所以不许要再下载nginx或者apache。
- Linux or Mac:
export FLASK_APP=hello.py
flask run
- Window:
set FLASK_APP=hello.py
flask run
- hello.py 下添加
if __name == '__main__':
app.run
重载器和调试器
- 重载器就是Flask自动监视代码,当代码出现变动自动重启使变动生效。
- 调试器在开发服务器使用,可以抛出错误,开启命令:
export FLASK_DEBUG=1
or
app.run(debug=True)
应用和请求上下文
我的理解:视图函数处理请求,需要一些对象(就像网络中客户端发送给HTTP的请求包),我们可以把它当作参数来传入视图函数中,但是有一个网站会有多个视图函数,而且视图函数需要的参数有很多,这样会使视图函数乱七八糟。
为此使用上下文把某些对象临时变为全局变量。但是这个全局变量是在一个线程中被访问,不会干扰到其他线程的。
模板 == 表现逻辑 == 前端
flask框架下面的模板,可以访问后端变量。
- html文件中使用{{name}}表示一个占位符。
- 在py文件中使用render_template(‘hello.py’, name=name)表示调用html模板,模板中的name变量的值是py当前作用域中的name。
- 控制结构:
(1). {% if 1 %} … {% else %} … {% endif %}
(2). {% for i in range(10) %} … {% endfor %}
(3). {% macro render(comment) %} … {% endmacro %} # 相当于定义函数
(4). {% macro.render(comment) %} # 调用函数
(5). {% import ‘macros.html’ as macros %} # 调用在另一个文件里面的宏
(6). {% block head %} … {% endblock %} # 一个叫head的区块
(7). {% extends “base.html” %} # 声明该模板衍生自哪里,就相当于复制粘贴过来一样,在这之后,就可以使用(6)中的代码覆盖base.html一样的区块
(8). {{super}} # 继承,原封不动抄写过来,不覆盖
表单
- @app.route(’/’, methods=[‘GET’,‘POST’])
- flask_wtf, wtfroms 都是flask内嵌的类,支持很多前端的字段,form可以当作render_template()的form参数到前端去渲染。
- validate_on_submit()会调用name字段的DataRequired()验证函数。
- 重定向:
(1). 解决用户提交表单刷新页面出现再次提交表单的错误。
(2). 解决办法是在后面重定向给客户端,客户端接受到重定向会又发一个GET请求给服务端,这样最后一个就是GET请求了。
(3). 但是GET请求会把之前请求的name值消掉,所以用会话session保存。redirect(url_for(‘index’))生成重定向响应,session[‘name’]保存name的值,render_template()中name=session.get(‘name’)。
- flash() 后端实现闪现效果。{% for message in get_flashed_messages() %} … {% endfor %} 前端渲染闪现效果
数据库
- 不管要使用什么数据库flask_sqlalchemy都是要安装的,因为它其实是一个数据库的管理软件,对于数据库的设定,简化命令都需要使用到它。
- 数据库驱动pymysql达到数据库连接的操作。
- 增删改数据库操作的三个步骤:
(1). 建立模型,就相当于创建表、字段、关系。之后使用db.create_all()建立(用一次就好)
(2). 改动添加到会话当中
(3). commit()提交会话
- 查询使用,模型名.query.执行方式()
项目搭建的问题
- 单一文件中的我们,创建app实例-添加路由。
- 为了方便更改配置,把创建实例与配置放在一个函数下面调用才创建,那么就可以创建不同配置的多个实例了。
- 但是会有一个问题,没有app不在全局变量下面路由无法添加。所以需要使用蓝本定义路由,把蓝本添加到创建实例函数中,也称注册。
- flasky.py 才是程序运行的文件。