知了传课Flask学习(持续更新)

news2024/11/24 15:29:13

一、基础内容

1.Flask快速应用

pip install flask

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello world'

if __name__ == '__main__':
    app.run()

 2.debug、host、port配置

from flask import Flask,request

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello'


if __name__ == '__main__':
    # debug模型:实时修改更新代码
    # 修改host:修改主机号
    # 修改port:修改端口号
    app.run(debug=True,host='localhost',port=8080)

3.URL与视图的映射

from flask import Flask,request

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello'

@app.route('/profile')
def profile():
    return '我是个人中心'

@app.route('/blog/<int:id>')
def blog_detail(id):
    return f'您访问的博客是{id}'

# /book/list:返回第一页数据
# /book/list?page=2:返回第二页数据
@app.route('/book/list')
def book_list():
    page = request.args.get('page',default=1,type=int)
    return  f'您获取的是第{page}页图书列表'

if __name__ == '__main__':
    # debug模型:实时修改更新代码
    # 修改host:修改主机号
    # 修改port:修改端口号
    app.run(debug=True,host='localhost',port=8080)

4.Flask连接MySQL数据库

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import text
from flask_migrate import Migrate

app = Flask(__name__)

HOSTNAME = '127.0.0.1'
PORT = 3306
USERNAME = 'root'
PASSWORD = 'root'
DATABASE = 'test'
app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"

# app.config设置好连接数据库的信息
# 使用SQLAlchemy(app)创建一个db对象

db = SQLAlchemy(app)
migrate = Migrate(app, db)

# 测试链接
with app.app_context():
    with db.engine.connect() as conn:
        query = text("select 1")  # 使用text函数创建可执行的对象
        rs = conn.execute(query)
        print(rs.fetchone())

@app.route('/')
def hello_world():
    return "hello world"

if __name__ == '__main__':
    app.run()

5.ORM与表的映射

class User(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(100),nullable=False)

6.ORM的增删改查

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import text
from flask_migrate import Migrate

app = Flask(__name__)

HOSTNAME = '127.0.0.1'
PORT = 3306
USERNAME = 'root'
PASSWORD = 'root'
DATABASE = 'test'
app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"

# app.config设置好连接数据库的信息
# 使用SQLAlchemy(app)创建一个db对象

db = SQLAlchemy(app)
migrate = Migrate(app, db)

# 测试链接
with app.app_context():
    with db.engine.connect() as conn:
        query = text("select 1")  # 使用text函数创建可执行的对象
        rs = conn.execute(query)
        print(rs.fetchone())

class User(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(100),nullable=False)

@app.route('/user/add')
def add_user():
    user = User(username='yld',password='123456')
    db.session.add(user)
    db.session.commit()
    return '用户创建成功'

@app.route('/user/query')
def query_user():
    # 1.get查找 根据主键查找
    user = User.query.get(1)
    print(f'{user.username}')
    return '数据查找成功'
    # 2.filter_by查找
    users = User.query.filter_by(username = 'yld')
    for i in users:
        print(i.id)
    return '数据查找成功'

@app.route('/user/update')
def update_user():
    users = User.query.filter_by(username = 'yld').first()
    users.password = '222222'
    db.session.commit()
    return '数据修改成功'

@app.route('/user/delete')
def delete_user():
    users = User.query.filter_by(username = 'yld').first()
    db.session.delete(users)
    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)

    #添加作者外键
    author_id = db.Column(db.Integer,db.ForeignKey('user.id'))
    #backref:自动给User模型添加一个articles属性,用来获取文章列表
    author = db.relationship('User',backref='articles')



@app.route('/article/add')
def article_add():
    article = Article(title='Flask学习', content='数据库')
    user = User.query.filter_by(username = 'yld').first()

    article.author_id = user.id
    article.author = user

    db.session.add(article)
    db.session.commit()

    return '文章添加成功'



@app.route('/')
def hello_world():
    return "hello world"

if __name__ == '__main__':
    app.run()

