flask 返回json_TechRepo | Flask技术分享

TechRepo是由软件学院学生科协推出的技术分享系列推送,每周会进行一次更新,旨在为同学们提供一个分享技术、学习技术、传承技术的平台。欢迎感兴趣的同学关注我们,也欢迎有意向分享技术的同学联系我们(tech@ssast.org)了解投稿事宜。

46cf3b90b61bfc77a15abcc8f6a923de.png

Flask技术分享

Flask 是一个微型的 Python 开发的 Web 框架。它也被称为“microframework”,因为它使用简单的核心,没有默认的数据库、窗体验证工具等功能。然而,Flask支持数量众多且丰富的扩展,如ORM、窗体验证工具、文件上传、各种开放式身份验证技术等等。

创建应用

首先,我们可以通过创建一个Flask对象实例,来创建一个application

from flask import Flask
app = Flask(__name__)

在flask中,所有应用都应该以一个python package的方式存在,因此我们应该在对应文件夹中添加__init__.py文件。在__init__py文件中,我们一般会定义create_app函数,它是创建app实例,读取相关配置的工厂函数,例如:

import os
from flask import Flask
from config import config

def create_app(v="production"):
    app = Flask(__name__)
    config_name = os.getenv("FLASK_ENV") or v
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)
    # ..............
 # ..............

然后,我们就可以通过flask run命令来运行应用,该命令会默认为我们启动一个本地服务器:

# for windows use export with Linux and Mac instead of set
> set FLASK_ENV = development
> set FLASK_APP = your_app_name
> flask run

我们也可以开启一个交互式的Python shell,并将应用实例导入:

> flask shell

配置管理

在一个Flask对象中,我们可以通过config属性来访问该应用配置的值,其本质是一个字典:

app = Flask(__name__)
app.config['TESTING'] = True

一般来说,我们会使用单独的配置文件来管理应用的配置,新建config.py文件,并在其中写入相关的配置,推荐使用类和类的继承来进行配置的管理和导出:

class Config(object): 
    DEBUG = False
    TESTING = False
    DATABASE_URI = 'sqlite:///:memory:'
 # 可以定义静态方法,在载入配置时进行初始化操作
    @staticmethod
    def init_app(app):
        pass
    
class Production(Config):
    DATABASE_URI = 'mysql://user@localhost/foo'

class Development(Config):
    DEBUG = True

class Testing(Config):
    TESTING = True

    
config = {
    'development': Development,
    'testing': TestConfig,
    'production': ProductionConfig,
    'default': Development
}

相应地,我们可以使用Flask对象的config.from_object方法加载config:

from config import config
import os
config_name = os.getenv('FLASK_ENV') or 'production'
app.config.from_object(config[config_name])

对于FLASK_ENVFLASK_DEBUG这两个动态影响应用运行模式的配置,我们一般使用环境变量。例如,在使用python-dotenv时,我们可以在.env文件中写入环境变量:

FLASK_APP=app
FLASK_ENV=development

路由处理与蓝图

Blueprint是Flask中组织一组视图和代码的方式,我们可以将一组url和其对应的视图函数注册到蓝图上,为其提供相应的过滤器、静态文件等资源,再将蓝图注册到应用上,来实现应用的分解和扩展。

我们可以这样来创建一个蓝图并将其注册到app上:

# app/api/__init__.py
from flask import Blueprint
api=Blueprint('api',__name__)

# app/__init__.py
def create_app()
 #......from . import api as api_bpapp.register_blueprint(api_bp, url_prefix='/api')

而在蓝图下,我们可以使用@bp_name.route来匹配一个蓝图下的url和其处理函数,例如:

@api.route('/register', methods=('GET', 'POST'))
def register():
    if request.method == 'POST':
  #......
    else:
        #......
# 匹配url具有几种不同的模式
# 例如,带路径参数时可以类似写成 '/users/' 的形式

flask会根据当前的请求上下文将一个request对象传入函数之中,我们可以通过其属性访问到对应的请求数据,例如:request.method,request.json,request.args等。

flask会自动对路由函数的返回值通过Response对象封装,返回一个请求的响应,例如以下代码就会将一个以json格式返回一个响应:

return jsonify({'error': 'Bad Request'}), 401

数据库的使用

一般来说,我们会使用ORM来管理数据库,这里我们使用的是flask-sqlalchemy,它的语法基本继承于sqlalchemy

from flask-sqlalchemy import SQLAlchemy 
db = SQLAlchemy()

def create_app():
    # ......
    # flask的扩展的一般方法,通过创建init_app方法来进行和自定义初始化
    db.init_app(app)
 

注意,我们还需要修改配置文件,配置数据库相关信息,特别是在使用默认的sqlite以外的数据库时。

之后,我们可以创建models.py文件,并在其中定义数据库模型,例如:

class User(db.Model):
    __tablename__ = "users"
    # 使用db.Column生成一个字段 db.Integer等对应其数据形式
    id = db.Column(db.Integer , primary_key=True , autoincrement=True)
    name = db.Column(db.String(50) , nullable=False)

在使用外键时,我们可以通过sqlalchemy提供的relationship来直接访问外键对应的ORM对象,例如下面是一个一对多关系的示例:

class User(db.Model):
    # ......
    items = db.relationship('Item', backref='owner', lazy='dynamic', cascade="all,delete")

class Item(db.Model):
    # ......
    owner_id = db.Column(db.Integer, db.ForeignKey('users.id'))

我们同样可以使用db.session创建一个会话,并在会话内访问数据库,进行增删改查,例如:

# 增
db.session.add(User(username,password))
db.session.commit()
# 查
user = User.query.filter_by(id = id).first() # 也可以使用db.session.query
# 改
user.username = 'new'
db.session.commit()
# 删
db.session.delete(user) # 或 User.query.filter_by(id = id).delete()
db.session.commit()

在实际的应用中,我们需要使用数据库的迁移,我们可以使用flask_migrate插件来实现:

from flask_migrate import Migrate
migrate = Migrate()
migrate.init_app(app, db, render_as_batch=True)

在命令行中,对应的使用以下命令进行数据库的初始化、migrate和upgrade。

> flask db init
> flask db migrate -m 'comment'
> flask db upgrade

文案:张智

排版:赵乙宁

 往期推送速览

1

TechRepo | Linux命令行介绍

2

TechRepo | Why HTTPS

3

TechRepo | 正则表达式

4

TechRepo | 微信小程序入门

5

TechRepo | OpenCV-Python简单入门

6

TechRepo | LaTex基本知识和应用

321187150f3d797af84f5decef3b2bb0.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值