flask自学教程(二)

news2025/1/12 17:35:11

文章目录

  • 前言
  • 一、中型flask目录
  • 二、大型flask目录
    • 1.启动文件run.py定义
    • 2.实例创建文件定义(`app/__init__.py`)
    • 3.配置项config.py
    • 4. app/routes下的`__init__.py`
    • 5. 定义一个路由并写一个静态页面
    • 6. 模型文件
    • 7.static目录
    • 8.requirements.txt依赖
  • 3.flask!启动!


前言

前面用一个app.py实现了一个简单项目,但是都在一个文件里面没办法做模块区分,接下来我们实现一个中小型和大型的flask目录


一、中型flask目录

先看图,目录结构大体如下
在这里插入图片描述

在flask/app目录下我们定义__init__.py来定义实例创建方法

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_redis import FlaskRedis

def create_app():
    app = Flask(__name__)
    
    # 导入配置
    app.config.from_object('config.Config')

    # 实例化数据库对象
    db = SQLAlchemy(app)

    # 实例化redis对象
    redis_client = FlaskRedis(app)

    # 引入路由 blueprint
    from . import routes
    app.register_blueprint(routes.bp)

    return app

config.py为配置项,配置如下

class Config:
    # Debug模式
    DEBUG = True
    # SECRET_KEY 密钥
    SECRET_KEY = '631ada96b1246c6ca3a92ee8e85f5393734509313cdbc59f42527b433c5fe61d'
    # 数据库配置
    SQLALCHEMY_DATABASE_URI ='mysql+pymysql://root:123456@localhost:3306/flask_demo'
    SQLALCHEMY_TRACK_MODIFICATIONS = False

    # Redis配置
    REDIS_URL ='redis://localhost:6380/0'

requirements.txt为依赖项,目前咱们只用到一个flask

Flask==2.2.3

最外层的run.py是我们启动文件,内容如下

from app import create_app

app = create_app()

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

接下来我们在routes.py定义一个简单的路由来试试能不能访问这个应用

from flask import Blueprint

bp = Blueprint('main', __name__)

@bp.route('/')
def index():
    return 'Hello, World!'

# 404错误处理
@bp.errorhandler(404)
def page_not_found(e):
    return 'This page does not exist', 404

# 500错误处理
@bp.errorhandler(500)
def internal_server_error(e):
    return 'Internal Server Error', 500

在项目根目录执行python run.py
在这里插入图片描述
在这里插入图片描述

二、大型flask目录

对于较大的应用,可能需要更复杂的项目结构,以支持更高的模块化和扩展性
还是老样子先上目录
在这里插入图片描述

1.启动文件run.py定义

from app import create_app, db

app = create_app()

# 执行数据库迁移
with app.app_context():
    db.create_all()

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

这部分基本跟前面一样

