2021-09-12 从虚拟环境到MYSQL 映射绑定配置

在123目录下再创建虚拟环境123

c:/123
virtualenv 123

安装FLASK 1.1.2

pip install flask==1.1.2

安装pymysql 1.0.2

pip install pymysql

安装flask-script

pip install flask-script

安装flask-sqlalchemy

pip install flask-sqlalchemy

安装 flask-migrate 注意使用版本2.5.3 否则没有MigrateCommand命令

pip install flask-migrate==2.5.3

如果遇到不兼容的情况可以进行以下尝试(有可能轻易解决问题也有可能引发其他问题):

pip install --upgrade Flask Jinja2 markupsafe
pip install --upgrade Flask-SQLAlchemy sqlalchemy

在pycharm里建立FLASK项目,使用虚拟环境123

项目根目录下建立配置setting.py文件内容写,这里要看好数据库的配置,尤其注意数据库必须单独终端创建,名字要和配置一直。

class Config(object):
    DEBUG=1
    SQLALCHEMY_DATABASE_URI='mysql+pymysql://root:password@127.0.0.1:3306/mysql01'
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    EVN='development'

在项目根建立两个包

  1. apps
  2. exts

下面是配置工厂函数:

apps.__init__.py中写入工厂配置函数
from setting import Config

def create_app(app):

    app.config.from_object(Config)

    return  app

主函数app.py当前引入工厂函数状态

from flask import Flask
from apps import create_app
app = Flask(__name__)
app = create_app(app)#app传出去再收回来保证app位置不变

@app.route('/')
def hello_world():
    return 'Hello World!'


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

然后主函数中添加

from flask_script import Manager
manager =Manager(app=app)
*****注意 flask_migrate 里边也有 Manager 命令也可以引用,甚至用法也一样,我在写错的情况下用 migrate里的同名命令也部署过网站还用了一段时间才发现,为了避免未来出现未知问题我主动改回script的Manager了

然后修改

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

启动函数app.run() 修改为manager.run()

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

以上则构建好了 flask_script 部分,实现了命令行执行Python内部函数的功能。*

下面是flask-sqlalchemy

在exts.init.py 中写入

from flask_sqlalchemy import SQLAlchemy
db =SQLAlchemy()

下一步,把DB配置进工厂函数

from setting import Config
from exts import db #  这个DB是SQLAlchemy 制造的

def create_app(app):

    app.config.from_object(Config)
    db.init_app(app)  # 这个是 SQLAlchemy 提供的绑定方法
    return  app

这部分注意flask_sqlalchemy在setting 里边有一些环境配置信息是属于他的。

最后,flask-migrate部分 app.py中导入

from flask_migrate import Migrate ,MigrateCommand    #最后一个绑定的
from exts import db                  # db 导入

然后 migrate绑定

migrate = Migrate(app=app,db=db)
manager.add_command('db',MigrateCommand)

至此主链路搭建完毕,程序现在只能在命令行启动,此地有个注意事项,就是不能脱离虚拟环境运行,否则会找不到包。

下面是使用,首先创建用户类

  1. 在apps 目录下创建user包,并在包里新建models.py 文件

该文件内部写入模型类

from exts import db
from datetime import datetime
class User(db.Model):# 这里看好 db的加载不是他自己要带个方法
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    username = db.Column(db.String(15),nullable=False)
    password = db.Column(db.String(12),nullable=False)
    phone = db.Column(db.String(1),unique=True)#这个unique表示唯一的
    rdatetime =db.Column(db.DateTime,default=datetime.now) #注意日期函数now后面没括号
    def __str__(self):# 这个方法必须要有返回名字的
        return self.username

模型建立完毕下面要千万注意

要在主函数里边引入这个模型

也就是 app.py里边引入

from apps.user.models import User  # 这一行必须有

入口app.py 现在是

from flask import Flask
from flask_script import Manager
from apps import create_app
from flask_migrate import Migrate ,MigrateCommand    #最后一个绑定的
from exts import db                  # db 导入
from apps.user.models import User  # 这一行必须有
app = Flask(__name__)
app = create_app(app)

