Flask Restful Web基础框架简单示例一(Mysql、Redis)

简介

        很多同学想用Flask来实现Web服务,但是由于Flask原生框架过于简单,说白了啥都没,啥都要自己写,Url文件要自己、数据库模型要自己些、配置文件要自己写,对于初学者很不友好,于是乎我就抽空花了半小时写了一下超级精简的Web框架。

        基于Flask 的精简版web框架Demo,包括使用Flask Restful,创建Mysql、Redis实例;并使用URL蓝图模式。

用途

        作为一个完整的Web基础框架,开箱即用,适用于各种系统版本,如Windows、Linux。

框架结构

关注后可直接下载完整代码

运行服务

四步走

1、创建虚拟环境
python -m venv venv

2、切换至虚拟环境
windows: source venv/Scripts/activate
Linux:   source venv/bin/activate

3、pip安装需要的环境
pip install -r requirements.txt 

4、运行
python manage.py 

调用接口

1、http://127.0.0.1:8989/api/spider/hello

2、查询数据库​​​​http://127.0.0.1:8989/api/spider/test_dbc

3、查询Redis数据​​​​​​http://127.0.0.1:8989/api/spider/test_redis

完整代码

manage.py

主程序入口文件

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:zts
# date: 2023.09.05
# Blog: https://blog.csdn.net/u012452483

from app import create_app

app = create_app()

if __name__ == '__main__':
    # 解决中文乱码问题
    app.config['JSON_AS_ASCII'] = False  # flask 2.2.5版本以下
    # app.json.ensure_ascii = False        # flask 2.3.0版本以上
    app.run(host='0.0.0.0', port=8989, debug=True)  # 监听服务端口

config.py

配置文件

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Blog: https://blog.csdn.net/u012452483

import os
import pymysql


basedir = os.path.abspath(os.path.dirname(__file__))
# 系统中用户存放数据目录
user_data_dir = basedir + '/userdata'
pymysql.install_as_MySQLdb()

# 一些额外的配置文件
user_conf_dir = basedir + '/conf'

DEBUG = True
dbuser = 'root'
dbpasswd = 'xxx'
dbhost = '10.x.x.x'
dbport = '3306'
db = 'web_crawler'

SQLALCHEMY_DATABASE_URI = 'mysql://%s:%s@%s:%s/%s' % (
    dbuser, dbpasswd, dbhost, dbport, db)
BACKUP_DB_URI = 'mysql+pymysql://%s:%s@%s:%s/%s?charset=utf8' % (
    dbuser, dbpasswd, dbhost, dbport, db)
SQLALCHEMY_TRACK_MODIFICATIONS = True
SQLALCHEMY_POOL_SIZE = 100
SQLALCHEMY_MAX_OVERFLOW = 50


# 加了这两句,redis配置信息,主机地址和端口号
REDIS_HOST = '10.x.x.x'
REDIS_PORT = 6379

app\__init__.py

app初始化

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:zts
# date: 2023.09.05

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
from redis import StrictRedis

# 创建redis对象
redis_conn = StrictRedis(host=config.REDIS_HOST,
                         port=config.REDIS_PORT, decode_responses=True)

db = SQLAlchemy()


def create_app():
    app = Flask(__name__)

    app.config.from_object(config)

    # 加载数据库
    db.init_app(app)

    #
    from .spider import spider
    app.register_blueprint(spider, url_prefix='/api/spider')

    return app

app\models.py

from app import db


class Product(db.Model):
    __tablename__ = 'product'

    id = db.Column(db.BigInteger, primary_key=True, autoincrement=True)
    name = db.Column(db.String(255), nullable=False)
    price = db.Column(db.String(255), nullable=False)
    link = db.Column(db.String(2000), nullable=False)
    shop_name = db.Column(db.String(255), nullable=False)
    shop_link = db.Column(db.String(2000), nullable=False)
    vendor = db.Column(db.String(255), nullable=False)
    sku_id = db.Column(db.String(255), nullable=False)
    search_keyword = db.Column(db.String(255), nullable=False, comment='')
    updated_at = db.Column(db.TIMESTAMP, nullable=False, server_default=db.text(
        'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'))
    query_at = db.Column(db.Date, comment='')

    def __init__(self, name, price, link, shop_name, shop_link, vendor, sku_id, search_keyword, updated_at=None, query_at=None):
        self.name = name
        self.price = price
        self.link = link
        self.shop_name = shop_name
        self.shop_link = shop_link
        self.vendor = vendor
        self.sku_id = sku_id
        self.search_keyword = search_keyword
        self.updated_at = updated_at
        self.query_at = query_at

app\spider\__init__.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author: zts

from flask import Blueprint
from flask_restful import Api
from .url import URLS


#
spider = Blueprint('spider', __name__)
api = Api(spider)


#
for url in URLS:
    api.add_resource(url['component'], url['path'])

app\spider\jd_spider.py

定义视图

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author: zts

from flask_restful import Resource
from app import redis_conn
from app.models import Product
from flask import jsonify


class Hello(Resource):
    # 请求方式:get,post,put,delete,
    def get(self):

        products = Product.query.all()
        print("len products", len(products))

        return "Hello, World! "


class Query_db(Resource):
    def get(self):

        products = Product.query.all()
        print("len products", len(products))
        res = "数据库查询到的产品数量%d" % (len(products))
        return jsonify({"data": res})


class Query_redis(Resource):
    def get(self):
        key = "test_key"
        redis_conn.set(key, "Hello Redis!")

        get_data = redis_conn.get("test_key")

        res = "Redis 中%s的值是:%s" % (key, get_data)
        return jsonify({"data": res})

app\spider\url.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author: zts
# Blog: https://blog.csdn.net/u012452483

from . import jd_spider

# 子服务URL
URLS = [
    {
        "path": "/hello",
        "comment": "Hello World",
        "component": jd_spider.Hello
    },
    {
        "path": "/test_db",
        "comment": "测试数据库",
        "component": jd_spider.Query_db
    },
    {
        "path": "/test_redis",
        "comment": "测试Redis",
        "component": jd_spider.Query_redis
    }
]

数据库结构

show create table web_crawler.product;

CREATE TABLE `product` (
   `id` bigint(20) NOT NULL AUTO_INCREMENT,
   `name` varchar(255) NOT NULL,
   `price` varchar(255) NOT NULL,
   `link` varchar(2000) NOT NULL,
   `shop_name` varchar(255) NOT NULL,
   `shop_link` varchar(2000) NOT NULL,
   `vendor` varchar(255) NOT NULL,
   `sku_id` varchar(255) NOT NULL,
   `search_keyword` varchar(255) NOT NULL COMMENT '搜索关键字',
   `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   `query_at` date DEFAULT NULL COMMENT '查询日期,精确到年月日',
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=8243 DEFAULT CHARSET=utf8mb4

完整代码文件,在本文标题与正文之间,点击下载即可。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值