1 Flask的基本操作
欢迎来到 Flask 的世界 — Flask中文文档(2.1.x) (dormousehole.readthedocs.io)
1.1 第一个例子
from flask import Flaskapp = Flask(__name__)@app.route('/')
def hello_world(): # put application's code herereturn 'Hello World!'if __name__ == '__main__':app.run()
1.2 路由
—–路由也是一样的
from flask import Flaskapp = 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 Flaskapp = Flask(__name__)class RegexConverter(BaseConverter):def __init__(self, url_map, regex):# 调用父类方法super(RegexConverter, self).__init__(url_map)self.regex = regexdef 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返回到前端的datareturn render_template(' index.html', data=data)
{{ data }}
<br>
{{ data.name }}
1.13 flask数据库
数据库与类的对应 ORM
import datetimefrom applications.extensions import dbclass 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 Blueprintbp = Blueprint("qa", __name__, url_prefix="/")@bp.route("/")
def index():passfrom flask import Blueprintbp = 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_bpapp = 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 datetimeclass 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 SQLAlchemydb = SQLAlchemy()
接下来便是Migrate三部曲啦
flask db init–>
flask db migrate(当模型改变时生成迁移脚本)–>
flask db upgrade(运行迁移脚本,同步到数据库中需要先建数据库)
3 学习
3.1 文件上传与下载
请求
from flask import Blueprint, request
from werkzeug.utils import secure_filenamefrom common.res import fail_api, success_api
from utils.upload import uploadFile, downloadFilebp = 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_directoryfrom werkzeug.utils import secure_filename
from config import up_dirdef uploadFile(file):fName = secure_filename(file.filename)fullNamePath = os.path.join(up_dir, fName)file.save(fullNamePath)return 1def 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 Trueelse:return False