Flask开发初探

介绍

在日常开发中,如果需要开发一个小型应用或者Web接口,一般我是极力推崇Flask的,主要是因为其简洁、扩展性高。

从这篇文章开始,我会写一个关于Flask的系列文章,通过多个实例,由浅入深,融入自己使用Flask的心得,希望能帮助更多朋友学习Flask。

在此之前,建议你了解常见理论(包括视图、模板等),阅读Flask的官方文档,了解sqlalchemy,有一定的前端基础。

开发环境:ubuntu + Python2.7X + mysql

本系列文章代码将持续更新于my github

一个最简单的应用

首先介绍一个Flask中最简单的应用,创建app.py,编写:

from flask import Flask
app = Flask(__name__) @app.route('/')
def hello_world():
return 'Hello Flask!' if __name__ == '__main__':
app.run()

使用命令python app.py,运行该脚本,就启动了该应用,在浏览器中输入应用地址(一般是127.0.0.1:5000),便可查看到"Hello Flask"。

关于这部分代码的具体含义我不多做介绍,有疑问的朋友可参见这里

需要说明的是,若开发简单应用(接口较少,不依赖数据库等),可以使用这种单文件模式生成的方式。当项目应用需求较大时,自然是不能使用单文件模式,因为这样显得笨重且不易维护,这时就需要考虑到项目结构了。

项目结构

对于Web开发,很重要的一点就是创建项目结构,接下来给大家分享下我常用的项目结构:

  • app

    • app

      • templates (MVC中的V,存放模板文件)
      • static (存放静态文件,包括css和js文件等)
      • models (映射数据库表结构)
      • utils (通用功能模块)
      • _init_.py (模块初始化文件)
      • views.py (MVC中的C,存放视图函数)
      • config.py (配置文件)
    • manage.py (数据库迁移文件)
    • serve.py (项目启动文件)

着手开发

重要概念

开发之前呢,先简单介绍这篇文章中关于Flask很重要的几个概念。

1. 路由:所谓路由,就是处理URL和函数之间关系的程序,Flask中也是对URL规则进行统一管理的,使用@app.route修饰器将一个函数注册为路由。

2. 蓝图: 编程讲究的是功能模块化,从而使代码看起来更加的优雅和顺畅, 在Flask中,蓝图可以将各个应用组织成不同的组件,实现代码的模块化。比如一个系统有两种角色,一个是普通用户user,另一个是管理员admin,那么他们所拥有的权限和功能有很大差异,若将其放在同一个文件下,代码量相对较大且不易维护,若进行版本控制时,也很容易出现冲突,这时可以创建蓝图加以区分。

3. sqlalchemy:

SQLAlchemy是Python中最有名的的ORM框架,所谓的ORM(Object-Relational Mapping),就是将关系数据库的表结构映射到对象上(程序中的类),可以将数据库表中的一行记录与一个对象互相做自动转换。

它支持多种数据库引擎,封装了各种数据库引擎(SQLite,MySQL,Postgresql,Oracle等),对于不同的数据库,只需要做简单的修改,工作量大大减少。

在Flask中,可以使用Flask-SQLAlchemy管理数据库,使用命令安装:

pip install flask-sqlalchemy

V1.0

第一个版本V1.0将创建项目目录,介绍一个较为简单的应用:结构化Flask项目,并简单使用模板和静态文件进行前端展示。

创建蓝图

首先,在views.py中创建蓝图:

# coding:utf-8

from flask import Blueprint

views = Blueprint('views', __name__)

然后,在_init_.py初始化应用,添加views蓝图:

# coding:utf-8

from flask import Flask
from views import views def create_app():
app = Flask(__name__)
app.register_blueprint(views) return app

视图函数

这样views蓝图被定义,使用views蓝图,打开views.py,编写视图函数定义路由,这里:

@views.route('/')
def home():
return "Hello Flask!"

启动脚本

编写项目启动脚本serve.py:

# coding:utf-8

from app import create_app

app = create_app()

if __name__ == "__main__":
app.run(debug=True)

使用"python serve.py"命令运行该项目,便可在网页上显示"Hello Flask"。

使用模板和静态文件

