一、说明
本文章就是记录自己的学习过程,如果有用您可以参考,没用你就略过,没有好与不好之分,今天主要是参考了gitee上的一些项目,一步一步的往后i建立
对于学习来说,如果您有java c++等经验,python相对来说简单,当然是入门简单,所以找个简单的教材看看就可开始干了,当然面试除外,问的问题不一样,毕竟不允许你bug多不是。自己学,多点bug也不是坏事,但是面试不一样,得好好学,我不用去面试,就边学边干
至于为什么选fastapi而不是django,这个也是听说fastapi效率更高,还有就是如果以后采集数据,进行数据处理,深度学习不知道会不会更好,反正网上说更适合,我也就用了
二、安装要用的包
既然是站在巨人的肩膀(RuoYi-Vue3-FastAPI)之上,就不客气了,直接搞个requirements.txt文件,装吧,前端好多都是这么玩的(nodejs),在根目录建一个requirements.txt
进入项目根目录直接装
安装之前设置一下pip源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install -r requirements.txt
我这里出错了,python 版本3.8 不行,后来升级了3.9,包的版本和python版本不匹配造成的。
后来又出错了:ERROR: pandas 2.1.4 has requirement pytz>=2020.1, but you'll have pytz 2019.3 which is incompatible.
pip install --upgrade pytz
安装最新的就可以了,后来在别的机器上跑了一遍,没有这一错误
三、导入数据库
前面讲过,我们是在RuoYi-Vue3-FastAPI的基础上学习,所以数据库直接导入,比较数据库的设计还是花时间的,直接搞定框架,再回来学习
没有装远程链接工具,直接用命令行导入
e) jiangkping@bm1dqvp3wr5zfyw:~/Downloads$ sudo mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.0.21 MySQL Community Server - GPLCopyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> CREATE DATABASE victor CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Query OK, 1 row affected (0.01 sec)
数据sql文件目录/home/jiangkping/Desktop/mucauna-fastapi/sql/victor.sql
(base) jiangkping@bm1dqvp3wr5zfyw:~/Downloads$ sudo mysql -u root -p victor < /home/jiangkping/Desktop/mucauna-fastapi/sql/victor.sql
Enter password:
(base) jiangkping@bm1dqvp3wr5zfyw:~/Downloads$ sudo mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 8.0.21 MySQL Community Server - GPLCopyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use victor;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> show tables;
+------------------+
| Tables_in_victor |
+------------------+
| gen_table |
| gen_table_column |
| sys_config |
| sys_dept |
| sys_dict_data |
| sys_dict_type |
| sys_job |
| sys_job_log |
| sys_logininfor |
| sys_menu |
| sys_notice |
| sys_oper_log |
| sys_post |
| sys_role |
| sys_role_dept |
| sys_role_menu |
| sys_user |
| sys_user_post |
| sys_user_role |
+------------------+
19 rows in set (0.00 sec)
显示出table了,证明导入成功
四、建立后端代码框架
这可不是我的功劳,我就是个搬运工,搬运代码之后是这个样子,证明有戏,下面把步骤贴上,明天做几个接口测试一下数据库和redis,这个必须要保证
1、拷贝config目录
里面有编译不过的,直接注释,基本都是controler接口里的,先干掉,编译再说;SchedulerUtil的先清空,给个空文件,会编译不过
2、拷贝utils目录,和前面一样
3、拷贝middlewares、exceptions、sub_applications,
和前面一样,直接加上就行了,不过这3个目录我放到了一起systemhandle目录里面去了
见图
4、建立 server.py
from fastapi import FastAPI
from config.env import AppConfig
from config.get_redis import RedisUtil
from config.get_db import init_create_table
# from config.get_scheduler import SchedulerUtil
from utils.log_util import logger
from utils.common_util import worship
from contextlib import asynccontextmanager
from systemhandle.subApp.handle import handle_sub_applications
from systemhandle.middlewares.handle import handle_middleware
from systemhandle.exceptions.handle import handle_exception
# 生命周期事件
@asynccontextmanager
async def lifespan(app: FastAPI):
logger.info(f"{AppConfig.app_name}开始启动")
worship()
await init_create_table()
app.state.redis = await RedisUtil.create_redis_pool()
await RedisUtil.init_sys_dict(app.state.redis)
await RedisUtil.init_sys_config(app.state.redis)
# await SchedulerUtil.init_system_scheduler()
logger.info(f"{AppConfig.app_name}启动成功")
yield
await RedisUtil.close_redis_pool(app)
# await SchedulerUtil.close_system_scheduler()
# 初始化FastAPI对象
app = FastAPI(
title=AppConfig.app_name,
description=f'{AppConfig.app_name}接口文档',
version=AppConfig.app_version,
lifespan=lifespan
)# 挂载子应用
handle_sub_applications(app)
# 加载中间件处理方法
handle_middleware(app)
# 加载全局异常处理方法
handle_exception(app)# 加载路由列表
controller_list = [
#先全部去掉,后面再一个一个加
]for controller in controller_list:
app.include_router(router=controller.get('router'), tags=controller.get('tags'))
这个加进去后会出现编译错误,主要是包路径的问题,和我自己有关,我改了路径,你们不改的,没关系,3个handle.py里处理下路径,就是多了个systemhandle的路径
5、建立app.py
import uvicorn
from server import app, AppConfig
if __name__ == '__main__':
uvicorn.run(
app='app:app',
host=AppConfig.app_host,
port=AppConfig.app_port,
root_path=AppConfig.app_root_path,
reload=AppConfig.app_reload
)
6、环境变量文件
.env.dev和.env.prod,拷贝过来根据自己的改下就行了
# -------- 应用配置 --------
# 应用运行环境
APP_ENV = 'dev'
# 应用名称
APP_NAME = 'mucauna-fastapi'
# 应用代理路径
APP_ROOT_PATH = '/dev-api'
# 应用主机
APP_HOST = '0.0.0.0'
# 应用端口
APP_PORT = 9999
# 应用版本
APP_VERSION= '0.0.1'
# 应用是否开启热重载
APP_RELOAD = true
# 应用是否开启IP归属区域查询
APP_IP_LOCATION_QUERY = true
# 应用是否允许账号同时登录
APP_SAME_TIME_LOGIN = true# -------- Jwt配置 --------
# Jwt秘钥 openssl rand -hex 32就可生成
JWT_SECRET_KEY = 'cff428973c740c9894d0877c30764a269f48e77254969e6823f51a5eda415da5'
# Jwt算法
JWT_ALGORITHM = 'HS256'
# 令牌过期时间
JWT_EXPIRE_MINUTES = 1440
# redis中令牌过期时间
JWT_REDIS_EXPIRE_MINUTES = 30
# -------- 数据库配置 --------
# 数据库主机
DB_HOST = '127.0.0.1'
# 数据库端口
DB_PORT = 3306
# 数据库用户名
DB_USERNAME = 'root'
# 数据库密码
DB_PASSWORD = '123456'
# 数据库名称
DB_DATABASE = 'victor'
# 是否开启sqlalchemy日志
DB_ECHO = true# -------- Redis配置 --------
# Redis主机
REDIS_HOST = '127.0.0.1'
# Redis端口
REDIS_PORT = 6379
# Redis用户名
REDIS_USERNAME = ''
# Redis密码
REDIS_PASSWORD = ''
# Redis数据库
REDIS_DATABASE = 0
7、测试下
http://localhost:8080/dev-api/docs
有效果的
我们今天就加这么多,明天再来
外网也是OK的