基于flask框架的简单blogs

2016-11-15  本文已影响114人  ikaroskun

微型博客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程序跑起来啦!!!!

上一篇下一篇

猜你喜欢

热点阅读