Flask笔记

1 Flask的基本操作

欢迎来到 Flask 的世界 — Flask中文文档(2.1.x) (dormousehole.readthedocs.io)

1.1 第一个例子

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():  # put application's code here
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

1.2 路由

—–路由也是一样的

from flask import Flask

app = Flask(__name__)


@app.route('/test')
def hello():
    return 'test'


#主函数入口
if __name__ == '__main__':
    app.run()

1.3 请求

@app.route('/test', methods=['GET', 'POST'])
def hello():
    return 'test'

1.4 路径参数

# 可以定义接收不同类型的参数 int float string
@app.route('/user/<int:id>')
def index(id):
    if id == 1:
        return ' python'
    if id == 2:
        return 'Java'
    return ' Hello'

1.5 自定义转换器

# <>提取参数
# <int :id>int 转换器
# 自定义转换器
from werkzeug.routing import BaseConverter
from flask import Flask

app = Flask(__name__)


class RegexConverter(BaseConverter):
    def __init__(self, url_map, regex):
        # 调用父类方法
        super(RegexConverter, self).__init__(url_map)
        self.regex = regex

    def to_python(self, value):
        # 父类的方法
        return value


# 将自定义的转换器添加到flask应用中
app.url_map.converters['re'] = RegexConverter


@app.route('/index/<re("123"):value>')
def index(value):
    print(value)
    return 'hello'


if __name__ == '__main__':
    app.run()

1.6 跳转到html页面

@app.route("/login")
def login():

    return render_template('login.html')

1.7 request请求

@app.route("/login", methods=["GET", "POST"])
def login():
    if request.method == "POST":
        name = request.form.get('name')
        password = request.form.get('password')
        print(name, password)
        return 'POST 请求'
    if request.method == 'GET':
        return 'GET请求'

1.8 两种重定向

@app.route('/to_baidu')
def redirect_to_baidu():
    #重定向到百度
    return redirect("https://www.baidu.com")


@app.route('/redirect2')
def redirect_to_baidu2():
    #重定向到redirect_to_baidu函数
    return redirect(url_for('redirect_to_baidu'))

1.9 返回json数据给前端

app.config['JSON_AS_ASCII'] = False


@app.route('/index')
def index():
    data = {
        'name': '张三'
    }
    return jsonify(data)

1.10 abort–返回特定错误

@app.route('/abort')
def abort():
    #返回403的错误
    abort(403)
    return None

1.11 返回到错误的特定页面

# 自定义报错时返回的图片
@app.errorhandler(404)
def handle_404_error(error):
    return render_template('404.html')

1.12 模板的使用

@app.route('/index')
def index():
    data = {
        'name': 'Jack',
        'age': 18
    }
    # 将这里的data返回到前端的data
    return render_template(' index.html', data=data)
{{ data }}
<br>
{{ data.name }}

1.13 flask数据库

数据库与类的对应 ORM

import datetime

from applications.extensions import db


class Photo(db.Model):
    __tablename__ = 'photo'
    id = db.Column(db.Integer, primary_key=True)
    type = db.Column(db.Integer)
    name = db.Column(db.String(255), nullable=False)
    href = db.Column(db.String(255))
    mime = db.Column(db.CHAR(50), nullable=False)
    size = db.Column(db.CHAR(30), nullable=False)
    create_time = db.Column(db.DateTime, default=datetime.now)

增删改查

@app.route("/user/add")
def add_user():
    # 1. 创建ORM对象
    user = User(username="法外狂徒张三", password='111111')
    # 2. 将ORM对象添加到db.session中
    db.session.add(user)
    # 3. 将db.session中的改变同步到数据库中
    db.session.commit()
    return "用户创建成功!"
@app.route("/user/query")
def query_user():
    # 1. get查找:根据主键查找
    # user = User.query.get(1)
    # print(f"{user.id}: {user.username}-{user.password}")
    
    # 2. filter_by查找
    # Query:类数组
    users = User.query.filter_by(username="法外狂徒张三")
    for user in users:
        print(user.username)
    return "数据查找成功!"
@app.route("/user/update")
def update_user():
    user = User.query.filter_by(username="法外狂徒张三").first()
    user.password = "222222"
    db.session.commit()
    return "数据修改成功!"
@app.route('/user/delete')
def delete_user():
    # 1. 查找
    user = User.query.get(1)
    # 2. 从db.session中删除
    db.session.delete(user)
    # 3. 将db.session中的修改,同步到数据库中
    db.session.commit()
    return "数据删除成功!"

表关系

class Article(db.Model):
    __tablename__ = "article"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(200), nullable=False)
    content = db.Column(db.Text, nullable=False)
    # 添加作者的外键,引用字user.id字段
    author_id = db.Column(db.Integer, db.ForeignKey("user.id"))
    
    # backref:会自动的给User模型添加一个articles的属性,用来获取文章列表,给User加articles属性
    author = db.relationship("User", backref="articles")