在web开发中,我们自然是需要使用模板(template)和静态文件(static)来生成更加丰富的网页。模板即是包含了程序页面的html文件,静态文件指的是需要在HTML文件中加载的CSS、JavaScript和图片等资源文件。那么具体如何使用呢?

这里在上述实例的基础上,使用模板和静态文件在界面中加载出"Hello Flask",如下:

  1. 在templates文件夹中创建home.html;
  2. 在static文件夹中创建style.css,并在home.html中引用;
  3. 在路由函数中,使用render_template引用模板,如下:
# coding:utf-8

from flask import render_template, Blueprint

views = Blueprint('views', __name__)

@views.route('/')
def home():
return render_template('home.html')

相应的,在templates文件夹中创建'home.html‘,运行"python serve.py"便可在网页中显示home.html中的内容Hello flask。

V1.1

这部分将在上一版本的基础上,实现一个web应用中很常见的场景:提交表单与入库操作,当然这个场景最典型的是注册功能,那不妨以该功能举例。

简单说来,这里我们的注册功能就是收集验证数据并存入数据库。当然,为了保证数据安全性,这里我们对用户密码进行加密。

使用数据库

下面将以mysql举例。

配置

首先,在config.py中配置数据库:

# coding:utf-8

class Config():
SQLALCHEMY_DATABASE_URI = DATABASE_URL = "mysql://root:pwd@localhost/learn_flask?charset=utf8"
SQLALCHEMY_TRACK_MODIFICATIONS = False"

接下来,在models中创建数据库映射表,创建一个Users表,包括用户名,邮箱,密码三个字段:

# coding:utf-8
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class Users(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128), unique=True)
email = db.Column(db.String(128))
password = db.Column(db.String(128)) def __init__(self, name, email, password):
self.name = name
self.email = email
self.password = password

这样,我们就完成了Users表的映射,那么接下来,需要完成数据库的初始化,以应用于该项目中,修改_init_.py文件:

def create_app(config='app.config.Config'):
app = Flask(__name__)
with app.app_context():
app.config.from_object(config) from models import db, Users
url = make_url(app.config['SQLALCHEMY_DATABASE_URI'])
db.init_app(app)
try:
if not database_exists(url):
create_database(url)
db.create_all()
except OperationalError:
db.create_all()
except ProgrammingError:
pass
else:
db.create_all()
app.db = db
app.register_blueprint(views)
return app

这时,启动该项目,就会在mysql中创建数据库“learn_flask”,说明数据库配置正确。

注册功能的实现

准备工作完毕,接下来就着手实现注册功能。

为了体现模块化思想,我们不妨来创建一个user蓝图,用来编写与用户相关的所有功能,创建蓝图与初始化在V1.0中已介绍,在此不再赘述,正好给大家一个练手的机会。

接下来创建注册视图函数,并对传入的用户名、邮箱和密码进行验证:

@user.route('/register', methods=['POST', 'GET'])
def register():
if request.method == 'POST':
name = request.form['name']
email = request.form['email']
password = request.form['password']
repassword = request.form['repassword'] errors = judgemember(name, email)
if password != repassword:
errors.append('两次密码输入不一致')
if len(errors) > 0:
return render_template('register.html', errors=errors)
else:
user = Users(name, email, password)
db.session.add(user)
db.session.commit()
db.session.close()
return redirect(url_for('views.home'))
else:
return render_template('register.html')

关于前端文件,这里就不列出来了,不熟悉Jinja的可以看下其具体的用法,具体代码见my github

创建调试完毕,打开浏览器,访问“/register”即可看到以下界面:

以上,就是本篇文章介绍的全部内容,欢迎探讨。

