上一章实现了登录的部分功能,之所以说是部分功能,是因为用户名和密码写成固定值肯定是不可以的,一个整体的功能,至少需要注册,登录,密码修改等,这就需要提供一个把这些值存储到数据库的能力。
当前的主流数据库分为两种,即关系数据库和NoSql数据库,对于中小型的系统来说,两种数据库性能,易用性都相当,都是很好的选择。
基础配置
这里使用SQLAlchemy数据库框架的flask集成包,即flask-SQLAlchemy来进行数据库操作。
SQLAlchemy是一个非常好的框架,简化了数据库的操作,即提供了高层次的ORM,也提供了低层次的SQL功能,使用起来非常方便。
安装方式与之前类型,还是pip命令:
1
|
pip3. 6 install flask - sqlalchemy |
安装完成之后,对default的配置部分进行修改,首先导入包:
1
|
from flask.ext.sqlalchemy import SQLAlchemy |
然后配置链接字符串:
1
|
|
配置请求结束后更改自动提交:
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 |
发现并没有成功运行,而是有提示:
可以看到,后边需要参数,分别为shell(执行脚本),runserver(启动服务)和帮助
下边启动服务:
1
|
python default.py runserver |
服务成功执行
数据库更多配置
但这个时候,访问站点(127.0.0.1:5000),会出现500错误,提示没有mysql模块,这是为什么呢?很明显是没有安装mysql驱动的原因,使用pip命令安装驱动:
1
|
pip3. 6 install MySQL - python |
发现出现错误,显示内容为(此处仅为win系统):
根据提示,安装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。
浏览器输入连接,正确进入站点。
接下来,使用shell建立数据库表,进入default.py根目录:
1
2
3
|
python default.py shell from default import db db.create_all() |
这时候如果没有报错,那么数据库表应该建立完成:
数据库迁移
那么问题来了,这时候,对模型进行修改,是不会反应到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 |
命令行显示:
然后增加migrations目录:
表示迁移文件已经初始化完成。
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相连的总结性的东西
数据类型
列选项
数据库操作
查询过滤器
经过这几章,登录功能已经基本完成,在下一章中将讲解用户注册的相关功能。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。