微型博客Flaskr
开始学习了flask框架,对于最简单的一个框架来说,最快的了解方式就是搭建一个相应的东西。于是学习了如何快速的搭建一个简易Blogs。
全文的参考文档来自:Welcome to flask
一、用virtualenv建立虚拟环境
1.使用virtualenv工具
二、导入配置文件
0、文件夹格式
-flaskr
----env
----static
----templates
----flaskr.py
1、配置文件里包括创建数据库模式
对于这个简单的应用只需要一个表就足够了,此处选用python内置的sqlite3.创建schema.sql文件,此文件置于flaskr文件夹中.
此模式由一个entries表构成,表里每一行有id,title,text字段;其中id是主键,其余是字符串。
---schema.sql---
drop table if exists entries;
create table entries (
id integer primary key autoincrement,
title string not null,
text string not null
);
2、创建基本的模块
创建一个flaskr.py文件,置于flaskr文件夹下.首先要将需要的模块和配置导入。此时我们直接放到主模块中;对于较大的应用来说,更加清晰的方案是创建一个独立的.ini或者.py文件,然后导入或装载到主模块中。
# import all the imports
import sqlite3
from flask import Flask, request, session, g, redirect, url_for, \
abort, render_template, flash
import os
2.0新建一个应用app = Flask(__name__)
;此后我们就可以直接用app来调用应用的方法
2.1读取配置文件
app.config.update(dict(
#通过os的路径来导入数据库
DATABASE = os.path.join(app.root_path,'flaskr.db'),
DEBUG = True, #启用调试模式
SECRET_KEY = 'development key', #密钥?????
USERNAME = 'admin',
PASSWORD = 'default'
))
#从配置文件里读取配置信息
app.config.from_envvar('FLASKR_SETTINGS',silent=True)
这里我们用dict.update()方法,一次进行更新多个键值
2.2创建与数据库的链接
def connect_db(): #????????????????????
rv = sqlite3.connect(app.config['DATABASE'])
rv.row_factory = sqlite3.Row
return rv
2.3创建数据库模式
之前定义的schema.sql文件是用来创建数据库模式,
假如使用命令,则可以通过管道把schema.sql作为sqlite 3 命令的输入来创建这个模式
命令如下:sqlite3 /tmp/flaskr.db < schema.sql
但此方法有一个缺点: 需要安装sqlite 3 命令,而并不是每一个系统都有安装它
所以添加一个函数对数据库进行初始化是不错的办法,我们需要从contextlib包中导入contextlib.closing()函数,用到了装饰器@
closing 助手函数允许我们在with模块中保持数据库连接可用
def init_db():
with closing(connect_db()) as db :
with app.open_resource('schema.sql') as f :
db.cursor().executescript(f.read())
db.commit()
对上面代码的解析:
通过 :func: ~contextlib.closing 辅助函数,我们可以在 with 模块中保持数 据库连接。applicationg对象的 open_resource() 方法支持也 支持这个功能,所以我们可以在 with 模块中直接使用它。这个函数用来从这个应 用的所在位置( flaskr 目录)打开一个文件,然后允许你通过它来读取文件。我 们在这里使用这个函数是为了在数据库连接上执行一个脚本。
当你连接到数据库后,我们就得到了一个连接对象(这里我们把它叫做 db ),这 个对象会给我们提供一个指针。这个指针有一个方法可以来执行完整的数据库命令。 最后,我们还要来提交我们对数据库所做的改变。如果你不明确的来提交修改, SQLite3和其他的事务数据库都不会自动提交这些修改。
2.4请求数据库连接
a.使用before_request() 装饰器的函数会在请求之前被调用而且不带参数
b.使用after_request() 装饰器的函数会在请求之后被调用且传入将要发给客户端的响应 他们必须返回那个响应对象或是不同的相应对象
c.但当异常抛出时,他们不一定会被执行,那么可以使用teardown_request()装饰器
d.我们在此处用了teardown_request装饰器,在相应构造后执行并不允许修改请求,返回的值会被忽略,如果请求已处理的时候抛出异常,他会被传递到每一个函数,否则、会传入一个None
@app.before_request
def before_request():
g.db = connect_db()
@app.teardown_request
def teardown_request(exception) :
g.db.close()
其中的g是响应的全局变量??????
2.5显示条目
添加新条目;允许用户登录并添加新条目,他只回应POST请求,实际的表单是显示在show_entries页面,如果一些工作正常时,我们用flash()向下一个请求闪现一条信息,并且跳回show_entries页
@app.route('/add', methods=['POST'])
def add_entry():
if not session.get('logged_in'):
abort(401)
g.db.execute('insert into entries (title, text) VALUES (?, ?)',
[request.form['title'], request.form['text']])
g.db.commit()
flash('New entry was successfully posted')
return render_template(url_for('show_entries'))
2.6登录函数
登录函数依据在配置中的值登录时检查用户名和密码,并且在会话中设置logged_in键值。如果登录成功则logged_in键值则被设置为True,并跳回show_entries页此外会有消息闪现来提示登录成功,发生错误时,模板会通知,并提示重新登录。
@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_entries'))
return render_template('login.html', error=error)
2.7注销函数
注销函数从会话中移除了logged_in键值,这里采用了字典的pop()函数并传入第二个参数(默认),此方法从字典中
删除这个键,如果这个键不存在则什么都不做.
@app.route('/logout')
def logout():
session.pop('logged_in',None)
flash('You were logged out')
return redirect(url_for('show_entries'))
以上就是简单的blog的代码框架。。。之后运行
if __name__ == '__main__':
from flaskr import init_db
init_db()
app.run()
就可以看到你的最简单的blogs程序跑起来啦!!!!