Flask开发系列之初体验的更多相关文章

  1. Flask开发系列之快速入门

    Flask开发系列之快速入门 文档 一个最小的应用 调试模式 路由 变量规则 构造 URL HTTP 方法 静态文件 模板渲染 访问请求数据 环境局部变量 请求对象 文件上传 Cookies 重定向和 ...

  2. Docker深入浅出系列 | 容器初体验

    目录 Docker深入浅出系列 | 容器初体验 教程目标 预备工作 容器与虚拟化技术 什么是Docker 为什么要用Docker 事例 什么是容器镜像和容器 容器与虚拟机的区别 Vagrant与Doc ...

  3. Flask开发系列之数据库操作

    Flask开发系列之数据库操作 Python数据库框架 我们可以在Flask中使用MySQL.Postgres.SQLite.Redis.MongoDB 或者 CouchDB. 还有一些数据库抽象层代 ...

  4. Flask开发系列之Web表单

    Flask开发系列之Web表单 简单示例 from flask import Flask, request, render_template app = Flask(__name__) @app.ro ...

  5. Flask开发系列之模板

    Flask开发系列之模板 本文对<FlaskWeb开发:基于python的Web应用开发实战>模板一节做的总结. Jinja2模板引擎 模板 模板是一个包含响应文本的文件,其中包含用占位变 ...

  6. Flask开发系列之Flask+redis实现IP代理池

    Flask开发系列之Flask+redis实现IP代理池 代理池的要求 多站抓取,异步检测:多站抓取:指的是我们需要从各大免费的ip代理网站,把他们公开的一些免费代理抓取下来:一步检测指的是:把这些代 ...

  7. Android百度地图开发01之初体验

    做关于位置或者定位的app的时候免不了使用地图功能,本人最近由于项目的需求需要使用百度地图的一些功能,所以这几天研究了一下,现写一下blog记录一下,欢迎大家评论指正! 一.申请AK(API Key) ...

  8. Python开发之---PyCharm初体验

    PyCharm 的初始设置(知道) 目标 恢复 PyCharm 的初始设置 第一次启动 PyCharm 新建一个 Python 项目 设置 PyCharm 的字体显示 PyCharm 的升级以及其他 ...

  9. 恩智浦Freescale Cortex-A9 迅为IMX6开发板平台初体验

    iTOP-i.MX6 开发板预装 Android4.4 系统,采用 9.7 寸(或者 7 寸或者 4.3 寸)IPS 屏 幕,至少 5 点以上触控,操作流畅,无论是高清视频.游戏等都会有上佳的表现,实 ...

随机推荐

  1. Java虚拟机内存区域划分

    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途.以及创建和销毁的时间.有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结 ...

  2. Spring的配置相关知识(学习spring boot的预备知识)

    我们经常说的控制反转(Inversion of Control-IOC)和依赖注入(dependency injection-DI)在Spring环境下是等同的概念,控制反转是通过依赖注入实现的.所谓 ...

  3. spring 或 springboot统一异常处理

    spring 或 springboot统一异常处理https://blog.csdn.net/xzmeasy/article/details/76150370 一,本文介绍spring MVC的自定义 ...

  4. Memory Manager surface area changes in SQL Server 2012

    here were various changes to memory related DMVs, DBCC memory status, and Perfmon counters in SQL Se ...

  5. MongoDB 3.4 分片集群副本集 认证

    连接到router所在的MongoDB Shell  我本机端口设置在50000上 mongo --port 接下来的流程和普通数据库添加用户权限一样 db.createUser({user:&quo ...

  6. 个人知识管理系统Version1.0开发记录(03)

    demo  设 计 一个知识点demo,在数据库和用户界面的互动事件.分三个层次,数据存储,数据方法工具,数据呈现界面.这一次先完成数据存储,按以下逻辑实现.工具:eclipse,oracle数据库, ...

  7. Java导出Excel(有数据库导出代码)

    /** * 导出 * @param request * @param response * @throws Exception */ @SuppressWarnings("unchecked ...

  8. Hessian序列化

    当子类定义了和父类同名的属性时,经过hessian传输,会导致该属性值丢失.因为hessian发送二进制数据时,子类数据在前,父类数据在后.接收二进制数据时,子类数据在前,父类数据在后.所以对于同名字 ...

  9. webstrom 配置eslint 自动修复错误

    1.展示效果 如何给vue项目添加eslint呢,如何自动修复呢? 先展示一下效果: 2.配置步骤 1.安装插件ESLint plugin webstrom 其实有个非常好用的插件,ESLint pl ...

  10. BZOJ2259 [Oibh]新型计算机

    话说hzwer你在坑爹?... 我按照你的建图交了上去,发现WA. 开始检查= =...过了好久,突然觉得画风不对...hzwer您建图错了啊!!! 后来看了看zky的终于知道了怎么回事>_&l ...