2024年10月21日 flask 的基础使用
flask 的安装使用
安装镜像:
1 2 3 4 5 6 7 | 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. 基础代码
1 2 3 4 5 6 7 8 9 10 11 12 | 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 传递参数
1 2 3 4 5 6 | @app .route( '/book/list' ) def book_list(): # arguments;参数 # request.args;美字典类型 page = request.args.get( "page" , default = 1 , type = int ) return f"您获取的是第{page}的图书列表!“ |
3.前台传递参数方式
1 | www.baidu.com / book / list ?page = 5 |
模板渲染
1. 返回 html 页面
@app.route('/')
def hello_world():
return render_template('index.html')
过滤器
1 2 3 4 5 6 7 8 9 | 过滤器的使用方式为:变量名 | 过滤器。 {{ "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 / > |
控制语句
1 2 3 4 5 6 7 8 9 | # 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 % } |
模板继承
1 | { % extends "index.html" % } / / 继承语法{ % block foot % } / / 标签使用 子模板内容 { % endblock % } |
加载静态文件
1 | <link rel = "stylesheet" href = "{{ url_for('static', filename='about.css') }}" > |
数据库
1. 安装插件
1 2 | flask - sqlalchemy flask - migrate |
2. 数据库连接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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. 数据迁移
1 2 3 4 | flask db init 创建迁移文件夹migrates,只调用一次 flask db migrate 生成迁移文件 flask db upgrade 执行迁移文件中的升级 flask db downgrade 执行迁移文件中的降级 |
模型
1.创建一个表
1 2 3 4 5 6 7 | 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 . 添加数据
1 2 3 4 5 6 7 8 | @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. 数据查询
1 2 3 4 5 6 7 8 | @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. 数据修改
1 2 3 4 5 | @app .route( "/user/update" ) def update_user(): user = User.query.filter_by(username = "法外狂徒张三" ).first() / / 查询第一条数据 user.password = " 222222 / / 修改密码 db.session.commit() / / 提价数据 保存 return "数据修改成功!" |
5. 数据删除
1 2 3 4 5 6 7 8 9 | @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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # 表 一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 推荐
1 2 3 4 5 6 7 | 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 文件代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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文件代码
1 2 3 4 5 6 7 | # 配置文件 # 配置sqlite 数据库 SQLALCHEMY_DATABASE_URI = 'sqlite:///boke.db' SQLALCHEMY_TRACK_MODIFICATIONS = False SECRET_KEY = '123856$@@!974ahilf@#$%' |
exts 文件代码
1 2 3 4 5 6 7 | # 扩展文件 from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate # 创建不初始化 db = SQLAlchemy() migrate = Migrate() |
model 文件代码
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 模型文件 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代码
1 2 3 4 5 6 7 8 9 10 | 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 文件代码
1 2 3 4 5 6 7 8 9 | 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 邮箱服务器 设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # 配置邮箱 授权码 # 电子邮件服务器的名称/IP地址 MAIL_SERVER = "smtp.qq.com" # 启用/禁用传输安全层加密 MAIL_USE_TLS = True # 使用的服务器的端口号 MAIL_PORT = 587 # 发件人的用户名 MAIL_USERNAME = "123456@qq.com" # 发件人的密码 MAIL_PASSWORD = "授权码" # 设置默认发件人 MAIL_DEFAULT_SENDER = "123456@qq.com" |
表单验证码 flask - wtf
1 | pip install -i https: //pypi.tuna.tsinghua.edu.cn/simple flask-wtf |
使用
校验
csrf 校验
装饰器
创建一个登录装饰器
使用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2022-10-21 thinkphp入门数据库查询 | 2. 数据库新增 | 3. 数据的修改 | 4. 数据删除 | 5. 数据其他查询方式比较 区间 | 6 时间查询 | 7 聚合原生查询 | 8 数据高级查询 | 9 事务回滚处理