美文网首页
基于flask框架的简单blogs

基于flask框架的简单blogs

作者: ikaroskun | 来源:发表于2016-11-15 17:02 被阅读114次

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

    相关文章

      网友评论

          本文标题:基于flask框架的简单blogs

          本文链接:https://www.haomeiwen.com/subject/grmsjttx.html