2024年10月21日 flask 的基础使用

longly1111 / 2024-11-07 / 原文

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 校验 

 

 

 


 

 

装饰器

创建一个登录装饰器

 

 

 

 使用