2024年10月21日 flask 的基础使用
flask 的安装使用
安装镜像:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple Flask pip install -i https://pypi.tuna.tsinghua.edu.cn/simple flask-wtf pymysql // 数据库 驱动 flask-sqlalchemy // shujuku flask-migrate // prm flask-mail // 邮箱 flask-wtf // 表达验证
1. 基础代码
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world(): # put application's code here
return '正式开始'
if __name__ == '__main__':
app.run()
2. url 传递参数
@app.route('/book/list')
def book_list():
# arguments;参数
# request.args;美字典类型
page = request.args.get("page", default=1, type=int)
return f"您获取的是第{page}的图书列表!“
3.前台传递参数方式
www.baidu.com/book/list?page=5
模板渲染
1. 返回 html 页面
@app.route('/')
def hello_world():
return render_template('index.html')
过滤器
过滤器的使用方式为:变量名 | 过滤器。 {{ "hello world" | reverse | upper }} // 使用
// 自定义过滤器
# 方法一:通过注册的方式定义过滤器 # add_template_filter的底层函数 self.jinja_env.filters[name or f.__name__] = f # add_template_filter参数可以理解为:通过自定义过滤器名字my_lireverse找到过滤器的引用do_listreverse,然后通过引用启动过滤器 def do_listreverse(li): temp_li = list(li) temp_li.reverse() return temp_li app.add_template_filter(do_listreverse,"my_lireverse01")
// 调用
{{ "123456789"|my_lireverse01 }}<br/>
控制语句
# if 语句
<!doctype html>
<title>Hello from Flask</title>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello, World!</h1>
{% endif %}
# for
{% for fruit in fruits %}
<li>{{ fruit }}</li>
{% endfor %}
模板继承
{% extends "index.html" %} // 继承语法
{% block foot %} // 标签使用
子模板内容
{% endblock %}
加载静态文件
<link rel="stylesheet" href = "{{ url_for('static', filename='about.css') }}">
数据库
1. 安装插件
flask-sqlalchemy
flask-migrate
2. 数据库连接
pymysql // 安装插件 连接 sql HOSTNAME="127.0.0.1" PORT=***** USERNAME="******" PASSWORD="******" DATABASE = '*****' app.config['SQLALCHEMY_DATABASE_URI']=f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4" app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True // 连接 sqlite from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db' # 使用 SQLite 数据库 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) --------------------------------
3. 数据迁移
flask db init 创建迁移文件夹migrates,只调用一次
flask db migrate 生成迁移文件
flask db upgrade 执行迁移文件中的升级
flask db downgrade 执行迁移文件中的降级
模型
1.创建一个表
from flask import Flask, render_template, request, redirect from flask_migrate import Migrate from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() app = Flask(__name__) class User(db.Model): // 创建一个表
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True) // 字段
name = db.Column(db.String(80), unique=True)
email = db.Column(db.String(80), unique=True)
2 . 添加数据
@app.route('/user/add')
def user_add():
user1=User(username:"张三", password:"111111'
user2=User(username:"李", password:"222222")
db.session.add(user1)
db.session.add(user2)
db.session.commit()
return "用户添加成功!"
3. 数据查询
@app.route('/user/get')
def user_add():
#1.get查找:根据主键查找 获取一个数据
#user =User.query.get(1)
#2.filter_by查找 获取一个数据集
users = User.query.filter_by(username="法外狂徒张三")
return "数据查找成功!"
4. 数据修改
@app.route("/user/update") def update_user(): user = User.query.filter_by(username="法外狂徒张三").first() // 查询第一条数据 user.password = "222222 // 修改密码 db.session.commit() //提价数据 保存
return "数据修改成功!"
5. 数据删除
@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“数据删除成功!"
6. 外键 数据表的关系 1对 1
7. 外键 数据表的关系 1对多
案例 1
# 表 一
class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80), unique=True) email = db.Column(db.String(80), unique=True) # 表 二 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) # 添加作者的外键 author_id = db.Column(db.Integer, db.ForeignKey("user.id"))
# 反向引用 通过作者获取 他所有文章 author = db.relationship("User", backref="articles")
案例 2 推荐
class Parent(db.Model): id = db.Column(db.Integer, primary_key=True)
# 反向引用 children = db.relationship('Child', backref='parent', lazy='dynamic') class Child(db.Model): id = db.Column(db.Integer, primary_key=True)
# 外键 parent_id = db.Column(db.Integer, db.ForeignKey('parent.id'))
// 查询
@app.route("/article/query")
def query_article():
user = User.query.get(2) // 查询用户下所有文章
for article in user.articles:
print(article.title)
return "文章查找成功!"
8. 外键 数据表的关系 多对多
项目拆分
第一种拆分
app 文件代码
from flask import Flask
import config
# 扩展库
from exts import db
from exts import migrate
# 引入 模型
from model import UserModel
# 引入蓝图
from lantu.qa import qa
from lantu.auth import auth
app = Flask(__name__)
# 绑定配置文件
app.config.from_object(config)
# 绑定 db
db.init_app(app)
migrate.init_app(app, db)
# 注册蓝图
app.register_blueprint(qa)
app.register_blueprint(auth)
if __name__ == '__main__':
app.run()
config文件代码
# 配置文件
# 配置sqlite 数据库
SQLALCHEMY_DATABASE_URI = 'sqlite:///boke.db'
SQLALCHEMY_TRACK_MODIFICATIONS = False
SECRET_KEY = '123856$@@!974ahilf@#$%'
exts 文件代码
# 扩展文件
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
# 创建不初始化
db = SQLAlchemy()
migrate = Migrate()
model 文件代码
# 模型文件
from datetime import datetime
from exts import db
class UserModel(db.Model):
__tablename__ = 'user_model'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(200))
age = db.Column(db.Integer)
email = db.Column(db.String(120), unique=True)
joined = db.Column(db.DateTime, default=datetime.utcnow)
蓝图 包 代码
auth代码
from flask import Blueprint, render_template
# 后台 蓝图
auth = Blueprint('auth', __name__, url_prefix='/auth')
@auth.route('/')
def admin():
username = '后台页面'
return render_template('auth/index.html')
qa 文件代码
from flask import Blueprint, render_template
# 前台蓝图
qa = Blueprint('qa', __name__, url_prefix='/')
@qa.route('/')
def index():
return render_template('qa/index.html')
html 代码自己补充
flask-mail 邮箱服务器 设置
# 配置邮箱 muchdvlncfybbgbf
# 电子邮件服务器的名称/IP地址
MAIL_SERVER = "smtp.qq.com"
# 启用/禁用传输安全层加密
MAIL_USE_TLS = True
# 使用的服务器的端口号
MAIL_PORT = 587
# 发件人的用户名
MAIL_USERNAME = "121340751@qq.com"
# 发件人的密码
MAIL_PASSWORD = "muchdvlncfybbgbf"
# 设置默认发件人
MAIL_DEFAULT_SENDER = "121340751@qq.com"
表单验证码 flask - wtf
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple flask-wtf
使用
校验
csrf 校验
装饰器
创建一个登录装饰器
使用