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

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

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

基础配置

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

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

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

pip3.6 install flask-sqlalchemy

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

from flask.ext.sqlalchemy import SQLAlchemy

然后配置链接字符串:

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

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

app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"]=True

实例化SQLAlchemy:

db=SQLAlchemy(app)

模型设置

安装完成之后,继续完善登录的例子,修改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)

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列

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

配置脚本

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

pip3.6 install flask-script

修改default.py的代码:

from flask.ext.script import Manager

mamager=Manager(app)

....

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

修改过之后,再次运行:

python default.py

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

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

下边启动服务:

python default.py runserver

服务成功执行

数据库更多配置

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

pip3.6 install MySQL-python

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

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

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

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

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

pip3.6 install PyMySQL

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

import pymysql
pymysql.install_as_MySQLdb()

进入源码,注意这一行:

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

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

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

python default.py shell
from default import db
db.create_all()

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

数据库迁移

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

db.drop_all()
db.create_all()

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

pip3.6 install flask-migrate

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

from flask.ext.migrate import Migrate,MigrateCommand

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

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

 python default.py db init

命令行显示:

然后增加migrations目录:

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

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

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

回到表单

接下来看看登录如何与数据库关联起来,修改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") #返回的仍为登录页

执行结果非常完美。

一些总结

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

数据类型

列选项

数据库操作

查询过滤器

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

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

(0)

