- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
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
|
发现并没有成功运行,而是有提示:
可以看到,后边需要参数,分别为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相连的总结性的东西 。
数据类型 。
列选项 。
数据库操作 。
查询过滤器 。
经过这几章,登录功能已经基本完成,在下一章中将讲解用户注册的相关功能.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
最后此篇关于一个基于flask的web应用诞生 flask和mysql相连(4)的文章就讲到这里了,如果你想了解更多关于一个基于flask的web应用诞生 flask和mysql相连(4)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在遵循Flask-potion教程并尝试保护我的api。我一直试图找出如何在User端点上设置权限,以使一个User无法查看另一个User的记录。这是我的代码: class UserResourc
项目设置 Python 3.5.3 flask 0.12.2 目录 . ├── Core │ ├── BackgroundProcessManager.py │ ├── FirebaseDat
我正在构建 flask 应用程序并决定这次尝试应用程序工厂方法,但是遇到了 flask 迁移的麻烦并且无法找出简单的解决方案。 请注意,我想将配置位置作为选项传递给脚本 管理.py: manager
我尝试通过以下示例代码来熟悉Flask-APScheduler插件:https://github.com/viniciuschiele/flask-apscheduler/blob/master/ex
我一周前刚刚了解了 Flask 和 JWT,所以我真的需要一些帮助。有人可以解释一下flask-jwt和flask-jwt-extended之间的区别吗? 最佳答案 Flask-JWT 没有那么多功能
我是 Flask 的新手,我只是想用它创建一个简单的市场。我的网站上有三种类型的用户 [卖家、买家、管理员]。我认为每种类型的用户都应该有自己的注册和登录,因为他们的角色应该提供不同类型的信息。另一方
基本上,我想做一些非常简单的事情:我想创建一个用于删除数据库中条目的表单。 模板正在创建一个包含所有条目的html表,没有任何麻烦。我现在的问题是:如何将其转换为每行都有链接的表单。 当然,我可以通过
我对Flask来说非常陌生,其中一个基本要求是我需要SEO友好的URL。 我说一条路线 @app.route('/sales/') @app.route(/sales/) def get_sales(
一直在为用户管理系统开发Flask-user,但是我看不到自定义登录页面和注册页面的方法。我使用pip安装了flask-user pip install flask-user 任何帮助,将不胜感激 最
我有一个奇怪的情况,不知道如何找到问题。 我已经创建了一个这样的蓝图 reportjobsmod = Blueprint('jobreports', __name__, url_prefix='/jo
我认为在 Flask 中拥有实例变量的正确方法是添加用户和 session ,但我正在尝试测试一个概念,我还不想经历所有这些。我试图让一个网络应用程序将图像加载到一个变量中,然后可以对其执行不同的图像
select = SelectField("City") form.select.choices = [(places['name'], places['name']) for places in p
这个问题在这里已经有了答案: Provide extra information to Flask's app.logger (2 个回答) 3年前关闭。 我正在运行一个 flask 应用程序。我想写
我当时正在编程一个非常不错的api,使用json从游戏服务器到我的网站空间获取一些json数据, 但是每次我使用angular发送请求时,我都会得到以下信息:127.0.0.1--[20 / Mar
我已经开发了一个上传表单,以将特定的.xlsx文件作为上传。要求是要处理非xlsx上载的任何异常(例如zip,exe文件)。我正在使用pyexcel库读取上传内容。我尝试创建以下代码来处理此异常: e
我使用此功能在网站上捕获404错误: @app.errorhandler(404) def page_not_found(e): logger.warning('User raised an
我正在尝试同时使用 Flask Restful 和 Flask SocketIO。我已经制作了一个 Flask Restful 应用程序,但现在我想使用 Flask SocketIO 在客户端和我的服
我有一些 Flask 应用程序,我通过设置 FLASK_APP 来运行它们。环境变量和调用 flask run .自 FLASK_DEBUG也设置了,每当我更改一些代码时,应用程序都可以方便地重新加载
我目前正在使用 Flask 构建一个应用程序。我正在努力访问 Flask 实例“app”以及 Flask-mail 实例“mail”。 下面是我的项目的样子: └── my-project ├
Remember-me是 parameter flask_login.login_user(user, remember=False, duration=None, force=False, fres
我是一名优秀的程序员,十分优秀!