2.实例创建文件定义(app/__init__.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_redis import FlaskRedis

# 实例化数据库对象
db = SQLAlchemy()

def create_app():
    app = Flask(__name__)
    
    # 导入配置
    app.config.from_object('config.Config')

    db.init_app(app)

    # 实例化redis对象
    redis_client = FlaskRedis(app)

    # 注册蓝图 with是上下文管理器,可以自动调用__enter__和__exit__方法
    # 使用  with app.app_context():来获取上下文,调用蓝图
    with app.app_context():
        from .routes import bp
        app.register_blueprint(bp)

    return app

上下文管理器是 Python 中一种用于管理资源的工具,它通过定义一个上下文(context)来简化资源的管理,比如文件操作、数据库连接、网络连接等,上下文管理器确保在代码块执行完毕后,资源能够被正确释放,即使在执行过程中发生了异常,这里咱们后期再研究,目前已知是用这个咱们可以正确注册蓝图

3.配置项config.py

class Config:
    # Debug模式
    DEBUG = True
    # SECRET_KEY 密钥
    SECRET_KEY = '631ada96b1246c6ca3a92ee8e85f5393734509313cdbc59f42527b433c5fe61d'
    # 数据库配置
    SQLALCHEMY_DATABASE_URI ='mysql+pymysql://root:123456@localhost:3306/flask_demo'
    SQLALCHEMY_TRACK_MODIFICATIONS = False

    # Redis配置
    REDIS_URL ='redis://localhost:6380/0'

config.py基本还是保持一致,因为他的作用是写配置的

4. app/routes下的__init__.py

# 在这里 import 所有路由模块
from .main import bp

5. 定义一个路由并写一个静态页面

在app/routes目录下的main.py写入内容

from flask import Blueprint, render_template

bp = Blueprint('main', __name__)

@bp.route('/')
def index():
    return render_template('index.html')

在templates文件夹下面写入html内容

<!DOCTYPE html>
<html>
<head>
	<title>Welcome to my website</title>
</head>
<body>
	<h1>Welcome to my website</h1>
	<p>This is a sample website created using Flask.</p>
</body>
</html>

6. 模型文件

在app/models下面有一个__init__.py,我们可以做一些操作比如

# app/models/__init__.py

from flask_sqlalchemy import SQLAlchemy

# 创建一个 SQLAlchemy 实例
db = SQLAlchemy()

# 从当前模块导入所有模型
from .user import User
# 添加其他模型的导入

这个时候我们定义一个user模型(user.py)

from . import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return f'<User {self.username}>'

7.static目录

这个目录就不多解释了,放静态资源文件入js/css/图片等文件
比如你在app/static/js下有一个main.js

// main.js
function showAlert() {
    alert("Hello! This is a popup message.");
}

在页面中调用如下(使用{{ url_for('static', filename='js/main.js') }}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Popup Example</title>
    <script src="{{ url_for('static', filename='js/main.js') }}"></script>
</head>
<body>
    <h1>Popup Example</h1>
    <button onclick="showAlert()">Click me</button>
</body>
</html>

8.requirements.txt依赖

之前安装依赖一直都是缺一个安装一个,其实我们可以在这个文件里面把需要的依赖都写上去,例如:

Flask
Flask-SQLAlchemy
pymysql

然后我们只想下面的命令就可以安装了,这样就可以批量安装了

pip install -r requirements.txt

3.flask!启动!

在项目根目录执行命令python run.py
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里实现了基本的flask应用,后续我们继续在这个目录基础上实现如何完整跑一个项目

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

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

相关文章

威胁 Windows 和 Linux 系统的新型跨平台勒索软件:Cicada3301

近年来&#xff0c;网络犯罪世界出现了新的、日益复杂的威胁&#xff0c;能够影响广泛的目标。 这一领域最令人担忧的新功能之一是Cicada3301勒索软件&#xff0c;最近由几位网络安全专家进行了分析。他们有机会采访了这一危险威胁背后的勒索软件团伙的成员。 Cicada3301的崛…

C/C++ 随机数生成方法

1. 使用 rand() 和 srand() - 库: <stdlib.h> 或 <cstdlib> - 特点: 伪随机数生成器&#xff0c;简单易用。 - 示例: #include <stdlib.h> #include <time.h> int main() { srand(time(NULL)); // 初始化随机数生成器 int random_nu…

openEuler 系统进程管理全攻略

openEuler 系统进程管理全攻略 一、前言 在 openEuler 操作系统中&#xff0c;进程管理是系统管理的重要组成部分。有效地管理进程可以提高系统的性能、稳定性和安全性。本文将详细介绍 openEuler 系统中与进程管理相关的操作、工具和命令&#xff0c;包括它们的应用场景和使…

Jenkins发布vue项目,版本不一致导致build错误

问题一 yarn.lock文件的存在导致在自动化的时候&#xff0c;频频失败问题二 仓库下载的资源与项目资源版本不一致 本地跑好久的一个项目&#xff0c;现在需要部署在Jenkins上面进行自动化打包部署&#xff1b;想着部署后今后可以省下好多时间&#xff0c;遂兴高采烈地去部署&am…

技术成神之路:设计模式(二十一)外观模式

相关文章&#xff1a;技术成神之路&#xff1a;二十三种设计模式(导航页) 介绍 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它为子系统中的一组接口提供一个统一的接口。外观模式定义了一个高层接口&#xff0c;使得子系统更容易使用。 …

十六:Python学习笔记-- 爬虫(2)requests 模块详解

目录 安装 requests 模块 基本请求方法 GET 请求 POST 请求 PUT 请求 DELETE 请求 添加请求头&#xff1a; 处理查询参数&#xff1a; 文件上传&#xff1a; 常见响应状态码 访问超时 cookie的查询和设置 查询 Cookies 设置 Cookies 设置爬虫代理 小试牛刀 安装 …

QStringList 使用详解

QT开发之路 企业级开发系列文章&#xff0c;主要目标快速学习、完善、提升 相关技能 高效完成企业级项目开发 分享在企业中积累的实用技能和经验。 通过具体的编码过程、代码示例、步骤详解、核心内容和展示的方法解决遇到的实际问题。 转载请附上文章出处与本文链接。 QStrin…

尚硅谷 | Nginx | 学习笔记

尚硅谷 | Nginx | 学习笔记 尚硅谷Nginx教程由浅入深&#xff08;一套打通丨初学者也可掌握&#xff09;_哔哩哔哩_bilibili 文章目录 尚硅谷 | Nginx | 学习笔记一、Nginx相关概念1.Nginx是什么2.正向代理和反向代理正向代理反向代理 3.负载均衡和动静分离负载均衡动静分离 二…

AtCoder ABC376A-D题解

个人觉得 ABC 变得越来越难了/kk/kk/kk 比赛链接:ABC376 Problem A: Code #include <bits/stdc.h> using namespace std; int main(){int N,C;cin>>N>>C;for(int i1;i<N;i)cin>>T[i];int ans0,pre-1e5;for(int i1;i<N;i){if(T[i]-pre>C){…

后台管理系统的通用权限解决方案(五)SpringBoot整合hibernate-validator实现表单校验

1 hibernate-validator介绍 早期的网站&#xff0c;用户输入一个邮箱地址&#xff0c;需要将邮箱地址发送到服务端&#xff0c;服务端进行校验&#xff0c;校验成功后&#xff0c;给前端一个响应。 有了JavaScript后&#xff0c;校验工作可以放在前端去执行。那么为什么还需要…

【02基础】- RabbitMQ基础

目录 2- RabbitMQ2-1 介绍和安装安装 2-2 RabbitMQ 快速入门2-3 RabbitMQ 数据隔离 3- Java客户端3-1 快速入门AMQP快速入门&#x1f4d1;小结&#xff1a;SpringAMQP如何收发消息&#xff1f; 3-2 WorkQueues 任务模型案例-使用 WorkQueue 单队列绑定多消费者&#x1f4d1;小结…

uniapp开发【选择地址-省市区功能】,直接套用即可

一、效果展示 二、代码 <template><view><view class="user_info"><view class="item"

.NET Core WebApi第3讲:第一个WebApi项目、WebApi开发三种模型

一、.NEt Core 1、运行模板项目 1&#xff09;仍然有controllers&#xff0c;说明WebApi是基于MVC模式的&#xff0c;只是对比之下这里没有MVC中的views。 因为WebApi只会向前台发送数据&#xff0c;不会向前台发送HTML页面。 2、验证模板项目的api 1&#xff09;法1&#xf…

地球上的中国:世界地图概览

目录 地理空间数据可视化描绘地图导入Python包参数设置true自定义分段设置分段数量 绘制世界地图总结 地理空间数据可视化 地理空间数据可视化涉及将含有地理定位信息的数据转换成图形或影像形式&#xff0c;以此增强数据的理解与解析。这一方法广泛应用于诸如都市策划、生态守…

一文详解大模型推理:从基础知识到 vLLM

推理 本章正在建设中 - 一些部分已经完成&#xff0c;一些刚刚开始&#xff0c;还有许多尚未开始&#xff0c;但已经有足够多的有用部分完成&#xff0c;使其值得阅读。 术语表 CLA: 跨层注意力&#xff08;Cross-Layer Attention&#xff09;FHE: 全同态加密&#xff08;Fu…

【语音转文本新体验】Windows部署Whisper Web结合内网穿透轻松远程转录——“cpolar内网穿透”

文章目录 前言1.本地部署Whisper Web1.1 安装git1.2 安装Node.js1.3 运行项目 2. Whisper Web使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 公网访问测试6. 配置固定公网地址 前言 OpenAI开源的 Whisper 语音转文本模型效果都说还不错&#xff0c;今天就给大家推荐 GitHub…

深入理解HTTPS协议原理

目录 加密 对称加密 非对称加密 中间人攻击 证书 验证证书合法性 HTTPS工作原理 常见问题 HTTPS即安全超文本传输协议&#xff0c;是互联网上进行安全通信的一种重要协议。它是在HTTP的基础上增加了安全性的要求&#xff0c;通过SSL或TLS协议对数据进行加密&#xff0c…

省、市、县夜间灯光数据大全(Excel+shp数据)(1992-2022年)

夜间灯光数据&#xff0c;作为一种遥感数据&#xff0c;能够为我们揭示夜晚地球的灯光和火光分布情况。这种数据不仅能够反映人类活动的空间分布&#xff0c;还能作为经济发展、社会进步和环境变化的一个量化指标。通过分析夜间灯光的亮度和分布&#xff0c;我们可以对一个地区…

Spring三级缓存解决循环依赖?构造方法的循环依赖问题解决(原理、详细过程、面试题)

目录 1.什么是循环依赖 2.Spring三级缓存介绍 3.二级缓存可以解决循环依赖吗&#xff1f; 3.1 二级缓存解决循环依赖过程详解 4. 为什么还需要三级缓存呢&#xff1f;/Spring三级缓存的作用&#xff1f; 4.1三级缓存解决循环依赖过程详解 4.2 为什么二级缓存就不能解决代…

如何在算家云搭建LongWriter(长文创作)

一、 LongWriter 简介 在自然语言处理领域&#xff0c;随着对长文本处理需求的不断增加&#xff0c;能够高效生成长文本的语言模型变得至关重要。LongWriter 的推出正是为了打破传统语言模型在生成超长文本时的限制。LongWriter-glm4-9b 是基于glm-4-9b进行训练的&#xff0c;…