二、内容实战

1.博客平台项目搭建

①app.py

from flask import Flask
import config
from exts import db
from models import UserModel
from blueprints.qa import qa
from blueprints.auth import auth
from flask_migrate import Migrate

app = Flask(__name__)

app.config.from_object(config)

db.init_app(app)
migrate = Migrate(app,db)

app.register_blueprint(auth)
app.register_blueprint(qa)

if __name__ == '__main__':
    app.run(debug=True)

②config.py

HOSTNAME = '127.0.0.1'
PORT = 3306
USERNAME = 'root'
PASSWORD = 'root'
DATABASE = 'test'

DB_URI =  f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"

SQLALCHEMY_DATABASE_URI = DB_URI

③exts.py

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

2.User模型搭建

model.py

from exts import db
from datetime import datetime

class 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(100),nullable=False)
   email = db.Column(db.String(100),nullable=False,unique=True)
   join_time = db.Column(db.DateTime,default=datetime.now)

迁移命令:

flask db init

flask db migrate

flask db upgrade

3.注册页面渲染

①register.html

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="{{url_for('static',filename='bootstrap/bootstrap.4.6.min.css')}}">
    <link rel="stylesheet" href="{{url_for('static',filename='css/init.css')}}">

    <title>知了问答平台-注册</title>
</head>

<body>
    <nav class="navbar navbar-expand-lg navbar-light bg-light">
        <div class="container">
            <a class="navbar-brand" href="#">知了问答</a>
            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"
                aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse" id="navbarSupportedContent">
                <ul class="navbar-nav mr-auto">
                    <li class="nav-item active">
                        <a class="nav-link" href="/">首页 <span class="sr-only">(current)</span></a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" href="#">发布问答</a>
                    </li>
                    <li class="nav-item ml-2">
                        <form class="form-inline my-2 my-lg-0" method="GET" action="#">
                            <input class="form-control mr-sm-2" type="search" placeholder="关键字" aria-label="Search"
                                name="q">
                            <button class="btn btn-outline-success my-2 my-sm-0" type="submit">搜索</button>
                        </form>
                    </li>
                </ul>
                <ul class="navbar-nav">
                    <li class="nav-item">
                        <a class="nav-link" href="#">登录</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" href="#">注册</a>
                    </li>
                </ul>
            </div>
        </div>
    </nav>
    <div class="container">
        <div class="row mt-4">
            <div class="col"></div>
            <div class="col">
                <form method="POST" action="#">
                    <div class="form-group">
                        <label for="exampleInputEmail1">邮箱</label>
                        <input type="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp"
                            name="email">
                        <small id="emailHelp" class="form-text text-muted">我们不会把邮箱用于其他用户</small>
                    </div>
                    <div class="form-group">
                        <label for="exampleInputEmail1">验证码</label>
                        <div class="input-group">
                            <input type="text" class="form-control" name="captcha">
                            <div class="input-group-append">
                                <button class="btn btn-outline-secondary" type="button" id="captcha-btn">获取验证码</button>
                            </div>
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="exampleInputEmail1">用户名</label>
                        <input type="text" class="form-control" name="username">
                    </div>
                    <div class="form-group">
                        <label for="exampleInputPassword1">密码</label>
                        <input type="password" class="form-control" id="exampleInputPassword1" name="password">
                    </div>
                    <div class="form-group">
                        <label for="exampleInputPassword1">确认密码</label>
                        <input type="password" class="form-control" name="password_confirm">
                    </div>
                    <button type="submit" class="btn btn-primary btn-block">立即注册</button>
                </form>
            </div>
            <div class="col"></div>
        </div>
    </div>
</body>

</html>

 ②auth.py

from flask import Blueprint, render_template

auth = Blueprint('auth', __name__, url_prefix='/auth')


@auth.route('/register')
def register():
    return render_template('register.html')

4.Flask发送邮件功能

5.后端注册表单验证器实现

pip install flask-wtf

6.后端注册功能完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1689878.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

