介绍
Flask是一个轻量级的web框架,基于WerkzeugWSGI工具箱和jinja2模板引擎,核心简单但可以用extension增加功能。
Flask没有默认的数据库,窗体验证工具,但可以通过Flask-extension添加这些功能:ORM,窗体验证工具,文件上传,各种开放式身份验证技术等。
安装Flask
安装Flask这里我就不详细说了
hello world
学习新的东西,我们一般写一个helloworld这次也没例外,首先常见一个文件hello.py,然后添加如下代码:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'hello world'
if __name__ == '__main__':
app.run()
然后运行,在命令行运行,见证奇迹的时刻到了
python hello.py
如果成功了,你会发现有一句输出Running on 127.0.0.1:5000,如果没有,就自求多福吧
然后进入浏览器,输入网址127.0.0.1:5000,你就会发现你的hello world打印在上面了。
分析
现在我们来看一下hello.py做了些什么
1、导入Flask包
2、指定应用模块的名称
3、使用route修饰器,指定目录触发对应的函数
4、通过调用app.run()来启动服务器,if判断是为了只有当该脚本被Python解释器直接执行的时候运行
是不是很简单,下面我们来做一个博客系统
搭建博客系统
首先来看一下我们的目录结构:
/blog
/static
/templates
blog下面存放的是我们数据库文件以及项目的主文件目录,static存放的是网页编写需要的css和JavaScript文件,而templates存放的就是我们编写的jinja2模板。简单的介绍到这了,下面我们开始编写代码吧
创建数据库
首先在根目录下创建schema.sql文件
drop table if exists blogs;
create table blogs (
id integer primary key autoincrement,
title string not null,
text string not null
);
然后在根目录下创建blog.py文件,该文件作为整个项目的主文件,包含项目的相关配置
# 导入所有的模块
import sqlite3
from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash
# 配置文件
DATABASE = '/tmp/blog.db'
DEBUG = True
SECRET_KEY = 'development key'
USERNAME = 'admin'
PASSWORD = 'admin'
# 创建应用
app = Flask(__name__)
# from_object会搜寻定义里的全部大写的变量,即上面的各项设置
app.config.from_object(__name__)
#from_envvar设置BLOG_SETTINGS变量来设定是否从配置文件载入文件后覆盖默认值,
#silent设置为True后就表明不关心该值
app.config.from_envvar('BLOG_SETTINGS', silent=True)
def connect_db():
return sqlite3.connect(app.config['DATABASE'])
if __name__ == '__main__':
app.run()
上面的代码只是对该项目进行了简单的设置,下面通过init_db来进行数据库的操作请求
def init_db():
with closing(connect_db()) as db:
with app.open_resource('schema.sql') as f:
db.cursor().executescript(f.read())
db.commit()
不仅如此,sqlite3还允许我们在数据库操作前后进行操作:
@app.before_request
def before_request():
g.db = connect_db()
@app.teardown_request
def teardown_request(exception):
g.db.close()
这样在我们init_db的之前连接数据库,读取数据完成之后进行数据库的关闭
下面我们编写四个界面
@app.route('/')
def show_blogs():
cur = g.db.execute('select title, text from blogs order by id desc')
blogs = [dict(title=row[0],text=row[1])for row in cur.fetchall()]
return render_template('show_blogs.html',blogs = blogs)
@app.route('/add',methods=['POST'])
def add_blog():
if not session.get('logged_in'):
abort(401)
g.db.execute('insert into blogs (title,text) values(?,?)',[request.form['title'],request.form['text']])
g.db.commit()
flash('New entry was successfully posted')
return redirect(url_for('show_blogs'))
@app.route('/login',methods=['GET','POST'])
def login():
error = None
if request.method == 'POST':
if request.form['username']!=app.config['USERNAME']:
error = 'Invalid username';
elif request.form['password']!=app.config['PASSWORD']:
error = 'Invalid password'
else:
session['logged_in']=True
flash('You were logged in')
return redirect(url_for('show_blogs'))
return render_template('login.html',error=error)
@app.route('/logout')
def logout():
session.pop('logged_in',None)
flash('You were logged out')
return redirect(url_for('show_blogs'))
在show_blogs的时候,我们从数据库获取到我们的blogs,然后使用template文件夹下面保存的show_blog.html,并将blogs传递过去,方便页面进行数据的展示。
然后在add_blog中首先判断用户是否登录,如果登录之后,就进行数据库的插入操作,最后将页面重定向到show_blogs所代表的url上。
登录login看起来比较复杂,其实就是用户的判断,这里直接用简单的模拟一下登录,如果登录成功就重定向到show_blogs上去,如果失败,就跳转到login界面去
最后logout其实就是将我们在session中存储的用户登录信息给清除掉,并重定向到show_blogs,这里面的逻辑行为交由页面进行处理。
对于页面编写的话,这里也没什么好说的,我这里就不再赘述了。
是不是很简单,这么快就完成了博客系统。
本文代码请见https://github.com/shamaker/flask-blog