操作

@app.route("/article/add")
def article_add():
    article1 = Article(title="Flask学习大纲", content="Flaskxxxx")
    article1.author = User.query.get(2)

    article2 = Article(title="Django学习大纲", content="Django最全学习大纲")
    article2.author = User.query.get(2)

    # 添加到session中
    db.session.add_all([article1, article2])
    # 同步session中的数据到数据库中
    db.session.commit()
    return "文章添加成功!"
@app.route("/article/query")
def query_article():
    user = User.query.get(2)
    #找到该作者所有文章
    for article in user.articles:
        print(article.title)
    return "文章查找成功!"
# ORM模型映射成表的三步,在terminal操作
# 1. flask db init:这步只需要执行一次
# 2. flask db migrate:识别ORM模型的改变,生成迁移脚本
# 3. flask db upgrade:运行迁移脚本,同步到数据库中

2 实战

2.1 目录结构

解决循环引用
蓝图Blueprint

两个不同的请求
from flask import Blueprint

bp = Blueprint("qa", __name__, url_prefix="/")


@bp.route("/")
def index():
    pass

from flask import Blueprint

bp = Blueprint("auth", __name__, url_prefix="/auth")


@bp.route("/login")
def login():
    pass
app内加载---------------------------------------------------------------------------------------------------
from flask import Flask
import config
from exts import db
from models import UserModel
from blueprints.qa import bp as qa_bp
from blueprints.auth import bp as auth_bp

app = Flask(__name__)
app.config.from_object(config)  # 读取配置信息

db.init_app(app)

app.register_blueprint(qa_bp)
app.register_blueprint(auth_bp)

2.2 数据库

  • 配置连接数据库 config.py

    # 数据库的配置信息
    HOSTNAME = '127.0.0.1'
    PORT = '3306'
    DATABASE = 'zhiliaoOA'
    USERNAME = 'root'
    PASSWORD = 'root'
    DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
    SQLALCHEMY_DATABASE_URI = DB_URI
    
  • 建立模型models.py

    from exts import db
    from datetime import datetime
    
    
    class UserModel(db.Model):
        __tablename__ = "user"
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        username = db.Column(db.String(100), nullable=False)
        password = db.Column(db.String(200), nullable=False)
        email = db.Column(db.String(100), nullable=False, unique=True)
        join_time = db.Column(db.DateTime, default=datetime.now)
    
  • 初始化表—app.py中一定要导入这个模型,不然识别不到,不能创建该表
    exts.py

    # exts.py:这个文件存在的意义就是为了解决循环引用的问题
    from flask_sqlalchemy import SQLAlchemy
    
    db = SQLAlchemy()
    

    接下来便是Migrate三部曲啦

    flask db init–>

    flask db migrate(当模型改变时生成迁移脚本)–>

    flask db upgrade(运行迁移脚本,同步到数据库中需要先建数据库)

3 学习

3.1 文件上传与下载

请求

from flask import Blueprint, request
from werkzeug.utils import secure_filename

from common.res import fail_api, success_api
from utils.upload import uploadFile, downloadFile

bp = Blueprint("file", __name__)


@bp.route("/upload", methods=["POST"])
def upload():
    # 这里的请求查找不一样
    file = request.files["file"]
    if uploadFile(file):
        return success_api("上传成功", data=secure_filename(file.filename))
    else:
        return fail_api("上传失败")


@bp.route('/download/<filename>', methods=['GET'])
def download(filename):
    if request.method == "GET":
        if downloadFile(filename) is not None:
            return downloadFile(filename)
        else:
            return fail_api("该文件不存在或无法下载")

实现

import os
from flask import send_from_directory

from werkzeug.utils import secure_filename
from config import up_dir


def uploadFile(file):
    fName = secure_filename(file.filename)
    fullNamePath = os.path.join(up_dir, fName)
    file.save(fullNamePath)
    return 1


def downloadFile(filename):
    path = os.path.isfile(os.path.join(up_dir, filename))
    if path:
        return send_from_directory(up_dir, filename, as_attachment=True)


def isExist(name, path=None):
    """
    判断文件是否存在
    :param name: 需要检测的文件或文件夹名
    :param path: 需要检测的文件或文件夹所在的路径,当path=None时默认使用当前路径检测
    :return: True/False 当检测的文件或文件夹所在的路径下有目标文件或文件夹时返回Ture,
            当检测的文件或文件夹所在的路径下没有有目标文件或文件夹时返回False
    """
    if path is None:
        path = os.getcwd()
    print(path)
    if os.path.exists(path + '\\' + name):
        return True
    else:
        return False
posted @ 2025-10-22 11:07  solarlemon  阅读(7)  评论(0)    收藏  举报