免费,Python蓝桥杯等级考试真题--第11级(含答案解析和代码)

Python蓝桥杯等级考试真题–第11级 一、 选择题 答案&#xff1a; 解析&#xff1a;range取首不取尾&#xff0c;即产生了数1234&#xff0c;list&#xff08;&#xff09;函数可以把产生的数1234转化为列表&#xff0c;故答案为A。 答案&#xff1a;B 解析&#xff1a;sort&a…

如何一键生成多个文本二维码?excel表格批量生码的方法

现在很多人会将文本信息做成二维码来展示&#xff0c;当有同类型内容生成大量二维码时&#xff0c;可以使用将文本导入excel表格的方式&#xff0c;将表格中的每条数据批量生成二维码&#xff0c;可以有效提升二维码制作的速度和效率。下面就让小编来将具体的操作步骤分享给大家…

计算机组成结构—中断和异常

一、基本概念和分类 计算机在执行程序的过程中&#xff0c;有时会遇到一些异常情况或者特殊请求&#xff1b;这时就需要计算机暂停正在运行的程序&#xff0c;转而先去处理这些异常或特殊请求&#xff0c;处理结束之后再返回程序的断点处继续执行。这种处理方式就被称为 “中断…

USB数据恢复软件:轻松找回U盘重要数据!

USB数据丢失的原因 USB数据丢失有一些常见原因&#xff0c;了解这些原因有利于恢复数据。 文件意外删除病毒攻击软件错误未安全弹出USB设备格式化USB设备 顺便一提&#xff0c;如果你通过快捷键“Ctrl D”删除了数据&#xff0c;那你可以从回收站中还原它们。如果你永久删除…

改进rust代码的35种具体方法-类型(十八)-不要惊慌

上一篇文章 它看起来非常复杂&#xff0c;这就是为什么它贴合的塑料盖上用大号友好字母印上“不要恐慌”的原因之一。——道格拉斯亚当斯 此项目的标题将更准确地描述为更喜欢返回Result而不是使用panic!&#xff08;但不要惊慌更吸引人&#xff09;。 Rust的panic机制主要是为…

轧神仙,沾福气!李良济中医药惠民生,为苏城市民送健康!

5月19-22日&#xff0c;苏州人迎来了自己的狂欢节——第六届江南文化艺术国际旅游节“轧神仙”系列活动&#xff0c;石路商圈人头涌动&#xff0c;喧闹非凡。 相传农历的四月十四日是“八仙”之一吕洞宾的诞辰&#xff0c;吕洞宾此日化为乞丐、小贩&#xff0c;混迹苏州阊门福济…

Gradle常见问题及总结

使用android studio开发项目&#xff0c;难免遇到gradle相关的错误&#xff0c;在此总结。 gradle插件与gradle home版本关系错误 参考更新 Gradle Gradle下载太慢 Index of /gradle/ (tencent.com) 是国内下载地址,手动下载对应版本即可 缓存不刷新 问题描述 maven发布…

电影推荐|基于SSM+vue的电影推荐系统的设计与实现(源码+数据库+文档)

电影推荐系统 目录 基于SSM&#xff0b;vue的电影推荐系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#…

OneAPI接入本地大模型+FastGPT调用本地大模型

将Ollama下载的本地大模型配置到OneAPI中&#xff0c;并通过FastGPT调用本地大模型完成对话。 OneAPI配置 新建令牌 新建渠道 FastGPT配置 配置docker-compose 配置令牌和OneAPI部署地址 配置config.json 配置调用的渠道名称和大模型名称 {"systemEnv": {&qu…

W801 实现获取天气情况

看了小安派&#xff08;AiPi-Eyes 天气站&#xff09;的源码&#xff0c;感觉用W801也可以实现。 一、部分源码 main.c #include "wm_include.h" #include "Lcd_Driver.h"void UserMain(void) {printf("\n user task \n");Lcd_Init();Lcd_Clea…

jenkins插件之xunit

