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 (项目启动文件)

着手开发

重要概念

开发之前呢,先简单介绍这篇文章中关于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:[email protected]/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”即可看到以下界面:

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

原文地址:https://www.cnblogs.com/ybjourney/p/10125532.html

时间: 2024-11-05 19:32:03

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

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

Docker深入浅出系列 | 容器初体验 教程目标 Docker已经上市很多年,不是什么新鲜事物了,很多企业或者开发同学以前也不多不少有所接触,但是有实操经验的人不多,本系列教程主要偏重实战,尽量讲干货,会根据本人理解去做阐述,具体官方概念可以查阅官方文档,本章目标如下: 了解什么是Docker 了解Docker解决了什么 了解什么是镜像和容器 了解容器与虚拟机的区别 了解Vagrant与Docker的区别 了解Docker引擎和架构 了解Docker的镜像分层 了解VirturalBox和Do

使用Kotlin开发Android应用初体验

使用Kotlin开发Android应用初体验 昨晚,最近一届的谷歌IO大会正式将Kotlin确定为了官方开发语言,作为一名Android开发鸟,怎么能不及时尝尝鲜呢? Kotlin的简要介绍 在开发之前,很多同学一定有很多疑问,Kotlin到底有啥好处,怎么和现有的项目共存呢?Java那么些特性Kotlin都有吗?嗯,让我们一一来看. 以下内容摘自:Kotlin的官方网站:https://www.kotlincn.net/docs/reference/android-overview.html

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

Flask开发系列之Flask+redis实现IP代理池 6.11-6.15号完善... 简易实现版 import requests import re import time import redis from bloom_filter import BloomFilter import ast pool = redis.ConnectionPool(host='localhost',password='xxx', port=6379, decode_responses=True) r = r

SAMSUNG S3C2440 ARM LINUX 开发板 上手初体验 --开发环境搭建

1,linux开发环境搭建 2,程序测试 easyOpentag驱动安装,打开连接,选择ARM-linux 链接:http://pan.baidu.com/s/1pJKK4w7 密码:a0re 1,环境搭建 我的系统版本 [email protected]:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.3 LTS Release: 14.04 Cod

1Python全栈之路系列之Django初体验

Python全栈之路系列之Django初体验 Django不得不说在Python中是一个非常强大的全栈框架,而且入门也比较简单,只要你学完了基本的Django知识,接着再做一两个项目,不大不小就成,然后你再去学其它的框架你会发现,在那些小而美的框架中,你学起来将非常的快,因为你在学习Django的时候就已经学习并且体验过了Web开发流程,所以会有这么一个现象出现,有些新手朋友在学习Flask.Tornado等小而美的框架时,很多概念不是很理解,比如ORM.路由等,但你学Django就不会出现这种

AngularJS路由系列(3)-- UI-Router初体验

本系列探寻AngularJS的路由机制,在WebStorm下开发. AngularJS路由系列包括: 1.AngularJS路由系列(1)--基本路由配置2.AngularJS路由系列(2)--刷新.查看路由,路由事件和URL格式,获取路由参数,路由的Resolve3.AngularJS路由系列(3)-- UI-Router初体验4.AngularJS路由系列(4)-- UI-Router的$state服务.路由事件.获取路由参数5.AngularJS路由系列(5)-- UI-Router的路由

SSH初体验系列--Hibetnate--2--crud操作

Ok,今天比较详细的学习一下hibernate的C(create).R(read).U(update).D(delete) 相关api... 前言 Session: 是Hibernate持久化操作的基础,提供了众多的数据库操作方法,如save(),update(),delete()...etc,用于完成对象的增加,修改,删除等方法. 后面代码中使用到的HinernateUtil类:是用于构建SessionFactory(Hibernate提供的获取session的工厂类)的一个封装类,在前面的文

Xamarin.iOS开发初体验

Xamarin是一个跨平台开发框架,这一框架的特点是支持用C#开发IOS.Android.Windows Phone和Mac应用,这套框架底层是用Mono实现的. Mono是一款基于.NET框架的开源工程,包含C#语言编译器.CLR运行时和一组类库,能运行于Windows.Linux.Unix.Mac OS和Solaris.对于.NET程序员来说,Xamarin是走向安卓.iOS.Mac跨平台开发的神器,不仅能用熟悉的C#来开发,还能使用Visual Studio作为IDE.本文内容是Xamar

人工智能初体验(二):开发简单的图灵智能聊天工具

前言:这里为了有更好的个性化设置,因此我选择了图灵机器人(http://www.tuling123.com/)的接口,使用方法跟上一篇中使用百度的接口是差不多的. 注:文末有打包好的小软件和完整源代码的下载链接 一 API Key申请 申请地址:http://www.tuling123.com/ 中间的注册登录过程不说,最后把API Key值记录下来 二 核心功能开发 这个小项目的目录结构: 核心功能文件TuringRobot.java,代码很简单,一看就明白,代码如下: package act