Bootstrap

Flask

Flask 是一个用 Python 编写的轻量级 Web 应用框架,被称为"微框架"。基于 WSGI(Web Server Gateway Interface)和 Jinja2 模板引擎。
Flask:https://flask.palletsprojects.com/en/stable/
jinja:https://jinja.palletsprojects.com/en/stable/
jinja2 中文文档:https://docs.jinkan.org/docs/jinja2/


一个 app.py 就是一个应用

# render_template 是用于模板渲染的函数,而不是重定向或请求转发。
from flask import Flask, request, render_template
from datetime import datetime
# 使用 Flask 类(当前模块)创建一个对象
app = Flask(__name__)
class User:
    def __init__(self,name,age):
        self.name = name
        self.age = age
# 自定义一个过滤器
def datetime_format(value,format_string='%Y-%m-%d %H:%M:%S'):
    return value.strftime(format_string)
# 注册过滤器
app.add_template_filter(datetime_format,'datefmt') # datefmt 过滤器名称
# 视图映射
@app.route('/m1/<string:name>') # 127.0.0.1:5000/m1/zhangsan
def m1(name):
    return name
@app.route('/m2') # 127.0.0.1:5000/m2?num=10
def m2():
    # 获取请求参数
    return request.args.get('num',default=0,type=int).__str__() # 不能返回 int 类型
@app.route('/m3')
def m3():
    user = User('zhangsan',18)
    # 将请求重定向到模板文件,并传递参数
    return render_template('child.html',user=user,now=datetime.now())
# 启动服务
if __name__ == '__main__':
    app.run(debug=True) # debug 方式运行,保存修改后自动重启
    # 启动参数"Additional options"可以修改访问地址和端口:--host=0.0.0.0 --port=5000

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
加载静态资源
<img src="{{ url_for('static', filename='aa.png') }}"/>
<link rel="stylesheet" href="{{ url_for('static', filename='aa.css') }}"/>
<script src="{{ url_for('static', filename='aa.js') }}"></script>
‘|’使用过滤器
{{ user.name, now|datefmt }}
选择
{% if false %}
{% elif 1 == 1 %}
{% else %}
{% endif %}
循环
{% for i in range(3) %}
{% endfor %}
block
{% block footer %}
    占位
{% endblock %}
</body>
</html>

子模板

继承模板,此处正常展示
{% extends "index.html" %}
{% block footer %}
    填充
{% endblock %}
后面内容不展示

数据库

from flask import Flask
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import text
# 创建Flask应用程序实例
app = Flask(__name__)
# 数据库连接信息
HOSTNAME = 'localhost'
PORT = '3306'
USERNAME = 'root'
PASSWORD = 'root'
DATABASE = 'test'
# 配置数据库连接信息
app.config['SQLALCHEMY_DATABASE_URI'] = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4'
# 初始化数据库连接
db = SQLAlchemy(app)
# 初始化数据库迁移工具
migrate = Migrate(app, db)
# 定义User模型
class User(db.Model):
    __tablename__ = 'user_py'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(255), nullable=False)
    password = db.Column(db.String(255), nullable=False)
    # 定义外键关系,指向 dept 表的 id 字段
    dept_id = db.Column(db.Integer, db.ForeignKey('dept.id'))
    # 根据外键关系,创建反向引用关系(user.dept = User.query.get(user.dept_id))
    # backref:自动给 Dept 模型添加一个 users 属性,用来获取该部门的 User 列表
    dept = db.relationship('Dept', backref=db.backref('users'))
user = User(username='admin', password='123456')
# 上下文管理
with app.app_context(): # 初始化上下文
    # db.create_all() # 创建表,如果表不存在会自动创建,如果存在则不做任何操作
    # ORM 模型映射成表的正确步骤:终端执行以下命令
    # 1. flask db init - 初始化迁移文件夹,执行一次即可
    # 2. flask db migrate - 识别模型的变化,生成迁移脚本
    # 3. flask db upgrade - 执行迁移文件,同步到数据库
    with db.engine.connect() as conn: # 获取数据库连接
        rs = conn.execute(text("select 1")) # 执行SQL语句
        print(rs.fetchone()) # 从结果集中获取下一行数据
@app.route('/add')
def add():
    try:
        db.session.add(user) # 添加到会话
        db.session.add_all([user, user]) # 批量添加
        db.session.commit() # 提交事务
        return "添加成功"
    except Exception as e:
        db.session.rollback() # 回滚事务
        raise e
@app.route('/query')
def query():
    users = User.query.all() # 查询所有
    users = User.query.filter_by(username='admin') # 根据条件查询
    users.first() # 获取第一条记录,等价于users[0],为空返回 None 不会越界
    user = User.query.get(2) # 根据主键查询
    return "查询成功"
@app.route('/update')
def update():
    user = User.query.get(1)
    user.password = '123456789'
    db.session.commit()
    return "更新成功"
@app.route('/delete')
def delete():
    user = User.query.get(1)
    db.session.delete(user)
    db.session.commit()
    return "删除成功"
if __name__ == '__main__':
    app.run()
;