flask学习(1)- 创建flask项目和模型

一、 pycharm创建flask项目    

        分为三步:

        第一步   创建flask项目。

        第二步   flask和模型(数据库)关联

        第三步   执行数据迁移命令   

1.1修改其文件

         项目中新建flask_1文件夹,将static和templates文件夹剪切进flask_1文件夹 

        创建 __init__.py文件。
        创建 models.py 文件,用来放模型(数据库)。
        创建 views.py文件,用来存放路由 + 视图函数。
        创建 exts.py文件,用在存放flask插件。

1.2 创建flask相关

        __init__.py导入flask和views.py文件。

# __init__.py


from flask import Flask
from .views import *

app = Flask(__name__)

        views.py

# views.py

@app.route('/')
def hello_world():  # put application's code here
    return 'Hello World!'

        一个项目中可能会有多flask项目,flask_1项目与外部app.py产生联系,__init__py改写为,这样每次调用flask_1包都会返回一个app。

# __init__py

from flask import Flask
from .views import *

def create_app():
    app = Flask(__name__)
    return app

        app.py调用flask包。

# app.py


from flask_1 import create_app

app = create_app()


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

        但是Flask是外部 app.py调用flask_1包中的__init__.py实现的,所以 views.py 中的使用的路由和视图函数想要采用就得调用app.py或者__init__.py的数据,但是这会产生互相引用的错误。

        为了解决上面的问题我们采用蓝图来解决上面的问题,修改views.py 的文件的内容,创建蓝图。

# views.py 

from flask import Blueprint

blue = Blueprint('user', __name__)


@blue.route('/')
def hello_world():  # put application's code here
    return 'Hello World!'

        修改__init__.py内容,注册蓝图,当然可以创建很多个蓝图,注册很多个蓝图:

# __init__.py


from flask import Flask
from .views import *

def create_app():
    app = Flask(__name__)
    app.register_blueprint(blueprint = blue)
    return app

二、开始建立与模型(数据库)相关

        数据库相关的有两个文件,models.py用来存放模型和exts.py文件用来存放flask插件,

        修改exts.py文件,为了flask插件和app实例绑定,创建init_ext函数,__init__.py在创建app实例(app.py在调用flask_1包创建app实例)的时候 直接调用此函数绑定。

# exts.py


from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

db = SQLAlchemy()   # 数据库对象 ORM映射
migrate = Migrate()  # 数据库迁移 


def init_ext(app):    # 函数作用与app实例绑定
    db.init_app(app)
    migrate.init_app(app, db)

        models.py 先采用Sqlite数据库

# models.py 模型 数据库

from .exts import db


# 模型      ==>    数据库
# 类        ==>    表结构
# 类属性     ==>    表字段
# 一个对象   ==>    表的一行记录


# 模型 Model 类
# SQLAlchemy 让类变成模型
# Migrate 让模型变成表

class User(db.Model):  # 必须继承自db.Model
    # 表名
    __tablename__ = 'tb_user'
    # 字段id
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(50), unique=True, index=True, nullable=False)
    age = db.Column(db.Integer, default=1)
    sex = db.Column(db.Boolean, default=True)
    salary = db.Column(db.Float, default=10000.0, nullable=True)

 记得在views.py中下面的代码。

from .models import *

 __init__.py文件通过 exts.py 文件中 init_ext 函数与 models.py 中的模型(数据库)产生关联。

# __init__.py


from flask import Flask
from .views import *
from .exts import init_ext

def create_app():
    app = Flask(__name__)
    app.register_blueprint(blueprint = blue)
    db_uri = 'sqlite:///sqlite_1.db'
    app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    init_ext(app)
    return app

三、执行数据迁移

        先在cmd 或者terminal进入项目目录(app.py所在目录)

        flask  db  init                # 创建迁移文件夹 migrates ,只调用一次

        flask  db  migrate         # 生成迁移文件

        flask  db upgrade         #  执行迁移文件中的升级

        flask  db downgrade     # 执行迁移文件中的降级

鼠标把数据库拖过去

成功

四、完整代码

app.py文件:

from flask_1 import create_app

app = create_app()


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

__init__.py

from flask import Flask
from .views import *
from .exts import init_ext

def create_app():
    app = Flask(__name__)
    app.register_blueprint(blueprint = blue)
    db_uri = 'sqlite:///sqlite_1.db'
    app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    init_ext(app)
    return app

