个人技术分享

Flask的介绍

Flask 是一款发布于2010年非常流行的 Python Web 框架。
Flask官网

Flask的安装

pip install flask

第一个Flask程序

#从flask包中导入Flask类
from flask import Flask
#创建一个Flask对象
app = Flask(__name__)
#@app.route:是一个装饰器
#@app.route('/')就是将url中 / 映射到hello_world设个视图函数上面
#以后你访问我这个网站的 / 目录的时候 会执行hello_world这个函数,然后将这个函数的返回值返回给浏览器
@app.route('/')
def hello_world():
    return '尚学堂'
#启动这个WEB服务
if __name__ == '__main__':
    # 默认为5000端口
    app.run() # app.run(port=8000)

运行方式

通过对象运行

运行程序时,可以指定运行的主机IP地址,端口

app.run(host="0.0.0.0", port=5000) # 127.0.0.1

通过Python运行方式运行

app = Flask(__name__)
@app.route("/")
def index():
    return "hello world"
if __name__ == '__main__':
    app.run()

通过Flask自带命令运行

app = Flask(__name__)
@app.route("/")
def index():
    return "hello world"
# 程序中不用再写app.run()
$ export FLASK_APP=helloworld
$ flask run
 * Running on http://127.0.0.1:5000/
flask run -h 0.0.0.0 -p 8000

Flask入门路由

好的,让我们深入探讨一下Flask的路由。要成为Flask路由方面的高级程序员,你需要理解以下几个方面:

1. 基本路由

在Flask中,路由用于将URL与特定的函数关联起来。最简单的路由定义如下:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return "Hello, Flask!"

这里的@app.route('/')装饰器将根URL(即/)与home函数关联起来。

2. 动态路由

动态路由允许在URL中传递参数。例如:

@app.route('/user/<username>')
def show_user_profile(username):
    return f'User {username}'

这里的<username>是一个动态部分,Flask会将URL中对应部分的值传递给show_user_profile函数。

你还可以指定参数的类型,例如:

@app.route('/post/<int:post_id>')
def show_post(post_id):
    return f'Post {post_id}'

3. 路由变量规则

Flask支持以下几种路由变量规则:

  • <string:variable>: 默认类型,匹配任意非斜杠字符串。
  • <int:variable>: 匹配整数。
  • <float:variable>: 匹配浮点数。
  • <path:variable>: 匹配带斜杠的字符串。

4. 路由处理方法

Flask允许为一个URL定义多个处理方法,例如GET和POST请求:

@app.route('/submit', methods=['GET', 'POST'])
def submit():
    if request.method == 'POST':
        return "Form submitted"
    else:
        return "Show form"

5. URL构建

使用url_for函数生成URL,以便在代码中引用路由而不直接硬编码URL:

from flask import url_for

@app.route('/hello/<name>')
def hello(name):
    return f'Hello, {name}!'

with app.test_request_context():
    print(url_for('hello', name='John'))  # 输出: /hello/John

6. 自定义转换器

你可以创建自定义的路由转换器,满足更复杂的需求:

from werkzeug.routing import BaseConverter

class ListConverter(BaseConverter):
    def to_python(self, value):
        return value.split(',')

    def to_url(self, values):
        return ','.join(BaseConverter.to_url(self, item) for item in values)

app.url_map.converters['list'] = ListConverter

@app.route('/items/<list:items>')
def show_items(items):
    return f'Items: {items}'

7. 路由重定向

Flask提供了方便的重定向支持:

from flask import redirect

@app.route('/old-url')
def old_url():
    return redirect(url_for('new_url'))

@app.route('/new-url')
def new_url():
    return "You've been redirected!"

8. 蓝图 (Blueprints)

对于大型应用,使用蓝图来组织路由:

from flask import Blueprint

mod = Blueprint('mod', __name__)

@mod.route('/module')
def module_home():
    return "Module Home"

app.register_blueprint(mod)

9. 路由装饰器的扩展

你可以自定义路由装饰器,实现更高级的功能:

from functools import wraps

def login_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not logged_in():
            return redirect(url_for('login'))
        return f(*args, **kwargs)
    return decorated_function

@app.route('/dashboard')
@login_required
def dashboard():
    return "Dashboard"

10. 调试路由

使用app.url_map查看所有已注册的路由:

for rule in app.url_map.iter_rules():
    print(rule.endpoint, rule.rule)

总结

要成为Flask路由的高级程序员,你需要不仅了解基本的路由定义,还要熟悉动态路由、路由变量规则、处理方法、URL构建、自定义转换器、重定向、蓝图、装饰器扩展以及调试方法。通过这些知识的积累和实践,你将能够处理各种复杂的路由需求,构建健壮的Web应用程序。