Flask开发系列之初体验
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 (项目启动文件)
- app
着手开发
重要概念
开发之前呢,先简单介绍这篇文章中关于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",如下:
- 在templates文件夹中创建home.html;
- 在static文件夹中创建style.css,并在home.html中引用;
- 在路由函数中,使用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开发系列之初体验的更多相关文章
- Flask开发系列之快速入门
Flask开发系列之快速入门 文档 一个最小的应用 调试模式 路由 变量规则 构造 URL HTTP 方法 静态文件 模板渲染 访问请求数据 环境局部变量 请求对象 文件上传 Cookies 重定向和 ...
- Docker深入浅出系列 | 容器初体验
目录 Docker深入浅出系列 | 容器初体验 教程目标 预备工作 容器与虚拟化技术 什么是Docker 为什么要用Docker 事例 什么是容器镜像和容器 容器与虚拟机的区别 Vagrant与Doc ...
- Flask开发系列之数据库操作
Flask开发系列之数据库操作 Python数据库框架 我们可以在Flask中使用MySQL.Postgres.SQLite.Redis.MongoDB 或者 CouchDB. 还有一些数据库抽象层代 ...
- Flask开发系列之Web表单
Flask开发系列之Web表单 简单示例 from flask import Flask, request, render_template app = Flask(__name__) @app.ro ...
- Flask开发系列之模板
Flask开发系列之模板 本文对<FlaskWeb开发:基于python的Web应用开发实战>模板一节做的总结. Jinja2模板引擎 模板 模板是一个包含响应文本的文件,其中包含用占位变 ...
- Flask开发系列之Flask+redis实现IP代理池
Flask开发系列之Flask+redis实现IP代理池 代理池的要求 多站抓取,异步检测:多站抓取:指的是我们需要从各大免费的ip代理网站,把他们公开的一些免费代理抓取下来:一步检测指的是:把这些代 ...
- Android百度地图开发01之初体验
做关于位置或者定位的app的时候免不了使用地图功能,本人最近由于项目的需求需要使用百度地图的一些功能,所以这几天研究了一下,现写一下blog记录一下,欢迎大家评论指正! 一.申请AK(API Key) ...
- Python开发之---PyCharm初体验
PyCharm 的初始设置(知道) 目标 恢复 PyCharm 的初始设置 第一次启动 PyCharm 新建一个 Python 项目 设置 PyCharm 的字体显示 PyCharm 的升级以及其他 ...
- 恩智浦Freescale Cortex-A9 迅为IMX6开发板平台初体验
iTOP-i.MX6 开发板预装 Android4.4 系统,采用 9.7 寸(或者 7 寸或者 4.3 寸)IPS 屏 幕,至少 5 点以上触控,操作流畅,无论是高清视频.游戏等都会有上佳的表现,实 ...
随机推荐
- Servlet3.0与Spring
servlet filter listener web.xml DispatcherServlet web.xml 后期 servlet3.0我们去除web.xml 通过注解方式 同时需要s ...
- Python学习札记(三) I/O
参考:输入和输出 I/O 1.print()函数 a.调用print()输出字符串有以下两种方式:(1)print('[字符串]') (2)print("[字符串]") b.调用p ...
- python的变量,对象的内存地址以及参数传递过程
作为一个由c/c++转过来的菜鸟,刚接触Python的变量的时候很不适应,应为他的行为很像指针,void* ,不知道大家有没有这样的感觉.其实Python是以数据为本,变量可以理解为标签.作为c/c+ ...
- TIME_WAIT和CLOSE_WAIT
先看下三次握手四次挥手的状态变化: 通常会遇到下面两种情况: 服务器保持了大量TIME_WAIT状态 服务器保持了大量CLOSE_WAIT状态 因为linux分配给一个用户的文件句柄是有限的,而TIM ...
- php给图片添加圆角并且保持透明,可做圆形头像
原文链接:https://www.zhaokeli.com/article/8031.html 给图片添加圆角, 用到的主要的(判断一个点是否在圆内)的公式在上面所说的生成圆形图片文章中. 然后扫 ...
- 刷完了leetcode的数据库题目~
很久很久很久之前,我上传了几条数据库题目,并没有坚持,今天跟新一下进度吧,其实没啥难度w(* ̄︶ ̄)
- JavaScript中Function Declaration与Function Expression 或者说 function fn(){}和var fn=function(){} 的区别
JavaScript是一种解释型语言,函数声明会在JavaScript代码加载后.执行前被解释,而函数表达式只有在执行到这一行代码时才会被解释. 在JS中有两种定义函数的方式, 1是:var aaa= ...
- asp.net服务器上无法发送邮件的问题
前几天为开发的网站做了个发送邮件的功能,但是部署到服务器上无法发送邮件,提示由于目标机器积极拒绝,无法连接.在网上找到了一个解决办法 如果安装了McAfee杀毒软件(按照“手工安装方法”安装),首先需 ...
- 这可能是最详细的 iOS 学习入门指南(含书目/文档/学习资料)
1 零基础小白如何进行 iOS 系统学习 首先,学习目标要明确: 其次,有了目标,要培养兴趣,经常给自己一些正面的反馈,比如对自己的进步进行鼓励,在前期小步快走: 再次,学技术最重要的一点就是多动手. ...
- GPON命令模式
1.添加ont步骤 1.1 查看自动发现的ONT,并记录SN号和PON口 MA5680T(config)#display ont autofind all --------------------- ...