Flask学习之项目搭建

devtools/2024/9/25 11:45:26/

一、项目基本结构

1、 exts.py

存在的目的:在Python中,如果两个或更多模块(文件)相互导入对方,就会形成导入循环。例如,模块A导入了模块B,同时模块B又导入了模块A,这就会导致导入循环。

比如在这个项目中如果在app.py 中定义db,在models.py中使用app.py 中的db,又在app.py 中使用models.py 中的ORM模型,这样就导致app.py 和models.py 互相引用。

python">from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

2、 config.py

存放一些公共的配置信息,比如数据库信息,邮箱信息等

python">PORT = 3306
HOSTNAME = "127.0.0.1"
USERNAME = "root"
PASSWORD = 密码
DATABASE = 数据库名称
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI
SQLALCHEMY_TRACK_MODIFICATIONS = False

4、view.py

编写视图相关的代码!!

python">from flask import Blueprint, render_templatebp = Blueprint('front', __name__, url_prefix='/')@bp.route('/')
def index():return render_template('front/index.html')

6、models.py

编写ORM模型

python">from datetime import datetime
from werkzeug.security import generate_password_hash, check_password_hash
from exts import db
import shortuuid
import enumclass Gender(enum.Enum):MALE = 1FEMALE = 2SECRET = 3UNKNOW = 4class FrontUser(db.Model):__tablename__ = 'user'# 从安全角度考虑,前台用户id不能再使用自增长,id = db.Column(db.String(100), primary_key=True, default=shortuuid.uuid)telephone = db.Column(db.String(100), unique=True, nullable=False)username = db.Column(db.String(20), nullable=False)_password = db.Column(db.String(200), nullable=False)email = db.Column(db.String(50), unique=True)realname = db.Column(db.String(50))avatar = db.Column(db.String(100))signature = db.Column(db.String(200))gender = db.Column(db.Enum(Gender), default=Gender.UNKNOW)join_time = db.Column(db.DateTime, default=datetime.now)# 所以需要重写__init__构造函数,将password的值取出def __int__(self, *args, **kwargs):if "password" in kwargs:self.password = kwargs.get('password')kwargs.pop("password")super(FrontUser, self).__init__(*args, **kwargs)@propertydef password(self):return self._password@password.setterdef password(self, row_password):self._password = generate_password_hash(row_password)def check_password(self, row_password):return check_password_hash(self.password, row_password)​

7、form.py

存放该项目中的后台数据验证

python">class LoginForm(BaseForm):telephone = StringField(validators=[Regexp(r"^1[34789]\d{9}", message="手机号码格式错误!")])password = StringField(validators=[Regexp(r"^[0-9a-zA-Z_\.]{6,20}$", message="密码必须是由6-20位数字、字母组成。")])remember = IntegerField()

8、manage.py

python">from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from exts import db
from app import create_app
from apps.front import models as front_modelsFrontUser = front_models.FrontUser
app = create_app()
manager = Manager(app)
Migrate(app, db)
manager.add_command('db', MigrateCommand)# 前台用户
@manager.option('-t', '--telephone', dest='telephone')
@manager.option('-p', '--password', dest='password')
@manager.option('-u', '--username', dest='username')
def create_front_user(telephone, password, username):font_user = FrontUser(telephone=telephone, password=password, username=username)db.session.add(font_user)db.session.commit()if __name__ == '__main__':manager.run()

3、app.py

python">from flask import Flask
from exts import db
from apps.front.views import bp as front_bp
import configdef create_app():app = Flask(__name__)app.config.from_object(config)db.init_app(app)app.register_blueprint(front_bp)return appif __name__ == '__main__':app = create_app()app.run()

二、将ORM映射到数据库中

  1. 初始化迁移文件     python manage.py db init
  2. 将模型的映射添加到文件中  python manage.py db migrate
  3. 将映射文件真正的映射到数据库中 python manage.py db upgrade

三、通过指令创建用户

 python manage.py create_front_user -t '18828361988' -p '12345678' -u '嘻嘻哈哈'

运行结果:

四、前端视图显示

通过访问 http://127.0.0.1:5000/ 链接即可


http://www.ppmy.cn/devtools/116951.html

相关文章

什么是后端开发 ?

后端,亦称“服务器端开发”。同样,在后端服务器和浏览器或应用程序之间存储网站、应用数据和中间媒介的服务器都属于后端。也可以这么说,在应用程序或网站的屏幕上看不到的所有东西都是前端的后端。那么后端开发的基本流程是什么呢&#xff1…

redis 快速入门

目录 数据库的分类 NoSQL 非结构化 认识 redis 特征 安装 redis 单机安装 Docker 安装 redis 的基本配置 启动 redis 关闭 redis redis 开机自启 redis 客户端 redis 数据结构介绍 基本类型 String 的基础操作 List 基本操作 Set基本操作 Sorted Set基本操作…

在 Qt 中实现 `QListWidget` 列表项水平居中显示

文章目录 在 Qt 中实现 QListWidget 列表项水平居中显示引言QListWidget 和 QListWidgetItem水平居中的实现思路核心代码实现主窗口的设置添加列表项并设置文本居中样式表设置 运行效果可能遇到的问题总结参考文献 在 Qt 中实现 QListWidget 列表项水平居中显示 引言 Qt 是一…

http代理池子大小要如何判断?

最近经常刷到关于如何判断HTTP代理池大小的话题,很多朋友对此感到困惑。那么,今天我们就一起来探讨这个问题。 HTTP代理池的基本概念 在我们深入探讨如何判断HTTP代理池大小之前,先来了解一下什么是HTTP代理池。HTTP代理池是由多个HTTP代理…

vue3更具文件目录动态添加路由配置

在项目中,想要在某个文件夹下直接添加.vue文件,并根据文件自动生成route跳转, 在view文件夹下,建立threePage文件夹,在里面建立index.vue,index1.vue; 建立three.js文件, 动态获取…

比较器(算法中排序)

方式一&#xff1a;不常用 让实体类实现Comparable接口&#xff0c;泛型是需要比较的类型&#xff0c;同时重写compareTo方法 缺点&#xff1a;对代码有侵入性。 public class Student implements Comparable<Student> {private String name;private double score;// …

Redis解说

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的高性能键值存储数据库&#xff0c;它通常被用作数据库、缓存和消息代理。 由于其内存中的数据结构存储、持久化选项以及丰富的数据类型支持&#xff0c;Redis 在处理大量数据和高并发请求时表现出色。 Redi…

MVC、MVP和MVVM三种设计模式之间的区别是什么

区别&#xff1a; mvc表示“模型-视图-控制器”&#xff0c;mvp表示“模型-视图-演示者”&#xff0c;mvvm表示“模型-视图-视图模型”&#xff1b; mvp、mvvm都是由mvc衍生出的。mvc中&#xff0c;view会直接从model中读取数据&#xff1b;mvp中&#xff0c;view并不直接使用m…