Flask简介
Flask是一个基于Python开发而且依赖jinja2模板和Werkzeug WSGI服务的一个微型Web框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,而后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,若是要返回给用户复杂的内容时,须要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。
Flask被设计为易于使用,同时也提供了扩展性,用户可以自由地选择将其与哪些第三方库集成。Flask是"微"框架,这意味着其核心功能非常有限,但可以通过一系列的扩展来增强功能。
Flask基本使用
安装与使用示例
pip install flask
让我们来看一下如何创建一个简单的Flask应用。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
在这段代码中,我们首先导入Flask模块,并创建一个Flask web服务器实例。然后,我们定义了一个路由(route),即/
。这个路由映射到一个函数hello_world
,当用户访问这个URL时,它会返回’Hello, World!'字符串。
Flask路由
Flask通过提供装饰器app.route
,使得定义路由变得简单易行。但你知道我们也可以通过app.add_url_rule
方法直接添加路由吗?这种方式提供了更多的灵活性,例如,可以为路由添加不同的HTTP方法。
from flask import Flask
app = Flask(__name__)
# @app.route('/index')
def index():
return 'hello'
# view_func必填
app.add_url_rule('/index', view_func=index)
if __name__ == '__main__':
app.run()
在上述代码中,app.add_url_rule
的第一个参数是URL规则,第二个参数是函数的别名,第三个参数是要映射的函数。
route参数
from flask import Flask
app = Flask(__name__)
"""
rule: 路由路径
methods: 请求方式
endpoint: 起别名, 用于反向解析. url_for('index')
strict_slashes: 设置路由是否为严格模式, True为严格模式, False为非严格模式, 默认为True
如果关闭 /hello和/hi/都被视为有效的URL
"""
@app.route('/index', methods=["GET", "POST"], endpoint='index', strict_slashes=True)
def index():
return "index"
# app.add_url_rule('/index', view_func=index)
"""
self.add_url_rule(rule, endpoint, f, **potion)参数以下
self: Flask类产生的对象(app)
rule: 路由
endpoint: 取别名, 若是为空, 用当前的函数名
methods: 请求方式
view_func: 取别名指向的函数(请求该路径, 要响应的函数)
"""
@app.route('/login')
def login():
return "login"
if __name__ == '__main__':
app.run()
路由装饰器
# 装饰器函数
def route(self, rule, **options):
def decorator(f):
endpoint = options.pop("endpoint", None)
self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator
# 被装饰函数
@app.route('/login',methods=['POST', "GET"], endpoint='index')
def login():
return "hello world"
装饰器: 先执行装饰器, 运行里面的代码, 返回一个函数名
而后加括号, 把装饰器装饰的函数当成参数传递给函数,
返回一个被装饰器装饰的同名函数
路由跳转
from flask import Flask, url_for, redirect
app = Flask(__name__)
@app.route('/home', endpoint='home')
def home():
return 'Hello World!'
@app.route('/index')
def index():
# url_for函数用于建立URL的反向解析,它可以根据视图函数的名称生成对应的URL。
# 使用url_for可以有效地避免硬编码URL地址,提高代码的可维护性
return redirect(url_for('home'))
if __name__ == '__main__':
app.run()
路由参数
from flask import Flask, jsonify
app = Flask(__name__)
app.debug = True
USERS = {
1: {'name': '张三', 'age': 18, 'gender': '男', 'text': "道路千万条"},
2: {'name': '李四', 'age': 28, 'gender': '男', 'text': "安全第一条"},
3: {'name': '王五', 'age': 18, 'gender': '女', 'text': "行车不规范"},
}
@app.route('/detail/<int:nid>', methods=['GET'], endpoint='detail')
def detail(nid):
print(nid, type(nid))
return jsonify(USERS[nid])
if __name__ == '__main__':
app.run()
Flask模板
Flask使用jinja2模板库。这个库非常强大,可以让你在HTML中嵌入Python代码。下面的例子展示了如何在Flask应用中使用模板:
# python
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route('/hello')
def hello():
name = '你好呀!'
return render_template('hello.html', name=name)
if __name__ == '__main__':
app.run()
render_template
函数用于渲染一个模板。它接收模板的名称和一些模板变量作为参数,返回生成的HTML内容。在模板中,你可以使用{
{ name }}
来显示变量的值。
<!DOCTYPE html>
<html lang=&#