相关推荐

  • Flask SQLAlchemy一对一,一对多的使用方法实践

    Flask-SQLAlchemy安装和建表操作请参考这里. 复制代码 代码如下: # Role表class Role(db.Model):    id=db.Column(db.Integer,primary_key=True)    name=db.Column(db.String(80)) # RoleType表class Role_type(db.Model):    query_class=Common_list_name_Query    id=db.Column(db.Integer

  • Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程

    使用Flask-SQLAlchemy管理数据库 Flask-SQLAlchemy是一个Flask扩展,它简化了在Flask应用程序中对SQLAlchemy的使用.SQLAlchemy是一个强大的关系数据库框架,支持一些数据库后端.提供高级的ORM和底层访问数据库的本地SQL功能. 和其他扩展一样,通过pip安装Flask-SQLAlchemy: (venv) $ pip install flask-sqlalchemy 在Flask-SQLAlchemy,数据库被指定为URL.表格列出三个最受欢

  • 在Python的Flask框架下使用sqlalchemy库的简单教程

    flask中的sqlalchemy 相比于sqlalchemy封装的更加彻底一些 , 在一些方法上更简单 首先import类库: 在CODE上查看代码片派生到我的代码片 <span style="font-size:18px;">from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy</span> 然后,需要加载 数据库路径 在CODE上查看代码片派生到我的代码片 <span

  • Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程

    我们在升级系统的时候,经常碰到需要更新服务器端数据结构等操作,之前的方式是通过手工编写alter sql脚本处理,经常会发现遗漏,导致程序发布到服务器上后无法正常使用. 现在我们可以使用Flask-Migrate插件来解决之,Flask-Migrate插件是基于Alembic,Alembic是由大名鼎鼎的SQLAlchemy作者开发数据迁移工具. 具体操作如下: 1. 安装Flask-Migrate插件 $ pip install Flask-Migrate 2. 修改Flask App部分的代

  • Python的Flask框架与数据库连接的教程

     命令行方式运行Python脚本 在这个章节中,我们将写一些简单的数据库管理脚本.在此之前让我们来复习一下如何通过命令行方式执行Python脚本. 如果Linux 或者OS X的操作系统,需要有执行脚本的权限.例如: chmod a+x script.py 该脚本有个指向使用解释器的命令行.再脚本赋予执行权限后就可以通过命令行执行,就像这样: like this: ./script.py <arguments> 然而,在Windows系统上这样做是不行的,你必须提供Python解释器作为必选参

  • flask中使用SQLAlchemy进行辅助开发的代码

    安装方法 1).apt-ge安装 复制代码 代码如下: sudo apt-get install Flask-SQLAlchemy 2).下载安装包进行安装 复制代码 代码如下: # 安装后可直接在py中使用import flaskfrom flask.ext.sqlalchemy import SQLAlchemy app = flask.Flask(__name__)# - Settings里配置了SqlAlchemy的数据库地址# sqlite ex: "sqlite:///dbname.

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

    上一章实现了登录的部分功能,之所以说是部分功能,是因为用户名和密码写成固定值肯定是不可以的,一个整体的功能,至少需要注册,登录,密码修改等,这就需要提供一个把这些值存储到数据库的能力. 当前的主流数据库分为两种,即关系数据库和NoSql数据库,对于中小型的系统来说,两种数据库性能,易用性都相当,都是很好的选择. 基础配置 这里使用SQLAlchemy数据库框架的flask集成包,即flask-SQLAlchemy来进行数据库操作. SQLAlchemy是一个非常好的框架,简化了数据库的操作,即提

  • 教你快速构建一个基于nginx的web集群项目

    目录 一 ·项目环境 二· 项目描述 三· 项目步骤 1.安装 2.配置 3.实现负载均衡 4.搭建服务器 5.压力测试 6.监控 7.高可用 8.域名解析 9.提升性能 10.使用ansible编写playbook 四· 项目总结 五·搭建WEB注意 一 ·项目环境 centos7/8服务器8台.nginx 1.21.1.ab.nfs4. zabbix.keepalived 2.1.5 .ansible,bind 二· 项目描述 构建一个基于nginx的4/7层负载均衡的web集群项目 模拟企

  • 一个基于flask的web应用诞生(1)

    基于flask的web应用的诞生,供大家参考,具体内容如下 Flask是一个非常优秀的web框架,它最大的特点就是保持一个简单而易于扩展的小核心,其他的都有用户自己掌握,并且方便替换,甚至,你可以在社区看到众多开源的,可直接用于生产环境下的扩展.到目前为止,我相信关于他的介绍以及非常的多,就算cnblog中,随便一搜也会有很多内容,但还是抛砖引玉,就当是一个自我的总结 部署环境 安装python 首先,当然是安装python环境,去官网来下载最新的环境(我选择最新的3.6版本) 然后一路下一步即

  • 一个基于flask的web应用诞生 bootstrap框架美化(3)

    经过上一章的内容,其实就页面层来说已结可以很轻松的实现功能了,但是很明显美观上还有很大的欠缺,现在有一些很好的前端css框架,如AmazeUI,腾讯的WeUI等等,这里推荐一个和flask集成很好的bootstrap框架 安装框架 在模板中直接引用bootstrap的CDN或者本地路径外,还可以直接应用flask的bootstrap集成包,首先需要对集成包进行安装: pip3.6 install flask-bootstrap 这是一个flask的扩展包,flask的所有扩展包默认默认的包名都为

  • 一个基于flask的web应用诞生 记录用户账户登录状态(6)

    之前登录注册的功能都已经完成,但是登录成功回到首页发现还是白茫茫的一片,对的,title一直都写得博客,那么最终目的也是写出一个轻博客来,但是,在发表文章之前是不是要先记录一下登录状态呢? 用户登录 登录状态的记录方式有很多种,首先想到的应该就是使用flask自带的session,但flask还提供了一种更方便的扩展,即flask-login包,使用方式还和之前一样,首先需要安装: pip3.6 install flask-login 然后在default.py中进行初始化: from flas

  • 一个基于flask的web应用诞生 组织结构调整(7)

    现在所有的Py代码均写在default.py文件中,很明显这种方法下,一旦程序变的负责,那么无论对于开发和维护来说,都会带来很多问题. Flask框架并不强制要求项目使用特定的组织结构,所以这里使用的组织结构并不一定与其它项目中相同. 根据default.py中的代码,大体可分为三类:表单模型,数据模型,视图方法,所以模型也网这类中来区分.所以按照其他语言(java)得来的经验,每个类为一个py文件,放到相应的文件夹中 在单个文件中,所有的配置都写在单个的文件里,而在进行多文件重构之后,还这样做

  • 一个基于flask的web应用诞生 用户注册功能开发(5)

    下面把角色分为两种,普通用户和管理员用户,至少对于普通用户来说,直接修改DB是不可取的,要有用户注册的功能,下面就开始进行用户注册的开发. 用户表 首先要想好用户注册的时候需要提供什么信息:用户名.密码.昵称.邮箱.生日.性别.自我介绍,下面就按照这些信息修改用户模型: class User(db.Model): __tablename__="users" id=db.Column(db.Integer,primary_key=True) username=db.Column(db.S

  • 一个基于flask的web应用诞生 使用模板引擎和表单插件(2)

    经过了第一章的内容,已经可以做出一些简单的页面,首先用这种方式做一个登录页面,首先要创建一个login的路由方法: @app.route("/login",methods=["GET"]) def login(): html="<form method='post'>" \ "<table>" \ "<tr><td>请输入用户名</td><td>

  • Flask框架web开发之零基础入门

    Flask框架是Python开发的一个基于Werkzeug和Jinja 2的web开发微框架,它的优势就是极其简洁, 但又非常灵活,而且容易学习和应用.因此Flask框架是Python新手快速开始web开发最好的选择,此外, 使用Flask框架的另一个好处在于你可以非常轻松地将基于Python的机器学习算法或数据分析算法集成到 web应用中. 1.可以用Flask框架做什么 从博客应用到克隆一个facebook或者twitter,理论上你可以用Flask做任何事情.有很多库 可以直接使用,例如f

  • python flask搭建web应用教程

    python flask搭建web应用教程 1.flask介绍 2.所需工具和环境 3.搭建flaskApp 4.具体程序编写 5.综上 1.flask介绍 flask是一款十分轻量级的python Web应用框架,也被认为是一种微框架,我最初喜欢使用是因为flask中提供的那一套使用的注解跟我当时在公司中使用java开发的系统,里面使用的restful的框架jersey的用法比较像,都十分方便,简洁,等到我熟悉使用flask框架之后,就挺喜欢这种微框架了,使用方便,配置简单,也可以进行克重扩展

随机推荐