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

https://www.cnblogs.com/dream-ze/p/17659500.html 路由系统

posted @ 2024-04-20 20:57  贝壳里的星海  阅读(29)  评论(0编辑  收藏  举报