Flask编程入门基础教程:快速上手Web开发

阿木 发布于 17 小时前 4 次阅读


Flask是一款Web开发框架,它是轻量级的,常形象地被叫做“微框架”, 它的核心设计哲学是保持内核精简且灵活,Flask本身只提供最基本的请求响应和路由分发功能,这相当于一个稳固的内核,而项目里所需的其他高级功能,像用户登录认证、表单数据验证、数据库操作等,几乎都得通过其丰富的扩展生态系统来达成。比如说,Flask - Login承担着管理用户会话的职责,Flask - WTF进行表单验证的处理,Flask - SQLAlchemy却提供强大的数据库对象关系映射,也就是ORM支持。这般“内核 + 扩展”的架构,给予了开发者极高的自由度,能够依据项目需求灵活地挑选和组合功能组件。

在数据持久化这块儿,Flask并未绑定任何特定的数据库系统,开发者能选取传统的关系型数据库像MySQL,也能够接纳非关系型数据库比如MongoDB,这种不存在偏见的特性让它能够轻易融入各类技术栈。

# 首先从flask模块中导入Flask类
from flask import Flask
# 使用Flask类创建一个app对象
# __name__代表当前app.py这个脚本
app = Flask(__name__)
# 创建一个路由和视图函数的映射
@app.route("/")
def index():
    # flask  默认支持函数式视图,视图的函数名不能重复,否则报错
    # 视图的返回值将被flask包装成响应对象的HTML文档内容,返回给客户端
    return 'hello flask'
if __name__ == '__main__':
    app.run()

于初学者来讲,搭建Flask开发环境的头一步一般是借由Python的包管理工具pip去开展安装。于终端里执行 pip install flask 命令,便能下载并安装最新版的Flask至本地Python环境内。这般方式对于初步学习以及快速验证概念是全然可行的。不过,伴随项目复杂度的提高, 不同项目之间有可能会出现依赖库版本冲突的状况。之所以要避免这种状况,建议选用虚拟环境(像venv或者conda这样的),来为各个项目搭建单独的Python运行空间,由此保证项目所依赖的隔离特性以及稳定性。

"""flask项目加载站点配置:方式一"""
# app.config["配置项"] = 配置项值
# app.config["DEBUG"] = False
"""flask项目加载站点配置:方式二"""
# app.config是整个flask项目默认的配置属性,里面包含了所有的可用配置项,配置项的属性名都是大写字母或大小字母+下划线组成
# config = {
#     "DEBUG": True
# }
# app.config.update(config)
"""flask项目加载站点配置:方式三"""
# from settings import Setting
# app.config.from_object(Setting)
# settings.py
# class Setting:
#     DEBUG = True
"""flask项目加载站点配置:方式四"""
# app.config.from_pyfile('settings.py')
# settings.py:
# DEBUG = True
"""flask项目加载站点配置:方式五"""
# app.run(dubuge = True)

制作一个基础的Flask应用是极其简洁的,只需要去新建一个Python脚本,接着导入Flask类,然后实例化一个应用对象,这样就能够去定义路由以及视图函数,比如说,借助@app.route('/')装饰器,能够把根路径的访问请求绑定到一个函数之上,这一函数会返回“Hello, World!”给客户端,仅仅寥寥数行代码,一个简易的Web API服务就已经形成了。

在开展开发之时,做完频繁的代码修改后,依靠手动的方式去重启服务器进而查看效果,这是会严重地对效率造成影响的。Flask 默认处于关闭状态的调试模式,也就是 Debug Mode,正是用来处理这一让人痛苦之点的。借助设置 app.run(debug=True),应用就会进入到调试状态,在这个阶段里,任何代码要是遭遇到修改,就会自动地引发服务器重启,并且能够在浏览器当中直接呈现出详细的错误信息,如此一来,极大程度地提升了开发体验。

# 导入flask核心类
from flask import Flask
app = Flask(__name__)
app.config["DEBUG"] = True
@app.route("/")
def index():
    return '你好'
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

应用启动之际,默认监听的地址是 127.0.0.1:5000127.0.0.1 意味着唯有本机能够进行访问,而 5000 乃是 Flask 的默认端口,要是期望局域网内的其他设备也能够予以访问,那么可以把主机地址修改为 0.0.0.0。假设倘若5000这个端口正被别的进程给占用了,以致于启动遭遇失败,那么就能够借助port这个参数去动态地指定出一个空闲着的端口。

Flask的其中一个核心功能,是它那强大的路由系统。路由在实质上,构建起了URL与视图函数之间,一对一的映射关系。除开静态路由之外,Flask还支持动态路由,它能够允许从URL里提取数据,并且传递给视图函数。这主要是借助两种方式来达成:

# 导入flask核心类
from flask import Flask
app = Flask(__name__)
app.config["DEBUG"] = True
@app.route("/")
def index():
    return '你好'
@app.route("/profile")
def profile():
    return '个人中心页面'
if __name__ == '__main__':
    app.run()

通常附加在 URL 末尾的查询参数,是以 ? 开头的,就像 /search?wd=Flask 这样。在视图函数当中,能够通过 request.args.get('wd') 来获取“Flask”这个值。

2. 路由变量:把变量径直嵌入到 URL 路径里,像 /user/ 这样。在访问 /user/admin 之际,视图函数会收到 username='admin' 这个参数。

Flask的路由变量支持类型转换器,其作用是限定参数类型,比如说,/book/ 这种形式要求 book_id 得是整数才可以。像访问 /book/56 时能成功,可要是访问 /book/3.14 的话就会返回404错误。Flask里面,有多种转换器,像stringintfloatpath等,是其内置的。

要面对的是更为复杂的匹配需求,像是校验邮箱或者手机号格式这种情况,Flask 是允许开发者去自定义转换器的。其步骤是这样的:首先,要从 werkzeug.routing 里面去导入 BaseConverter;其次,创建出来一个自定义的类,让它继承 BaseConverter,并且把 regex 属性,或者 to_python 方法给重新写一下;最后,要把这个自定义的转换器添加到应用那边的路由转换器字典当中呢(就好比 app.url_map.converters['re'] = RegexConverter 这样)。此后,能够在路由内运用正则表达式去定义规则,像“@app.route('/phone/')”这样,以此保证传入的手机号参数格式没有差错。这种机制给予了路由定义相当大的灵活性以及严谨性,是搭建规范 Web 应用的根基。

from flask import Flask, request
app = Flask(__name__)
@app.route('/search')
def search():
    query = request.args.get('wd')
    print(request.args) # 查看请求参数内容
    return f"搜索内容为:{query}"
if __name__ == '__main__':
    app.run(debug=True)