Flask入门

介绍

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

你可能感兴趣的:(Flask入门)