目录
1.基本使用
(1)首先,创建一个 Python 文件,例如app.py。
(2)在app.py中导入 Flask 类:
from flask import Flask
(3)创建一个 Flask 应用实例:
app = Flask(__name__)
__name__是一个 Python 预定义变量,当这个脚本是主程序时,__name__的值为__main__。Flask 使用这个变量来确定应用的根路径等信息。
(4)定义路由和视图函数:
路由是用户访问的 URL 路径,视图函数是处理该路由请求的函数。例如,创建一个简单的主页路由:
@app.route('/')
def home():
return "Hello, World!"
- 这里`@app.route('/')`是一个装饰器,它将`home`函数绑定到网站的根路径(`/`)。当用户访问网站的根目录时,`home`函数会被调用,返回`Hello, World!`作为响应内容。
(5)运行应用
if __name__ == "__main__":
app.run()
(6)整体代码:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home:
return 'Hello World!'
if __name__ == '__main__':
app.run()
2.复杂使用
(1)配置文件
1.配置文件: settings.py
class BaseConfig(object): #自己开发使用
DEBUG = True
SECRET_KEY = "asudflkf"
class ProductionConfig(BaseConfig): #产品开发使用,自行添加需要
DEBUG = False
class DevelopmentConfig(BaseConfig): #产品运行使用,自行添加需要
pass
class TestingConfig(BaseConfig): #产品测试使用,,自行添加需要
pass
解释:
DEBUG:这是一个非常重要的配置参数。当DEBUG = True时,Flask 会在代码发生变化时自动重新加载应用,并且会在网页上显示详细的错误信息,包括错误的类型、发生错误的代码行等。这对于开发过程中的调试非常有帮助。DEBUG = False,这样设置就关闭了调试模式,在生产环境中通常要关闭调试模式,以提高安全性和性能。
SECRET_KEY:用于加密会话(session)和其他安全相关的数据。它是一个字符串,应该是一个随机的、保密的值。
2.运行文件:run.py
from flask import Flask
app = Flask(__name__)
# 配置文件
app.config.from_object("settings.DevelopmentConfig")
@app.route('/',methods=['GET','POST'])
def index():
return "Hello World!"
if __name__ == '__main__':
app.run()
(2)路由
1.路由方式
from flask import Flask
app = Flask(__name__)
# 路由方式一(*):
@app.route('/index',methods=['GET','POST'])
def index():
return 'Hello World!'
# # 路由方式二:
# def hh():
# return 'Hello World!'
#
# app.add_url_rule('/hh',view_func=hh)
if __name__ == '__main__':
app.run()
2.取别名
endpoint=’别名’
例子:
from flask import Flask,url_for
app = Flask(__name__)
@app.route('/index',methods=['GET','POST'],endpoint='n1')
def index():
v1 = url_for('n1')
v2 = url_for('login')
print(v1,v2)
return "Index"
@app.route('/login',methods=['GET','POST'])
def login():
return "login"
if __name__ == '__main__':
app.run()
输出:/index /login
3.传递参数到视图函数(动态路由)
四种种路由:
@app.route('/user/<username>')
@app.route('/post/<int:post_id>')
@app.route('/post/<float:post_id>')
@app.route('/post/<path:path>')
例子:
from flask import Flaskapp = Flask(__name__)
@app.route('/index/<int:nid>',methods=['GET','POST']) #访问时加上/index/1
def index(nid):
print(nid,type(nid))
return 'Hello World!'
if __name__ == '__main__':
app.run()
补充:自定义正则表达式匹配参数
import refrom flask
import Flask, abort, url_for
from werkzeug.routing import BaseConverter
app = Flask(__name__)
class RegexConverter(BaseConverter):
def __init__(self, map, *args):
super(RegexConverter, self).__init__(map)
self.regex = args[0]
app.url_map.converters['regex']=RegexConverter
@app.route('/user/<regex("^[a-zA-Z0-9]+$"):username>')
def user_profile(username):
return f"User profile for {username}"
4.重定向
redirect_to='新URL'
例子:
from flask import Flask,render_template,redirect
app = Flask(__name__)
@app.route('/index',methods=['GET','POST'],redirect_to='/new') #输网址+/index时,自动重定向到输网址+/new
def index():
return "老功能"
@app.route('/new',methods=['GET','POST'])
def new():
return '新功能'
if __name__ == '__main__':
app.run()
5.子域名
subdomain="<username>"
需要修改hosts文件(在 Windows 系统中位于C:\Windows\System32\drivers\etc\hosts)来模拟子域名请求,添加127.0.0.1 sub.example.com到hosts文件。
例子:
from flask import Flask
app = Flask(__name__)
@app.route("/", subdomain="<username>")
def xxxx(username):
print(username)
return 'xxxx'
if __name__ == '__main__':
app.config['SERVER_NAME'] = 'example.com:5000'
app.run(host='0.0.0.0', port = 5000)
(3)视图函数
在 Flask 中,视图是处理特定 URL 请求并返回响应的函数。当用户在浏览器中输入一个 URL 并访问应用时,Flask 会根据 URL 对应的路由规则找到相应的视图函数来处理该请求,并将视图函数返回的内容作为响应展示给用户(比如在浏览器中显示网页内容、返回 JSON 数据等)。
1.简单视图函数示例
from flask import Flask
app = Flask(__name__)
@app.route('/')def home():
return "Hello, World!"
2.带参数的视图函数
@app.route('/user/<username>')
def user_profile(username):
return f"Hello, {username}! This is your profile page."
3.返回不同类型数据的视图函数
返回 HTML 内容(使用模板)
index.html:
<!DOCTYPE html>
<html>
<head>
<title>My Flask App</title>
</head>
<body>
<h1>{{ message }}</h1>
</body>
</html>
run.py:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')def home():
message = "Welcome to my Flask App"
return render_template('index.html', message=message)
有时候需要以 JSON 格式返回数据,比如在构建 API 时。
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/api/data')
def get_data():
data = { "name": "John", "age": 30, "city": "New York" }
return jsonify(data)
4.基于类的视图
from flask
import Flask, views, jsonify
app = Flask(__name__)
class UserView(views.View):
def dispatch_request(self):
data = { "name": "Alice", "age": 25, "city": "London" }
return jsonify(data)
app.add_url_rule('/user', view_func=UserView.as_view('user_view'))
(4)请求与响应
请求:
1.获取请求头信息
from flask import Flask, request
app = Flask(__name__)
@app.route('/')def index():
user_agent = request.headers.get('User-Agent')
return f"Your browser is {user_agent}"
2.处理不同请求方法(以 POST 和 GET 为例)
from flask import Flask, request
app = Flask(__name__)
@app.route('/login', methods=['POST'])
def login():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
# 这里可以添加验证逻辑
return f"Logged in as {username}"
else:
return "Please use POST method to log in"
@app.route('/search')
def search():
if request.method == 'GET':
query = request.args.get('q')
return f"You searched for {query}"
3.获取请求体中的 JSON 数据
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/api/data', methods=['POST'])
def api_data():
data = request.get_json()
# 对JSON数据进行处理
return jsonify({"status": "success"})
响应:
- 返回简单文本响应
from flask import Flask
app = Flask(__name__)
@app.route('/')def index():
return "Hello, World!"
2.返回 HTML 响应(使用模板)
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')def index():
return render_template('index.html')
3.重定向到另一个指定的 URL
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route('/')def index():
return redirect(url_for('new_page'))
@app.route('/new_page')def new_page():
return "This is the new page!"
4.返回 JSON 响应
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/api/data')
def api_data():
data = {
"name": "John",
"age": 30,
"city": "New York"
}
return jsonify(data)
5.自定义响应状态码和头部信息
from flask import Flask, make_response
app = Flask(__name__)
@app.route('/custom')
def custom_response():
response = make_response("Custom Response", 201)
response.headers['Content-Type'] = 'text/plain'
return response
定义了路由 '/custom'。在视图函数 custom_response 中,首先使用 make_response 函数创建一个响应对象,设置响应内容为 "Custom Response",状态码为 201 Created,接着通过 response.headers['Content-Type'] = 'text/plain' 设置 Content-Type 头部信息为 text/plain,最后将这个响应对象返回给客户端。
(5)模版
变量传递与显示
- 视图函数(app.py部分)
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
user = {'name': 'John', 'age': 30}
return render_template('index.html', user=user)
2.模板文件(index.html)
<!DOCTYPE html>
<html>
<head>
<title>User Information</title>
</head>
<body>
<h1>User Name: {{ user.name }}</h1>
<p>User Age: {{ user.age }}</p>
</body>
</html>
在上述示例中:
视图函数通过 render_template 函数将 user 字典传递给 index.html 模板。
在模板文件里,通过 {{ user.name }} 和 {{ user.age }} 这种 Jinja2 语法来获取并显示从视图函数传递过来的用户字典中的姓名和年龄信息。
条件判断:
- 视图函数(app.py部分)
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')def index():
is_logged_in = True
return render_template('index.html', is_logged_in=is_logged_in)
2.模板文件(index.html)
<!DOCTYPE html>
<html>
<head>
<title>Home Page</title>
</head>
<body>
{% if is_logged_in %}
<p>Welcome, you are logged in!</p>
{% else %}
<p>Please log in.</p>
{% endif %}
</body>
</html>
视图函数将表示用户是否登录的布尔值 is_logged_in 传递给模板。
在模板中,使用 {% if is_logged_in %}、{% else %} 和 {% endif %} 这种 Jinja2 条件判断语法,根据 is_logged_in 的值来显示不同的提示信息。当用户已登录(is_logged_in 为 True)时,显示欢迎登录的信息;否则显示请登录的提示。
循环结构
- 视图函数(app.py部分)
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
fruits = ['apple', 'banana', 'cherry']
return render_template('index.html', fruits=fruits)
2. 模板文件(index.html)
<!DOCTYPE html>
<html>
<head>
<title>Fruit List</title>
</head>
<body>
<ul>
{% for fruit in fruits %}
<li>{{ fruit }}</li>
{% endfor %}
</ul>
</body>
</html>
在这个示例中:
视图函数把包含水果名称的列表 fruits 传递给模板。
在模板里,通过 {% for fruit in fruits %} 和 {% endfor %} 这种 Jinja2 循环语法,遍历 fruits 列表,并将每个水果名称放在 <li> 标签中展示出来,形成一个水果列表的展示效果。
模板继承
- 基础模板(base.html)
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<header>
<h1>My Flask App</h1>
</header>
{% block content %}
{% endblock %}
</body>
</html>
2.子模板(假设index.html继承base.html)
{% extends "base.html" %}
{% block title %}
Index Page
{% endblock %}
{% block content %}
<p>This is the content of the index page.</p>
{% endblock %}
在模板继承的示例中:
首先创建了一个基础模板 base.html,它定义了页面的基本结构,包括通过 {% block title %} 和 {% block content %} 预留了可被替换的标题和内容部分。
然后子模板 index.html 通过 {% extends "base.html" } 声明继承自 base.html。接着在子模板中,分别对 title 和 content 这两个 block 进行了重新定义,以满足自身页面的需求。例如,在 title 块中设置了本页面的标题为 Index Page,在 content 块中添加了具体的页面内容描述。