Python Web 框架 Flask 入门示例

Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。


官方建议使用 Python 2.6 或 2.7 开发, Python 3 还有些问题没解决。如已安装有 Python 3 了,可以使用 virtualenv 创建使用 python 2.7 的虚拟环境。示例比较简单,使用的数据库为 sqlite,因此先安装好 sqlite。


创建项目文件夹 flaskr,并在其目录下手动创建以下文件夹和文件(除了数据文件 flaskr.db

Python Web 框架 Flask 入门示例_第1张图片

安装必要模块:

pip install Flask
Python主要开发脚本文件: flaskr.py
#-*- coding: utf-8 -*-
# python 2.7

import sqlite3
from contextlib import closing
from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash
#import os
#basedir = os.path.abspath(os.path.dirname(__file__))


# 创建应用的模块
DATABASE = 'D:/Python35/mypy/project/flaskr/tmp/flaskr.db'
USERNAME = 'admin' #网页的登录用户及密码
PASSWORD = 'admin'
DEBUG = True  #调试模式,代码变更时自动加载不必每次重启服务
SECRET_KEY = 'development key' #保持客户端的会话安全,尽可能复杂

# 配置初始化
# create our little application :)
app = Flask(__name__)
app.config.from_object(__name__) #搜寻里面定义的全部大写的变量

#设置一个名为 FLASKR_SETTINGS 环境变量来设定一个配置文件载入后是否覆盖默认值
#app.config.from_envvar('FLASKR_SETTINGS', silent=True)


#连接到指定数据库
def connect_db():
	return sqlite3.connect(app.config['DATABASE'])

#初始化数据库(或者:sqlite3 ./tmp/flaskr.db < schema.sql)
def init_db():
	with closing(connect_db()) as db:
		with app.open_resource('schema.sql') as f:
			db.cursor().executescript(f.read())
		db.commit()
"""
>>> from flaskr import init_db
>>> init_db()
"""

# 连接
@app.before_request
def before_request():
	g.db = connect_db()

#关闭
@app.teardown_request
def teardown_request(exception):
	if hasattr(g, 'db'):
		g.db.close()

#显示表 entries记录 (http://127.0.0.1:5000)
@app.route('/') #URL相对路径
def show_entries():
	cur = g.db.execute('select title, text from entries order by id desc')
	entries = [dict(title=row[0], text=row[1]) for row in cur.fetchall()] #转为字典格式
	return render_template('show_entries.html', entries=entries) #显示页调用模板 show_entries.html,传回数据entries

#添加记录到表 entries (http://127.0.0.1:5000/add)
@app.route('/add', methods=['POST']) #只回应 POST 请求
def add_entry():
    if not session.get('logged_in'): #获取用户登录,是否为True
        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 redirect(url_for('show_entries')) #返回显示页面


#登录 (http://127.0.0.1:5000/login)
@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)  #登录页调用模板 login.html
	
#注销
@app.route('/logout')
def logout():
	session.pop('logged_in', None) #移除键logged_in,键不存在则什么都不做
	flash('You were logged out')
	return redirect(url_for('show_entries'))#返回显示页面
	
if __name__ == '__main__':
	app.run(host='0.0.0.0') #侦听所有地址

数据库脚本文件:schema.sql

drop table if exists entries;
create table entries (
  id integer primary key autoincrement,
  title string not null,
  text string not null
);
web主要文件: layout.html

Flaskr



Flaskr

{% if not session.logged_in %} log in {% else %} log out {% endif %}
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %} {% block body %}{% endblock %}
web数据显示文件: show_entries.html
{% extends "layout.html" %} 
{% block body %} 
  {% if session.logged_in %}  
    
Title:
Text:
{% endif %}
    {% for entry in entries %}
  • {{ entry.title }}

    {{ entry.text|safe }} {% else %}
  • Unbelievable. No entries here so far (当前表无数据) {% endfor %}
{% endblock %}
web登录文件: login.html
{% extends "layout.html" %} 
{% block body %} 
  

Login

{% if error %}

Error: {{ error }}{% endif %}

Username:
Password:
{% endblock %}

样式文件:style.css

body            { font-family: sans-serif; background: #eee; }
a, h1, h2       { color: #377BA8; }
h1, h2          { font-family: 'Georgia', serif; margin: 0; }
h1              { border-bottom: 2px solid #eee; }
h2              { font-size: 1.2em; }

.page           { margin: 2em auto; width: 35em; border: 5px solid #ccc; padding: 0.8em; background: white; }
.entries        { list-style: none; margin: 0; padding: 0; }
.entries li     { margin: 0.8em 1.2em; }
.entries li h2  { margin-left: -1em; }
.add-entry      { font-size: 0.9em; border-bottom: 1px solid #ccc; }
.add-entry dl   { font-weight: bold; }
.metanav        { text-align: right; font-size: 0.8em; padding: 0.3em; margin-bottom: 1em; background: #fafafa; }
.flash          { background: #CEE5F5; padding: 0.5em; border: 1px solid #AACBE2; }
.error          { background: #F0D6D6; padding: 0.5em; }

对数据表的创建,有两种方法:

sqlite3 ./tmp/flaskr.db < schema.sql
或者在python中执行初始化db函数 :init_db
from flaskr import init_db
init_db()

运行应用:

python flaskr.py

浏览器打开网址:http://127.0.0.1:5000/

操作示例:

Python Web 框架 Flask 入门示例_第2张图片

参考:欢迎使用 Flask


你可能感兴趣的:(Python)