zoukankan      html  css  js  c++  java
  • 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: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”即可看到以下界面:

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

  • 相关阅读:
    SAP-MM采购视图-利润中心在“工厂数据/存储2”
    SAP-物料主数据维护之(通用名称/商用名称维护)
    SAP BP维护客商主数据之(交货与付款条件)定义
    SAP MM01创建物料时配置价格
    SAP SD后台配置清单
    SAP- 物料主数据之多工厂设置
    SAP如何查询表名及字段
    SAP学习之:F-65制作财务客户收款凭证
    SAP中创建采购信息记录 (ME11)
    SAP DEV-Q-PRO系统环境默认配置规则
  • 原文地址:https://www.cnblogs.com/ybjourney/p/10125532.html
Copyright © 2011-2022 走看看