简介
Flask是一个微框架,这意味着它核心简单但可扩展。它不包括数据库抽象层、表单验证或其他组件,这些功能可以通过扩展来添加。因此要什么就装什么扩展,非常的方便
安装及导入
# 终端输入
pip install flask
# 创建一个app.py的文件,导入
from flask import Flask
自此就可以正式开始使用Flask框架了
路由
# 第一步
# 使用flask,先导入对应的包
from flask import Flask# 第二步
# 创建对应的实例,这里的__name__对应的就是app
app = Flask(__name__)# 第三步
# 创建路由,此时我们可以在url后面拼接/hello来访问这个接口,会发现页面中显示的是hello
@app.route('/hello', methods=['GET'])
def hello():return "hello"# 启动应用
if __name__ == '__main__':app.run(debug=True)
上述是一个简单的Flask路由通过访问/hello看到页面显示的hello,接下来我们介绍一下route()里面的参数
除了最基本的作为url路径,在有的业务场景中也需要携带参数传递,在路径中携带的参数会作为关键字参数传递给视图函数,这样的话我们就可以创建动态的url,用以满足不同的请求
- Flask使用@app.route()装饰器将URL绑定到视图函数。可以定义静态路径和动态参数。
- 路由可以指定接受的HTTP方法,如GET、POST、PUT、DELETE等。默认只接受GET请求。
- Flask允许在路由URL中定义变量部分,使用尖括号<variable_name>语法。
- Flask支持多种参数类型转换器:string(默认)、int、float、path和uuid
基础路由语法
直接上代码演示
# 导入Flask类
from flask import Flask# 创建Flask应用实例
app = Flask(__name__)# 静态路由
@app.route('/')
def index():return '首页'# 带参数的路由
@app.route('/user/<username>')
def show_user(username):return f'用户: {username}'# 指定HTTP方法
@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':return do_login()else:return show_login_form()# 多路由规则指向同一视图
@app.route('/users/')
@app.route('/users/<page>')
def show_users(page=1):return f'显示用户列表,第 {page} 页'# 启动应用
if __name__ == '__main__':app.run(debug=True)
上述都是基本的路由示例,我们可以通过自由的组合,例如:指定用POST方法并且携带参数的路由
参数路由语法
# 字符串参数(默认)
@app.route('/user/<username>')
def profile(username):return f'用户 {username}'# 整数参数
@app.route('/post/<int:post_id>')
def show_post(post_id):return f'文章 #{post_id}'# 浮点数参数
@app.route('/temperature/<float:temp>')
def show_temp(temp):return f'当前温度: {temp}°C'# 路径参数(可包含斜杠)
@app.route('/files/<path:filepath>')
def show_file(filepath):return f'文件路径: {filepath}'# UUID参数
@app.route('/object/<uuid:obj_id>')
def get_object(obj_id):return f'对象UUID: {obj_id}'# 任何类型(从列表中匹配)
@app.route('/<any(blog, article, news):category_name>/')
def show_category(category_name):return f'{category_name} 类别'
上述是路由可以携带的参数类型,这里同样的可以多样化组合同时携带多个参数。
例如:/user/string:username/post/int:userid或者
/booklist/<any(math,english,chinese):category>/bookid/int:bookid
HTTP方法
既然是满足多种场景的使用需求,那么自然的对于不同的请求方法都有与之相对应的
# 导入request对象
from flask import Flask, requestapp = Flask(__name__)# 默认只接受GET请求
@app.route('/get-only')
def get_only():return '只响应GET请求'# 接受GET和POST请求
@app.route('/both', methods=['GET', 'POST'])
def both_methods():if request.method == 'POST':return '处理POST请求'else:return '处理GET请求'# RESTful API示例
@app.route('/api/users/<int:user_id>', methods=['GET', 'PUT', 'DELETE'])
def user_api(user_id):if request.method == 'GET':return f'获取用户 {user_id}'elif request.method == 'PUT':return f'更新用户 {user_id}'elif request.method == 'DELETE':return f'删除用户 {user_id}'# 使用@app.get和@app.post(Flask 2.0+)
@app.get('/users')
def get_users():return '获取用户列表'@app.post('/users')
def create_user():return '创建新用户'
高级路由参数
既然是以自由轻便为主,那么自然是可以使用到我们的正则表达式来自定义我们想要的路由,需要导入一个新的扩展(这里很能体现出想要啥加啥)
from werkzeug.routing import BaseConverter
from werkzeug.routing import BaseConverter# 创建自定义转换器
class RegexConverter(BaseConverter):def __init__(self, url_map, *items):super(RegexConverter, self).__init__(url_map)self.regex = items[0]# 注册自定义转换器
app.url_map.converters['regex'] = RegexConverter# 使用自定义正则表达式匹配路由参数
@app.route('/item/<regex("[a-z]{3}-\d{3}"):item_id>')
def show_item(item_id):return f'商品ID: {item_id}'# 默认值处理
@app.route('/books/')
@app.route('/books/<int:page>')
def show_books(page=1):return f'显示第 {page} 页的图书'# 可选参数(使用转换器)
@app.route('/optional/<string:name>/')
@app.route('/optional/<string:name>/<int:age>')
def optional_params(name, age=None):if age:return f'姓名: {name}, 年龄: {age}'else:return f'姓名: {name}, 年龄: 未提供'
个人感觉还是正则会用的多一点,不仅仅是在路由方面
总结
从基础路由,参数路由以及HTTP方法初步了解了Flask路由,还有它的高级用法。接下来就可以进行一些实际的功能构建,比如登录注册口,增删查改以及连接数据库等等