分析测试工具执行的结果&#xff0c;并图形化&#xff0c;比如phpunit&#xff0c;phpstan,可分析junit格式的结果 安装jenkins插件 搜索xunit并安装 项目配置 配置 - Build Steps 您的项目 - 配置 - Build Steps, 新增 Run with timeout 超时时间根据实际情况配置 Build…

架构二。。

1、CAP 只能3选2 1&#xff09;一致性&#xff08;Consistency&#xff09; 客户每次读都是返回最新的写操作结果 2&#xff09;可用性&#xff08;Availability&#xff09; 非故障节点在合理的时间内返回合理的响应 3&#xff09;分区容忍性&#xff08;Partition Tolerance…

零基础代码随想录【Day42】|| 1049. 最后一块石头的重量 II,494. 目标和,474.一和零

目录 DAY42 1049.最后一块石头的重量II 解题思路&代码 494.目标和 解题思路&代码 474.一和零 解题思路&代码 DAY42 1049.最后一块石头的重量II 力扣题目链接(opens new window) 题目难度&#xff1a;中等 有一堆石头&#xff0c;每块石头的重量都是正整…

第七步 实现打印函数

文章目录 前言一、如何设计我们的打印函数&#xff1f;二、实践检验&#xff01; 查看系列文章点这里&#xff1a; 操作系统真象还原 前言 现在接力棒意见交到内核手中啦&#xff0c;只不过我们的内核现在可谓是一穷二白啥都没有&#xff0c;为了让我们设计的内核能被看见被使用…

fyne网格包裹布局

fyne网格包裹布局 与之前的网格布局一样&#xff0c;网格环绕布局以网格模式创建元素排列。但是&#xff0c;此网格没有固定数量的列&#xff0c;而是为每个单元格使用固定大小&#xff0c;然后将内容流到显示项目所需的行数。 layout.NewGridWrapLayout(size) 您可以使用其中…

Mac维护神器CleanMyMac X成为你的苹果电脑得力助手

在数字化时代&#xff0c;Mac电脑已成为众多用户的首选。然而&#xff0c;随着频繁的使用和数据量的日益增长&#xff0c;许多Mac用户面临着系统杂乱、存储空间不足以及隐私保护等问题。幸运的是&#xff0c;"CleanMyMac X"这款优化和清理工具应运而生&#xff0c;它…

「网络流浅谈」最大流的应用

更好的阅读体验 二分图匹配 考虑如何将二分图匹配问题&#xff0c;转化为流网络。设置 1 1 1 个汇点和源点&#xff0c;从源点向二分图一侧的每一个点连边&#xff0c;从另一侧向汇点连边&#xff0c;边权均为 1 1 1&#xff0c;二分图中的边也全部加入&#xff0c;权值设为…

【Linux取经路】基于信号量和环形队列的生产消费者模型

文章目录 一、POSIX 信号量二、POSIX 信号量的接口2.1 sem_init——初始化信号量2.2 sem_destroy——销毁信号量2.3 sem_wait——等待信号量2.4 sem_post——发布信号量 三、基于环形队列的生产消费者模型3.1 单生产单消费模型3.2 多生产多消费模型3.3 基于任务的多生产多消费模…

构建健壮的机器学习大数据平台:任务实现与数据治理的关键

随着数据驱动决策成为现代企业的核心&#xff0c;构建安全、可靠且可扩展的大数据平台变得至关重要。这样的平台不仅需要支持复杂的机器学习任务&#xff0c;还需要在数据质量、合规性和分发方面提供严格的控制。本文旨在探讨构建大型企业机器学习大数据平台时需要考虑的关键要…

项目如何有效做资源管理?易趋项目管理软件让资源管理可视化

在项目管理的过程中&#xff0c;有效的资源管理能够确保资源得到合理的分配和使用&#xff0c;避免资源的浪费和冗余&#xff0c;进而提高整体工作效率、确保项目的成功&#xff1b;同时降低组织的运营成本。 但在项目推进过程中&#xff0c;项目经理总会面临各种资源管理的难…