manager =Manager(app=app) #命令行相关
migrate = Migrate(app=app,db=db)
manager.add_command('db',MigrateCommand)
@app.route('/')
def hello_world():
    return 'Hello World!'


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

整体完毕后在虚拟环境中执行

  1. 本地建立一套目录和文件
Python app.py db init  
  1. 在本地目录中添加文件
python setting.py db migrate

此处注意,这个命令会连接数据库如果数据库没有指定的名称的数据库存在就会报错,一定要预先建立好要连接的数据库。

  1. 执行同步指令
python setting.py db upgrade

db内部命令如下

 init                Creates a new migration repository
    revision            Create a new revision file.
    migrate             Alias for 'revision --autogenerate'
    edit                Edit current revision.
    merge               Merge two revisions together. Creates a new migration
                        file
    upgrade             Upgrade to a later version
    downgrade           Revert to a previous version
    show                Show the revision denoted by the given symbol.
    history             List changeset scripts in chronological order.
    heads               Show current available heads in the script directory
    branches            Show current branch points
    current             Display the current revision for each database.
    stamp               'stamp' the revision table with the given revision;
                        don't run any migrations

至此实现了联通并在指定数据库中建立了一个叫user的表。

补充如果数据库模型类有更新则依次执行

python setting.py db migrate
python setting.py db upgrade

来更新模型

之前的部分配置了服务器与MYSQL数据库的映射,这里继续做视图–数据的添加部分涉及到HTML表单和模板的使用。

  1. 创建文件 apps.user.view.py 这个作为路由视图部分,用蓝图绑定
    先从flask 模块中引入Blueprint
    然后绑定并命名user_bp
from flask import Blueprint
user_bp = Blueprint('user',__name__)#这个'user'~~是url_for函数寻找的用户名。

然后构建注册路由

@user_bp.route('/register',methods=['GET','POST'])
def register():
    return 'Hello World!'

再将蓝图进行注册,在apps.ini.py中
加入app.register_blueprint(user_bp)
文件整体是下面这样,记得不要忘记引用user_bp

from setting import Config
from exts import db #  这个DB是SQLAlchemy 制造的
from apps.user.view import user_bp # 引入蓝图的声明
def create_app(app):
    app.register_blueprint(user_bp)#视图蓝图注册
    app.config.from_object(Config)#环境配置
    db.init_app(app)  # 这个是 SQLAlchemy 提供的绑定方法
    return  app
  1. 构建register.html文件, 位置templates.user.register.html
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>用户注册</title>
</head>
<body>
<h1>用户注册</h1>

<form action="{{ url_for('user.register') }}" method="POST">
    <p><input type="text" name="username" placeholder="用户名"></p>

    <p><input type="text" name="password" placeholder="密码"></p>

    <p><input type="text" name="repassword" placeholder="重新输入密码"></p>

    <p><input type="text" name="phone" placeholder="电话号码"></p>

   <p><input type="submit" value="提交"></p>
</form>
</body>
</html>

这里是蓝图的程序

from flask import Blueprint                           # 蓝图
from flask import request,render_template#
from apps.user.models import User# 引入模型
user_bp = Blueprint('user',__name__)                  #'user'这个是模块命名
from exts import db #引入DB
@user_bp.route('/register',methods=['GET','POST'])   #两个方法进入
def register():
    if request.method== 'POST':#区分大小写,POST必须大写

        username=request.form.get('username')
        password=request.form.get('password')
        repassword=request.form.get('repassword')
        phone=request.form.get('phone')
        if password==repassword:#验证
            user1=User()               # 重要的在这里~~~~把模型类加个括号赋值给user1
            user1.username=username    # 然后直接给类里边的属性赋值
            user1.password=password    # 赋值的时候记得要查阅数据库建表时的规则
            user1.phone=phone          # 比如这个phone 最多只能11个数字而且不能重复输入,否则报错
            db.session.add(user1)      # 把user1加入缓存
            
            db.session.commit()        # 刷进数据库
            return '注册成功'
        else:
            return 'nonono'

    return render_template('user/register.html')

然后启动服务器 python mysql.py runserver

远程服务器则 python mysql.py runserver -h 0.0.0.0 -p 5001

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值