文章目录
转载请注明原始链接:https://blog.csdn.net/a464057216/article/details/83098125
后续此博客不再更新,欢迎大家搜索关注微信公众号“测开之美”,测试开发工程师技术修炼小站,持续学习持续进步。
简介
Flask是Python的一个轻量微框架。微框架中的“微”,意味着Flask核心简单,但这并不意味着Flask功能薄弱,相反,Flask有许多插件支持连接数据库、表单验证、文件上传等各种功能,配合这些插件可以实现非常强大的功能。Flask是Python在Web开发领域的一件利器。
安装
Flask支持Python>=3.4、Python 2.7或PyPy,安装命令:
pip install Flask
自动安装如下依赖:
- Werkzeug:Python的一种WSGI实现。
- Jinja:一种模板渲染语言。
- MarkupSafe:配合Jinja,转义客户端的输入,规避跨站脚本攻击(Cross Site Script,CSS)。
- ItsDangerous:利用数字签名技术保证数据一致性,用来保护Flask的session加密。
- Click:编写命令行程序的框架,Flask用它支持
flask
命令并允许添加自定义命令。
如下依赖不会自动安装,如果环境上存在的话,Flask会自动加载使用:
- Blinker:支持信号量(Signal)。
- SimpleJSON:兼容Python的
json
模块,速度更快。 - python-dotenv:运行
flask
命令时,提供从dotenv
提取环境变量的支持。 - Watchdog:开发模式下,提供更快、更高效的装载器。
小试牛刀
# hello.py,应用程序文件名不能是flask.py,这会和Flask本身冲突
from flask import Flask #一个Flask类的实例表示一个Web应用程序
app = Flask(__name__) #第一个参数是应用程序的模块或包名,Flask根据此参数查找模板、静态文件等内容
@app.route('/') #route()装饰器,定义URL和视图函数的绑定关系
def hello_world():
return "Hello, World!"
启动应用程序可以使用flask
命令:
$ export FLASK_APP=hello.py
$ flask run
也可以使用Python的-m
开关:
$ export FLASK_APP=hello.py
$ python -m flask run
Flask会启动一个非常简单的内置服务器( 仅供调试,不建议用于生产环境),浏览器访问http://127.0.0.1:5000即可看到Hello, World
的响应:
默认情况下,Flask应用程序只监听本机loopback网络,flask run --host=0.0.0.0
可以令程序监听所有网络端口。一定要确保关闭了调试功能,再开放监听所有网络端口。
开发模式与调试功能
Flask的开发模式,在程序出错时提供调试功能,并且自动装载最新的代码,不必每次更新代码都重启应用程序。flask run
之前通过如下方式开启开发模式:
export FLASK_ENV=development
开发模式的Flask开启了如下功能:
- 开启调试器
- 开启自动装载器
- 在Flask应用程序上应用调试器
如果想只在Flask应用程序上应用调试器,使用如下命令:
export FLASK_DEBUG=1
生产环境无论如何都不要开启开发模式,开发模式下允许应用程序的用户在服务器上执行任意的Python代码。比如如下异常场景:
鼠标悬浮在报错的那一层上,点击最后侧的命令行图标,即可基于该层进行调试:
路由
Flask通过route()
装饰器绑定URL和视图函数,例如:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Index Page'
@app.route('/hello')
def hello():
return 'Hello, World'
URL的可变部分用<variable_name>
代替,<variable_name>
的值作为关键字参数传递给绑定的函数,也可以使用<converter:variable_name>
指定变量的类型。
from flask import Flask
from markupsafe import escape
app = Flask(__name__)
@app.route('/user/<username>')
def show_user_profile(username):
return 'User %s' % escape(username)
@app.route('/post/<int:post_id>')
def show_post(post_id):
return 'Post %d' % post_id
@app.route('/path/<path:subpath>')
def show_subpath(subpath):
return 'Subpath %s' % escape(subpath)
converter
支持如下类型:
- string:除斜线(/)外任何字符串。
- int:十进制正整数。
- float:正浮点数。
- path:类似
string
类型,但是接受斜线(/)。 - uuid:接受uuid字符串。
对于特殊字符(如#),在浏览器中输入时需要URL转码后访问(如%23)。
URL唯一性与URL重定向
有如下两种格式定义的URL:
rom flask import Flask
app = Flask(__name__)
@app.route('/projects/')
def projects():
return 'The project page'
@app.route('/about')
def about():
return 'The about page'
访问http://127.0.0.1:5000/projects
,Flask会将请求重定向到http://127.0.0.1:5000/projects/
。访问http://127.0.0.1:5000/about/
,Flask响应404 Not Found。建议使用不带后缀斜线的URL,为资源确定唯一的URL,防止搜索引擎为同样的页面建立两次索引。
生成URL
使用url_for()
函数生成某个方法的URL,url_for()
的第一个参数是方法名(字符串),然后是关键字参数,这些关键字参数相当于URL的可变部分<variable_name>
,如果提供的关键字参数不存在,作为查询参数生成URL(?key=value
)。
不将URL硬编码到模板文件中的理由:
- 生成URL比硬编码更具可读性。
- 修改URL格式时,只需修改
route()
装饰器定义处,无需修改所有使用了此URL的地方。 - 生成URL自动处理字符转义、Unicode编码转换等场景。
- 生成URL得到的是绝对路径,避免了浏览器中使用相对路径可能出现的问题。
- 如果应用程序不在URL根目录下,比如在
/myapplication
目录而不是/
目录,url_for()
也能正确处理。
from flask import Flask
from flask import url_for
from markupsafe import escape
app = Flask(__name__)
@app.route('/')
def index():
return 'index'
@app.route('/login')
def login()