gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章一个基于flask的web应用诞生 flask和mysql相连(4)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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

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

基础配置 。

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

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

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

?
1
pip3. 6 install flask - sqlalchemy

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

?
1
from flask.ext.sqlalchemy import SQLAlchemy

然后配置链接字符串:

?
1
app.config[ "SQLALCHEMY_DATABASE_URI" ] = 'mysql://root:1234@localhost/cblog'

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

?
1
app.config[ "SQLALCHEMY_COMMIT_ON_TEARDOWN" ] = True

实例化SQLAlchemy:

?
1
db = SQLAlchemy(app)

模型设置 。

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

Role类 。

?
1
2
3
4
5
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)

User类 。

?
1
2
3
4
5
6
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列

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

配置脚本 。

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

?
1
pip3. 6 install flask - script

修改default.py的代码:

?
1
2
3
4
5
6
7
8
9
from flask.ext.script import Manager
 
mamager = Manager(app)
 
....
 
if __name__ = = '__main__' :
  #app.run(debug=True)
  mamager.run()

修改过之后,再次运行:

?
1
python default.py

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

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

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

下边启动服务:

?
1
python default.py runserver

服务成功执行 。

数据库更多配置 。

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

?
1
pip3. 6 install MySQL - python

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

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

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

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

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

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

?
1
pip3. 6 install PyMySQL

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

?
1
2
import pymysql
pymysql.install_as_MySQLdb()

进入源码,注意这一行:

?
1
sys.modules[ "MySQLdb" ] = sys.modules[ "_mysql" ] = sys.modules[ "pymysql" ]

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

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

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

?
1
2
3
python default.py shell
from default import db
db.create_all()

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

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

数据库迁移 。

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

?
1
2
db.drop_all()
db.create_all()

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

?
1
pip3. 6 install flask - migrate

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

?
1
2
3
4
from flask.ext.migrate import Migrate,MigrateCommand
 
migrate = Migrate(app,db) #配置迁移
mamager.add_command( "db" ,MigrateCommand) #配置迁移命令

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

?
1
python default.py db init

命令行显示:

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

然后增加migrations目录:

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

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

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

?
1
2
3
4
5
6
#根据差异创建迁移
python default.py db migrate - m "说明"
#改动差异
python default.py db upgrade
#取消差异改动
python default.py db downgrade

回到表单 。

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

?
1
2
3
4
5
6
7
8
9
10
11
@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" ) #返回的仍为登录页

执行结果非常完美.

一些总结 。

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

数据类型 。

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

列选项 。

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

数据库操作 。

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

查询过滤器 。

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

经过这几章,登录功能已经基本完成,在下一章中将讲解用户注册的相关功能.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.

最后此篇关于一个基于flask的web应用诞生 flask和mysql相连(4)的文章就讲到这里了,如果你想了解更多关于一个基于flask的web应用诞生 flask和mysql相连(4)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com