Python Web框架之Flask
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应用程序。