• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >python > 一个基于flask的web应用诞生 flask和mysql相连(4)

一个基于flask的web应用诞生 flask和mysql相连(4)

作者: 字体:[增加 减小] 来源:互联网

通过本文主要向大家介绍了flask web开发,flask web,flask web开发 pdf,python flask web,web flask 监听内网ip等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

上一章实现了登录的部分功能,之所以说是部分功能,是因为用户名和密码写成固定值肯定是不可以的,一个整体的功能,至少需要注册,登录,密码修改等,这就需要提供一个把这些值存储到数据库的能力。

当前的主流数据库分为两种,即关系数据库和NoSql数据库,对于中小型的系统来说,两种数据库性能,易用性都相当,都是很好的选择。

基础配置

这里使用SQLAlchemy数据库框架的flask集成包,即flask-SQLAlchemy来进行数据库操作。

SQLAlchemy是一个非常好的框架,简化了数据库的操作,即提供了高层次的ORM,也提供了低层次的SQL功能,使用起来非常方便。

安装方式与之前类型,还是pip命令:

pip3.6 install flask-sqlalchemy
</div>

安装完成之后,对default的配置部分进行修改,首先导入包:

from flask.ext.sqlalchemy import SQLAlchemy
</div>

然后配置链接字符串:

app.config["SQLALCHEMY_DATABASE_URI"]='mysql://root:1234@localhost/cblog'
</div>

配置请求结束后更改自动提交:

app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"]=True
</div>

实例化SQLAlchemy:

db=SQLAlchemy(app)
</div>

模型设置

安装完成之后,继续完善登录的例子,修改default.py文件,新增User模型(类)和Role模型(以示关联)

Role类

class Role(db.Model): #需继承模型
 __tablename__="roles" #db中表明,如果不设置,则会与class同的默认名
 id=db.Column(db.Integer,primary_key=True) #SQLAlchemy要求必须有主键,一般命名为id即可
 name=db.Column(db.String(50),unique=True) #表示name为字符串,不重复
 users=db.relationship("User",backref='role') #关联user模型,并在user中添加反向引用(backref)
</div>

User类

class User(db.Model):
 __tablename__="users"
 id=db.Column(db.Integer,primary_key=True)
 username=db.Column(db.String(50),unique=True,index=True) #此列带索引
 password=db.Column(db.String(50))
 role_id=db.Column(db.Integer,db.ForeignKey("roles.id")) #外键指向roles表中的id列
</div>

下面要考虑如何执行,要既方便,有不能入侵到逻辑代码,这就要求不能硬编码到逻辑代码中,比如把判断db状态的代码作为参数传递给app.run(),这时候shell就派上了用场

配置脚本

想让flask支持命令行脚本,首先需要安装flask-script扩展:

pip3.6 install flask-script
</div>

修改default.py的代码:

from flask.ext.script import Manager

mamager=Manager(app)

....

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

</div>

修改过之后,再次运行:

python default.py
</div>

发现并没有成功运行,而是有提示:


可以看到,后边需要参数,分别为shell(执行脚本),runserver(启动服务)和帮助

下边启动服务:

python default.py runserver
</div>

服务成功执行

数据库更多配置

但这个时候,访问站点(127.0.0.1:5000),会出现500错误,提示没有mysql模块,这是为什么呢?很明显是没有安装mysql驱动的原因,使用pip命令安装驱动:

pip3.6 install MySQL-python
</div>

发现出现错误,显示内容为(此处仅为win系统):

根据提示,安装c++的工具包,按照提示上的下载地址

http://landinghub.visualstudio.com/visual-cpp-build-tools

下载完成直接为exe文件,安装

重启后安装MySQL-python,发现还是不可以,经百度后才发现,MySQLdb这个库最高只支持到python2.7,不在支持3.x,那只好用其他办法,使用PyMySQL库:

pip3.6 install PyMySQL
</div>

然后修改default.py的代码,增加两行:

import pymysql
pymysql.install_as_MySQLdb()


</div>

进入源码,注意这一行:

sys.modules["MySQLdb"] = sys.modules["_mysql"] = sys.modules["pymysql"]
</div>

即可成功使用并连接mysql。
浏览器输入连接,正确进入站点。

接下来,使用shell建立数据库表,进入default.py根目录:

python default.py shell
from default import db
db.create_all()
</div>

这时候如果没有报错,那么数据库表应该建立完成:


数据库迁移

那么问题来了,这时候,对模型进行修改,是不会反应到db中的,那么如果修改怎么办呢?对于当前来说,也很简单:

db.drop_all()
db.create_all()
</div>

但这个仅仅是现在调试时候使用,如果db中已经有了数据,则这个肯定是无法忍受的,这时候,就轮到数据库迁移插件Migrate登场了,首先还是一样,需要进行安装:

pip3.6 install flask-migrate
</div>

和之前一样,安装完之后修改default.py文件进行配置:

from flask.ext.migrate import Migrate,MigrateCommand

migrate=Migrate(app,db) #配置迁移
mamager.add_command("db",MigrateCommand) #配置迁移命令

</div>

然后使用init命令初始化迁移仓库

 python default.py db init
</div>

命令行显示:


然后增加migrations目录:

表示迁移文件已经初始化完成。

migrate框架提供了一些命令来进行迁移操作,分别为(使用default.py文件举例):

#根据差异创建迁移
python default.py db migrate -m "说明"
#改动差异 
python default.py db upgrade
#取消差异改动
python default.py db downgrade
</div>

回到表单

接下来看看登录如何与数据库关联起来,修改login方法内的代码:

@app.route("/login",methods=["POST"])
def loginPost():
 username=request.form.get("username","")
 password=request.form.get("password","")
 user=User.query.filter_by(username=username,password=password).first() #数据库查询
 if user is not None:
 session["user"]=username
 return render_template("/index.html",name=username,site_name='myblog')
 else:
 flash("您输入的用户名或密码错误")
 return render_template("/login.html") #返回的仍为登录页
</div>

执行结果非常完美。

一些总结

下面是一些关于python和db相连的总结性的东西

数据类型

列选项

您可能想查找下面的文章:

  • 一个基于flask的web应用诞生 组织结构调整(7)
  • 一个基于flask的web应用诞生 记录用户账户登录状态(6)
  • 一个基于flask的web应用诞生 用户注册功能开发(5)
  • 一个基于flask的web应用诞生 flask和mysql相连(4)
  • 一个基于flask的web应用诞生 bootstrap框架美化(3)
  • 一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
  • 一个基于flask的web应用诞生(1)
  • 一个基于flask的web应用诞生 组织结构调整(7)
  • 一个基于flask的web应用诞生 记录用户账户登录状态(6)

相关文章

  • Python 时间操作例子和时间格式化参数小结
  • Python 获取新浪微博的最新公共微博实例分享
  • 使用python实现rsa算法代码
  • Python基础之函数用法实例详解
  • 学习python的几条建议分享
  • Python实现的数据结构与算法之链表详解
  • Python中使用pprint函数进行格式化输出的教程
  • python追加元素到列表的方法
  • python写的一个文本编辑器
  • Python正则表达式实现截取成对括号的方法

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • python实现倒计时的示例
    • Python中模拟enum枚举类型的5种方法分享
    • python3实现ftp服务功能(客户端)
    • python实现在字符串中查找子字符串的方法
    • 在Python的Django框架上部署ORM库的教程
    • 使用Python的Twisted框架构建非阻塞下载程序的实例教程
    • tensorflow模型继续训练 fineturn实例
    • python实现获取Ip归属地等信息
    • Django学习笔记之Class-Based-View
    • TensorFlow实现打印每一层的输出

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有