flask是一个很精简,灵活的框架,对于web的开发非常的好,具有jinja2强大的模板引擎的支持,对于web的开发,非常的好,今天就来说说flask框架的一个扩展就是我们的sqlalchemy,它有什么有有点了,为何要使用它,mysql mongodb等等数据库都可以啊,为何要使用sqlalchemy这个扩展了,主要有以下几个有点.在这里,什么是关系型数据库,什么是非关系型数据库,这里就不多做介绍了。主要看看sqlalchemy这个扩展的有点。
sqlalcheny是flask的一个扩展。是一个强大的关系型数据库框架,这里要注意的就是它是一个框架,并不是我们的数据库。既然他不是一个数据库,为何能够实现对数据库的操作了。我们知道关系型数据库的操作要写一些比较繁琐的sql语句,也就是我们的机构化语句,那么它是如何实现的了,其实在这就得益于我们的ORM技术,将繁琐的数据库操作转化为我们的python的类,在底存,其实还是转化为sql语句来操作数据库,这就是他的强大的地方,同时特提供了数据库原生的SQL底存功能。总的一句话:它提供了高层 ORM,也提供了使用数据库原生 SQL 的低层功能。这点做的非常的好,我们就可以不用记住sql的命令,直接操作数据库。该框架是flask的一个扩展。
flask-sqlalchemy
这是SQLAlchemy在flask框架下的拓展。SQLAlchemy是一个Python下的SQL和对象关系映射(ORM)的一个工具。使用它能够轻松将sql语句转换为对象操作,高效而有效。
pymysql(python3使用)
这是一个python连接MySQL的扩展。添加这个扩展可以轻松的为SQLAlchemy连接MySQL数据库。
连接数据库
在config.py中添加数据库相关信息
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:@localhost:3306/mis_db?charset=utf8' SQLALCHEMY_TRACK_MODIFICATIONS = False
引入SQLAlchemy拓展并设置db对象
#导入SQLAlchemy拓展,方便对MYSQL操作
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__) app.config.from_object(config) db.init_app(app)
class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(20), nullable=False) nickname = db.Column(db.String(20), nullable=False) userphone = db.Column(db.String(20), nullable=False) _password = db.Column(db.String(200), nullable=False)#内部使用
@app.route('/') def test(): context = { 'question': Question.query.order_by('-creat_time').all() } return render_template('test1.html', **context)
调试模式
run() 方法可以方便地启动一个本地开发服务器,每次修改应用之后都需要手动重启服务器。如果想要每次修改应用之后,服务器能够自动重启,那么可以打开调试模式。并且当应用出错时还会提供一个有用的调试器。
方法是将app.run()改为app.run(debug=True)
现在我们把app应用进行一下调整,让它出错,这样在执行的时候,就会自动调出调试器
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__) app.config.from_object(config) db.init_app(app)
@app.route('/')
def test():
context = {
'question': Question.query.order_by('-creat_time').all()
}
return render_template('test1.html', **context)
if __name__ == '__main__': app.run(debug=True)
页面呈现
首先是对模板的介绍,jinja2模板渲染有着很强大的功能,可以帮助我们实现动态,继承的需求.通过传入参数,我们可以直接动态的为模板绑定变量.通过继承,可以大大的减少所需要的Html的代码量.并且更好的组织结构.对于继承,jinjia2模板采用的是{%block %}content{%endfor%}的模式来实现的,我们可以在模板里面添加或者重置我们需要的东西.如果需要添加,就应该用{{super()}}的形式,先添加爱base模板的内容.
由于对表单进行样式的设置是一件比较枯燥的事情,所以我们可以选择flask-bootstrap这个轻量级的flask扩展,它是对botstrap进行了flask的包装,利用它,我们可以直接用bootstarp的样式表设置表单.这样又节省了很多的时间.同时bootstrap官方还有很多例子,这些例子都是可以直接复制下来就用的.很容易学习模仿.同时bootstrap还提供了很多对表单的验证函数.像对email的验证之类的.我们的例子就是在bootstrap的base.html的基础上进行继承的.
在响应表单的时候,采取了重定向的技术,让刷新的的最后一个请求不是POST而是GET.
DOCTYPE html>
<html lang="en">
<head>
{% extends 'test1.html' %}
<meta charset="UTF-8">
<title>{% block title %}
首页
{% endblock %}title>
{% block head %}
<link rel="stylesheet" href="{{ url_for('static',filename='css/admin.css') }}">
{% endblock %}
head>
<body>
{% block body %}
<p>{{ user }}contextp>
<div class="col-md-4 column">
<ul>
{% for foo in question %}
<div class="wai">
<li class="have-img">
<div class="content">
<div class="author">
<a class="avatar" target="_blank" href="/u/deeea9e09cbc">
<img class="img"
src="//upload.jianshu.io/users/upload_avatars/1442902/b54c023e8862.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/64/h/64"
alt="64">
a>
<a href="{{ url_for('usercenter',user_id = foo.author_id,tag=1) }}">{{ foo.author.username }}a>
<span class="badge">{{ foo.creat_time }}span>
div>
<a style="font-size: 20px" class="stitle" target="_blank"
href="{{ url_for('detail',question_id=foo.id) }}">{{ foo.title }}a>
<p class="abstract">
{{ foo.detail }}p>
<div class="meta">
<a class="collection-tag" target="_blank" href="/c/1hjajt">{{ biaoqian }}a>
<a href="{{ url_for('usercenter',user_id = foo.author_id,tag = 1) }}">{{ foo.author.username }}评论:({{ foo.comment|length}})a>
div>
div>
li>
div>
{% endfor %}
ul>
div>
{% endblock %}
body>
html>
总结:
自从跟着老师学习了flask框架后,感觉计算机语言还是有一点乐趣的,不至于非常枯燥无味的,看着自己设计的页面,虽然还是很不规范,但是当看到它能运行并呈现在电脑的屏幕上,心情是无比的雀跃,也因此增加了自信,也深深的喜欢上这门课。
在学习过程中也让我更加明白了在学习过程中不懂要多问、多动手,现在信息技术那么发达,除了老师课堂上传授的知识之外还要自己去多加摸索以及学习!flask框架在网上有很多学习网站都是可以让我们学习和借鉴的!