简介
很多同学想用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
调用接口
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
完整代码文件,在本文标题与正文之间,点击下载即可。