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=1type=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 校验 

 

 

 


 

 

装饰器

创建一个登录装饰器

 

 

 

 使用 

 

 

 

 

 

 

 

 

 

 

posted @   我在春天等伱  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2022-10-21 thinkphp入门数据库查询 | 2. 数据库新增 | 3. 数据的修改 | 4. 数据删除 | 5. 数据其他查询方式比较 区间 | 6 时间查询 | 7 聚合原生查询 | 8 数据高级查询 | 9 事务回滚处理
点击右上角即可分享
微信分享提示