views.py存放插件

# 用来存放flask 插件
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

db = SQLAlchemy()   # 数据库对象
migrate = Migrate()  # 数据库迁移


def init_ext(app):
    db.init_app(app)
    migrate.init_app(app, db)

models.py存放模型

# 用来存放模型类
# models.py 模型 数据库

from .exts import db


# 模型      ==>    数据库
# 类        ==>    表结构
# 类属性     ==>    表字段
# 一个对象   ==>    表的一行记录


# 模型 Model 类
# SQLAlchemy 让类变成模型
# Migrate 让模型变成表

class User(db.Model):  # 必须继承自db.Model
    # 表名
    __tablename__ = 'tb_user'
    # 字段id
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(50), unique=True, index=True, nullable=False)
    age = db.Column(db.Integer, default=1)
    sex = db.Column(db.Boolean, default=True)
    salary = db.Column(db.Float, default=10000.0, nullable=True)

views.py 存放路由 + 视图函数

# 用来存放 路由 + 视图函数
from flask import Blueprint
from .models import *
blue = Blueprint('user', __name__)


@blue.route('/')
def hello_world():  # put application's code here
    return 'Hello World!'

flask刚刚入门,以上是为了创建flask项目和模型 理清头绪。
学习视频是:千锋教育Flask2框架从入门到精通,Python全栈开发必备教程_哔哩哔哩_bilibili

  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现个人中心功能,可以使用 Flask Web 框架和 Flask 拓展,如 Flask-Login、Flask-WTF、Flask-SQLAlchemy 等。 以下是一个简单的示例: 安装 FlaskFlask 拓展: ``` pip install Flask Flask-Login Flask-WTF Flask-SQLAlchemy ``` 创建 Flask 应用: ```python from flask import Flask, render_template from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField from wtforms.validators import DataRequired, Email, EqualTo from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SECRET_KEY'] = 'your secret key' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) login_manager = LoginManager(app) login_manager.login_view = 'login' class User(UserMixin, db.Model): id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(120), unique=True) password = db.Column(db.String(120)) @login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id)) class LoginForm(FlaskForm): email = StringField('Email', validators=[DataRequired(), Email()]) password = PasswordField('Password', validators=[DataRequired()]) submit = SubmitField('Login') class RegisterForm(FlaskForm): email = StringField('Email', validators=[DataRequired(), Email()]) password = PasswordField('Password', validators=[DataRequired(), EqualTo('confirm_password', message='Passwords must match')]) confirm_password = PasswordField('Confirm Password', validators=[DataRequired()]) submit = SubmitField('Register') @app.route('/') def index(): return render_template('index.html') @app.route('/login', methods=['GET', 'POST']) def login(): form = LoginForm() if form.validate_on_submit(): user = User.query.filter_by(email=form.email.data).first() if user and user.password == form.password.data: login_user(user) return redirect(url_for('profile')) else: flash('Invalid email or password') return render_template('login.html', form=form) @app.route('/register', methods=['GET', 'POST']) def register(): form = RegisterForm() if form.validate_on_submit(): user = User(email=form.email.data, password=form.password.data) db.session.add(user) db.session.commit() flash('Account created! You can now log in.') return redirect(url_for('login')) return render_template('register.html', form=form) @app.route('/profile') @login_required def profile(): return render_template('profile.html', user=current_user) @app.route('/logout') @login_required def logout(): logout_user() return redirect(url_for('index')) if __name__ == '__main__': db.create_all() app.run(debug=True) ``` 在上面的代码中,我们创建了一个名为 `User` 的模型来存储用户信息,使用 Flask-Login 来处理用户认证和会话,并使用 Flask-WTF 来创建表单。我们还使用 Flask-SQLAlchemy 来处理数据库操作。在 `index` 视图函数中,我们渲染了一个简单的主页。在 `login` 和 `register` 视图函数中,我们创建了登录和注册表单,并实现了相应的逻辑。在 `profile` 视图函数中,我们渲染了用户的个人资料页面,并使用 Flask-Login 的 `login_required` 装饰器来确保用户已经登录。在 `logout` 视图函数中,我们注销当前用户并重定向到主页。 最后,我们使用 `if __name__ == '__main__'` 来运行应用,并在启动应用时创建数据库表。 以上是一个简单的示例,可以根据实际需求进行修改和拓展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值