Flask基础使用
Flask基础使用
简介说明
Flask属于轻量级框架,它只提供最核心的功能,其余的功能需要用自己手写或者用第三方来支持。
中文文档:https://docs.jinkan.org/docs/flask/index.html
pip install flask
开始
from flask import Flask
'''
__name__:表示当前的模块名字
创建Flask对象,Flask会以传入模块的位置当做家目录
'''
app = Flask(__name__)
@app.route('/') # 代表首页
def hello_world(): # 视图函数
return 'Hello World!' # 返回内容
if __name__ == '__main__':
app.run() # 运行程序
python helloworld.py
http://127.0.0.1:5000
目录结构
flask-demo/
├ run.py # 应用启动程序
├ config.py # 环境配置
├ requirements.txt # 列出应用程序依赖的所有Python包
├ tests/ # 测试代码包
│ ├ __init__.py
│ └ test_*.py # 测试用例
└ myapp/
├ admin/ # 蓝图目录
├ static/
│ ├ css/ # css文件目录
│ ├ img/ # 图片文件目录
│ └ js/ # js文件目录
├ templates/ # 模板文件目录
├ __init__.py
├ forms.py # 存放所有表单,如果多,将其变为一个包
├ models.py # 存放所有数据模型,如果多,将其变为一个包
└ views.py # 存放所有视图函数,如果多,将其变为一个包
参数配置
Flask可以通过传递不同的参数来初始化创建(app = Flask(__name__))程序实例,
app = Flask(__name__)
def __init__(
self,
import_name: str,
static_url_path: str | None = None,
static_folder: str | os.PathLike | None = "static",
static_host: str | None = None,
host_matching: bool = False,
subdomain_matching: bool = False,
template_folder: str | os.PathLike | None = "templates",
instance_path: str | None = None,
instance_relative_config: bool = False,
root_path: str | None = None,
)
其默认传入当前模块的名称( __name__ 是一个特殊变量,表示当前 Python 模块的名称)作为参数,另外还可以指定参数配置,这些参数是设置Flask本身的属性。
import_name: 用于确定Flask程序所在的包(模块)的名称和位置,使用__name__为默认值,一般不用修改。其可以决定Flask在访问静态文件时查找的路径
static_url_path: 静态文件的URL前缀,默认为 '/static'
static_folder: 存放静态文件(图片、CSS等)的目录,默认为应用程序根目录下的 'static' 目录
template_folder: 存放模板文件(HTML文件)的目录,默认为应用程序根目录下的 'templates' 目录
app = Flask(__name__, static_url_path='/static_path/', static_folder='new_static')
应用程序配置
1.可以使用配置对象加载
2.可以从配置文件中加载
3.从环境变量中加载
app.config.from_object(配置对象)
app.config.from_pyfile('配置文件名')
app.config.from_envvar('环境变量名')
类对象配置方式
# 导入Flask类
from flask import Flask
# Flask类接收一个参数__name__
app = Flask(__name__)
# 配置对象
class MyConfig(object):
"""配置列表"""
KEY = 'Y7W7qg5CD9s5UmgKe5UdiY1bhdxbvkaq'
# 从配置对象中加载配置信息
app.config.from_object(MyConfig)
# 装饰器的作用是将路由映射到视图函数index
@app.route("/")
def index():
key = app.config['KEY']
print(key)
return key
# Flask应用程序实例的run方法启动WEB服务器
if __name__ == '__main__':
app.run()
配置文件配置方式
置文件 在文件加中新建一个config.cfg
配置文件,在配置文件上写上下面语句,表示开启调试模式。
DEBUG = True
from flask import Flask
'''
__name__:表示当前的模块名字
创建Flask对象,Flask会以传入模块的位置当做家目录
'''
app = Flask(__name__)
@app.route('/') # 代表首页
def hello_world(): # 视图函数
print("hello_world")
return 'Hello World!' # 返回内容
# 配置文件
app.config.from_pyfile('config.cfg')
if __name__ == '__main__':
app.run() # 运行程序
使用配置
@app.route("/")
def index():
debug_mode = app.config['DEBUG']
secret_key = app.config['SECRET_KEY']
db_username = app.config['DB_USERNAME']
db_password = app.config['DB_PASSWORD']
db_hostname = app.config['DB_HOSTNAME']
db_port = app.config['DB_PORT']
print(f'Debug mode: {debug_mode}')
print(f'Secret key: {secret_key}')
print(f'Database username: {db_username}')
print(f'Database password: {db_password}')
print(f'Database hostname: {db_hostname}')
print(f'Database port: {db_port}')
from flask import Flask, current_app
'''
__name__:表示当前的模块名字
创建Flask对象,Flask会以传入模块的位置当做家目录
'''
app = Flask(__name__)
@app.route('/') # 代表首页
def hello_world(): # 视图函数
# 如果能拿到app对象,就可以通过app取自定义的配置参数
print(app.config.get('TEST'))
# 如果拿不到,可以通过current_app这个app的代理人拿到
print(current_app.config.get('TEST'))
return 'Hello World!' # 返回内容
# 直接操作
app.config["DEBUG"] = True
app.config["TEST"] = 'test'
if __name__ == '__main__':
app.run() # 运行程序
app.run参数
host: 指定应用程序监听的 IP 地址,默认值为 '127.0.0.1',即只能通过本地访问。
port: 指定应用程序监听的端口号,默认值是 5000。
debug: 以调试模式启动应用程序,默认值为False。当设置为True的时候,应用程序会显示详细的错误信息及堆栈跟踪信息
threaded: 表示如果应用程序需要多线程支持,该参数设置为 True 就可以开启多线程。默认值为 False,即单线程运行。
ssl_context:用于启用 SSL 安全通信协议的上下文对象。通常,应该创建该对象,并使用 .pem 格式的文件存储 SSL 的密钥和证书。
options: 用于向底层 Werkzeug 服务器传递其他特定参数的字典对象。
HTTP请求方法
# 利用methods参数可以自己指定一个接口的请求方式
from flask import Flask
from flask import jsonify
app = Flask(__name__)
# 将 Python 对象转换为 JSON 格式
@app.route('/users')
def get_users():
users = [
{'name': 'Alice', 'age': 25},
{'name': 'Bob', 'age': 30},
{'name': 'Charlie', 'age': 35}
]
return jsonify(users)
@app.route("/test1", methods=["POST"])
def test1():
return "POST"
@app.route("/test2", methods=["GET", "POST"])
def test2():
if request.method == 'POST':
return 'Hello, POST!'
else:
return 'Hello, GET!'
路由和蓝图
路由是指Web应用程序的URL与函数之间的映射关系。Flask通过装饰器的方式提供了路由功能,常用的装饰器有@app.route()
from flask import Flask
app = Flask(__name__)
@app.route('/helleworld')
def hello():
return 'Hello, World!'
支持使用蓝图(Blueprints)来更好地组织代码和路由,方便协作和扩展。蓝图是一种在 Flask 应用中组织视图函数的方式,可以把一个应用分成多个蓝图,每个蓝图负责处理一组相关的功能
蓝图特点:
1.一个应用程序可以具有多个蓝图Blueprint,可以将一个蓝图Blueprint注册到任何一个未使用的URL下,如:/user
2.蓝图可以将应用程序划分为多个小块,每个小块负责处理自己的任务,从而使得代码更加易于维护和扩展。
3.具有独立的 URL 前缀和模板过滤器。通过在创建蓝图时指定 URL 前缀,映射到不同的 URL
4.可以与应用程序上下文分离。蓝图可以被注册到不同的应用程序对象上,并且可以根据需要进行激活和取消激活。
5.可以与 Flask 扩展库集成。许多 Flask 扩展库都支持蓝图,例如 Flask-SQLAlchemy
6.支持钩子函数。通过定义视图函数之外的钩子函数,蓝图可以在请求处理的不同阶段执行一些操作,如 记录日志
from flask import Flask, Blueprint
# 创建一个名为main的蓝图
main = Blueprint('main', __name__)
# 在蓝图中定义路由
@main.route('/')
def index():
return 'Hello, World! This is the main page.'
# 创建一个名为blog的蓝图
blog = Blueprint('blog', __name__, url_prefix='/blog')
# 在蓝图中定义路由
@blog.route('/')
def blog_index():
return 'Hello, World! This is the blog page.'
# 将蓝图注册到应用中
app = Flask(__name__)
app.register_blueprint(main)
app.register_blueprint(blog)
if __name__ == '__main__':
app.run()
指定蓝图的url前缀
app.register_blueprint(user_bp, url_prefix='/user')
app.register_blueprint(goods_bp, url_prefix='/goods')
蓝图内部静态文件
和应用对象不同,蓝图对象创建时不会默认注册静态目录的路由。需要我们在 创建时指定 static_folder 参数。
下面的示例将蓝图所在目录下的static_admin目录设置为静态目录
admin = Blueprint("admin",__name__,static_folder='static_admin')
app.register_blueprint(admin,url_prefix='/admin')
# 现在就可以使用/admin/static_admin/<filename>访问static_admin目录下的静态文件了。
也可通过static_url_path改变访问路径
admin = Blueprint("admin",__name__,static_folder='static_admin',static_url_path='/lib')
app.register_blueprint(admin,url_prefix='/admin')
蓝图内部模板目录
蓝图对象默认的模板目录为系统的模版目录,可以在创建蓝图对象时使用 template_folder 关键字参数设置模板目录
admin = Blueprint('admin',__name__,template_folder='my_templates')
参考资料
https://github.com/helloflask/flask-tutorial/blob/master/chapters/hello.md