JessePinkmen 2020-06-14
Flask 是一个Python编写的一种轻量级的框架,只提供了web框架基本的功能,比其他的框架更加灵活、自由
框架开发的时候,兼容性是一个很大的问题
开发环境:Python3.7版本,Flask1.1.1 版本
虚拟环境的使用
工作中会根据需求,在Python环境下使用各种框架和包,但是可能每个项目使用的框架和版本不一样,这样就要根据需要更新和卸载相应的库,为了不必要的麻烦,便于管理,使用虚拟环境
anaconda虚拟环境的安装,创建指定Python版本的环境
conda create -n flask_env python=3,7
flask_env:环境的名字,任意,有阅读性
Python=3.7:指定Python的版本
激活进入/离开虚拟环境
conda active flask_env
conda deacticve
进入虚拟环境,下载flask
pip install flask==1.1.1
查看当前环境下的包
pip freeze
实现最小应用
使用 pycharm 创建一个项目project01,设置Python虚拟环境
路由
Flask 根据 HTTP 请求的url在路由表中匹配定义好的路由规则,找到对应的函数处理请求。
在这个过程中需要保存一个url到行数的映射关系,我们把处理url到函数之间的关系成为路由
flask中的路由是使用装饰器的形式定义的,并且必须是/开头,否则报错
视图函数
视图函数是处理用户的请求,返回响应的函数代码块
在Flask中视图函数的名字不能重复
启动服务器
run启动参数 | 说明 |
---|---|
host | 主机地址,默认是127.0.0.1,运行外部ip地址访问,0.0.0.0 |
port | 端口号,默认是5000 |
debug | 调试模式,默认为false,开发的时候一般设置为true,这样有视图有错误,在浏览器中显示,方便调试错误。项目上线需要改为false。也可以启动重启代码。 |
use_reloader | 是否自动重启代码,默认为false,true为自定义 |
url路径参数(动态路由)
可以通过请求的url中获取需要的参数。例如:现在定义一个路由/users/,如果请求的url为/users/1,表明想要获取编号为1的用户信息,则这里的1就是请求中传递的参数
@app.route(‘/users/<sid>‘) def hello_world(sid): return ‘查询id是{}的用户信息‘.format(sid)
上面代码中<>即为转换器语法,默认为字符串类型,即匹配到的内容始终为字符串类型
Flask中其他类型转换器
转换器类型 | 使用 |
---|---|
string字符串类型 | < string:name > |
int整数类型 | < int:name > |
float小数类型 | < float:name > |
path路径类型 | < path:name > |
flask默认采用是jinja2模板进行模板渲染,jinja2是python第三方的一个模板渲染模块,通常用于flask,tornado框架中,jinja2的开发大量参考了django的模板渲染系统,相似度达到98%
静态文件:css,js,img等这些都是静态文件,flask中默认加载当前目录下的static目录下的静态文件
模板文件:flask默认当前目录下的templates目录下的模板文件
@app.route(‘/index‘) def hello_world(): return render_template("index.html")
视图传递参数到模板
如果使用这种方式传递参数,如果变量的数量多的情况下,使用起来不方便,可以使用解包将函数内的所有变量传递到模板中。
html页面参数语法:{{name}}
@app.route(‘/index‘) def hello_world(): name = "老王" age = 33 gender = "男" return render_template("index.html",name=name,age=age,gender=gender) @app.route(‘/index‘) def hello_world(): name = "老王" age = 33 gender = "男" return render_template("index.html", **locals())
模板语法
变量的使用
语法:{{变量名}},jinja2模板引擎支持python中基本数据类型,类变量等
变量可以根据索引或者 . 取出来
jinja2模板引擎可以使用一些python提供的一些方法。例如:upper,replace,lower等方法
比如:{{p.name.replace("老","小")}}
控制语句
(1) if语句
{% if 条件%}
{% elif 条件 %}
{% else %}
{% endif %}
(2) for循环
{% for 变量 in 可迭代对象 %}
{% endfor %}
#if控制语句 {% if age<18 %} 未成年 {% elif age<50 %} 青壮年 {% else %} 老年 {% endif %} #for循环 {% for i in hobby %} {{ i }} {% endfor %} {% for k,v in info.items() %} {{ k }}-{{ v }} {% endfor %} {% for i in hobby %} {% if loop.index%2 == 0 %} {{ loop.index0 }}:{{ i }} {% else %} {{ loop.index0 }}:{{ i }} {% endif %} {% endfor %}
(3) loop
在for循环中,jinja2还提供一个特殊变量,用来获取当前的遍历状态
方法 | 说明 |
---|---|
loop.index | 当前迭代的索引(从1开始) |
loop.index0 | 当前迭代的索引(从0开始) |
loop.first | 是否是第一次迭代,返回bool |
loop.last | 是否是最后一次迭代,返回bool |
loop.length | 序列中项目的数目 |
过滤器
过滤器本质是函数,可以使用过滤器将视图传递过来的值进行修改显示的效果
jinja2提供的常见过滤器:
{{ nick_name | capitalize }} {{ nick_name | upper } {{ nick_name | replace("ni","NI") }}
方法 | 说明 |
---|---|
capitialize | 首字母转换成大写,其他字母转换为小写 |
lower | 转换成小写形式 |
upper | 转换成大写形式 |
title | 每个单词的首字母都转换成大写 |
replace | 替换字符串的值 |
round | 对数字进行四舍五入 |
safe | 渲染时值不转义 |
#自定义过滤器 def my_add(num1, num2): return num1 + num2 app.add_template_filter(my_add, "myadd")
在全栈开发过程中,把css,js,img等非html内容看做是静态内容
在网站有很多资源不存在数据库中,直接放在服务器上,那么这样的资源叫做静态资源
flask在开发过程中,静态文件需要放在默认的静态位置(当前脚本目录下的static目录,并且在html中,使用/static/来代替目录)
针对网站所有的页面通常使用一个模板,由于风格和需求导致,所有页面都相同的部分,为了减少代码冗余,方便代码修改,出现了继承和加载两种机制
1、继承:
当我们浏览器一个网站的时候发现里面有大部分是相同的,这时候我们为了去除代码的冗余,使用继承。
(1) 定义父模板,在父模板中定义block
(2) 在子模板中继承,根据需要实现父模板中的block
2、包含
将可以常用的页面内容如导航条,尾页信息等不变的组件可以保存到单独的文件中,然后在需要使用敌方按照如下语法导入即可。
#继承 {% extends "father.html" %} {% block title %}{% endblock %} #包含 {% include "myblock.html" %}