1_初步了解和试运行
1_初步了解和试运行
前言
本人原来使用的是Flask框架(公司在用),掌握的也不是很好,处于简单会用的层面。然后,公司想转用FastAPI,毕竟能火起来的技术自有可取之道,在此记录自己的学习过程。
学习过程中,主要观看了以下学习视频:- bilibili FastAPI教程第一季
- bilibili FastAPI教程第二季
- bilibili FastAPI教程第三季
目录
虚拟环境(非必须)
虚拟环境是啥这里就不加以解释,简单理解就是每个项目有个独立的运行环境,不会相互影响,毕竟有时你会遇到如使用 python2 和 python3的不同项目,共用一个运行环境可能无法同时适配。
前提
安装好python,并配置好环境变量。(可在命令窗口输入 python 指令查看)
安装虚拟环境(virtualenv)
- 使用python自带的 pip 包管理工具安装virtualenv
- 进入命令窗口,输入 pip install virtualenv (若有多个python 版本,pip默认安装到python2, pip3安装到python3)
- 命令窗口进入项目目录或者文件夹右键Git Bash 打开命令窗口(前提你有装Git),执行 virtualenv envname (envname指虚拟环境名,一般设为 venv 即可,当然你可以设置成其他名字)
- 进入和退出虚拟环境(activate 和 deactivate)
- 前提
命令窗口进入项目所在目录,编辑器打开终端一般就是在项目的根目录了 - 进入(执行命令)
windows: ./venv(即envname)/Scripts/activate
Linux: source ./venv/bin/activate
虚拟环境进入成功,窗口路径前面会添加虚拟环境名,如:(venv)E:\admin_space\fast-api-example> - 退出(已进入虚拟环境)
windows: deactivate
Linux: deactivate
- 前提
安装FastAPI
若使用虚拟环境,需提前进入虚拟环境后执行命令
- pip install fastapi web框架
- pip install uvicorn web服务器(flask用的是werkZeug),其实定义通信网关接口的工具集的库
在Flask项目中,习惯用txt文件管理安装的第三方库和版本(requirements.txt)
在根目录新建一个 requirements 的txt文件,(名字可随意),然后里面输入第三方库和版本
如:fastapi==0.55.1 uvicorn==0.11.5
其它扩展写法此处不涉及
保存后 执行 pip install -r requirements.txt 安装试运行
按照官方文档里例子 FastAPI
新建一个 main.py 文件,按本人以前Flask项目习惯,我用runanpp.py(代替),意指整个程序的入口,即程序启动文件。···# -*- coding: utf-8 -*-from fastapi import FastAPIapp = FastAPI()@app.get("/")async def main():return {"message": "Hello World!"}# 启动服务1(类似java的main函数)if __name__ == '__main__':import uvicornuvicorn.run(app, host="127.0.0.1", port=8000) # 启动服务2,支持自动重启(类似java的main函数)if __name__ == '__main__':import uvicornuvicorn.run(app="runapp:app", host="127.0.0.1", port=8000,reload=True)···
模版引擎
FatsAPI没有指定使用模版引擎,比较灵活,以前Flask用的Jinja2,后续也采用Jinja2来学习和实现网页
安装Jinja2,又使用静态文件,把aiofiles也装上
pin install jinja2
pin install aiofiles
通让的把这些库写到 requirements.txt文件中在项目中创建 templates 文件夹,把要创建的 html 模版文件都在放里面。
Jinja2的语法这里涉及,这里主要举例子。···from fastapi import FastAPIfrom starlette.requests import Requestfrom starlette.templating import Jinja2Templatesapp = FastAPI()# 获取模版路径templates = Jinja2Templates(directory="./app/templates")@app.get("/")async def main():return {"message": "Hello World!"}@app.get("/homes")async def main(request: Request):return templates.TemplateResponse('index.html',{'request': request, 'hello': 'hello Jinja2 12354'}) ···
前面提到函数返回request参数,并作为requst键的值是非必须的,作用等同于我们在Flask中使用模版时用的 this。
试用表单提交数据
表单提交数据,这里特指尝试POST提交方式。
新建一个post数据的页面,简单定义为create.html,里面代码大致如下:···<div><form action="http://127.0.0.1:8000/users" method="post" enctype="application/x-www-form-urlencoded"><label>用户名:</label><br><input type="username" name="username"><br><label>密码:</label><br><input type="password" name="password"><br><input type="submit" value="提交"><br></form></div>···
action属性指定数据提交路径,可以用相对路径,这里我用了绝对路径。
input中name属性的值,等同请求时的参数名。新建一个数据展示页面,简单定义为user.html,里面代码大致如下:
···<div><div><label>用户名:</label><br><span>{{ username }}</span><br></div><div><label>密码:</label><br><span>{{ password }}</span><br></div></div>···
主要用于展示create.html表单中提交的内容。
这里我们需要分别访问两个页面:
···# 用到Form(...),需要引入Form,同样在fastapi中from fastapi import FastAPI, Form# 访问表单页面@app.get("/create")async def create_user(request: Request):data = {'request': request}return templates.TemplateResponse('create.html', data)# 获取表单数据并展示(这里用post,与表单的method属性设置一致)@app.post("/users")async def user_info(request: Request, username: str = Form(...),password: str = Form(...))data = {'request': request,'username': username,'password': password}return templates.TemplateResponse('user.html', data)···
注意:使用Form(…),还需要安装第三方库 python-multipart
pip install python-multipart (方便管理,我们也写进requirements.txt中)Form(…) 的作用是:获取表单中对应的数据,函数中使用该方式获取参数,必须是post请求方式,get请求会报错。(其默认接收表单类型是:“application/x-www-form-urlencoded”)
我们在Flask中获取表单数据(WerkZeug):request.form.get(‘参数名’, ‘’),而Form则是帮我们在传参时完成这些操作,提高开发效率,优化函数内部代码,专注于业务,而非获取参数。
(注意:参数名需与表单input标签中的name属性的值一致)在Flask中,我们都是通过操作request对象来进行参数操作,FastAPI同样支持,使用的是starlette的Request和Response,这里不过多的阐述,因为我也没用过starlette。
简单:- get请求:
request.query_params[‘参数名’] 或 request.query_params.get(‘参数名’, ‘’) (建议用get方式获取,避免参数不存在报错) - post请求:
form = await request.form() (form()是一个异步操作,需要加await等待结果)
form[‘参数名’] 或 form.get(‘参数名’, ‘’)
好像稍微麻烦一点。。。。而且不能享受数据强制验证带来的便利(Pydantic)
- get请求:
试用表单上传文件
导入新模块
···# 接收列表类型需要from typing import List# 文件操作相关from fastapi import File, UplodFile···
创建表单文件
···<form action="/files" enctype="multipart/form-data" method="POST"><input type="file" name="files_list" multiple><br><br><input type="file" name="files_name" multiple><br><br><input type="submit" value="上传"></form>···
进入上传页面
···@app.get("/users")async def user_info(request: Request):data = {'request': request}return templates.TemplateResponse('user.html', data)···
获取数据并展示
···@app.post("/files")async def upload_files(request: Request,files_list: List[bytes] = File(...),files_name: List[UploadFile] = File(...)):data = {'request': request,'file_sizes': [len(file) for file in files_list],'file_names': [file.filename for file in files_name]}return templates.TemplateResponse('user.html', data)···
我提交和展示都写在user.html页面了,浏览器跳转指定页面要用get请求。
相较于提交普通的表单,上传文件用的是 File(…) 获取,作用类似Form(…),不深入阐释,因为也不是很懂。从typingm模块导入List的作用是为了接收列表类型的参数数据:
- files_list: List[bytes] = File(…) (允许接收多个文件)
- files_list: bytes = File(…) (只允许接收单个文件)
其它一些文件操作,如获取文件名、类型等操作(文件类型必须是UploadFile,是starlette的):
- files_name: List[UploadFile] = File(…)
FatsAPI支持bytes和UploadFile两种文件格式,而UploadFile相较bytes的优点有:
- 使用假脱机文件(超过内存文件存储限制,将存储在磁盘中)
- 适用于大型文件,不会占用所有内存
- 可以从上传的文件获取元数据
- 具有类似文件的接口
补充
- Form(…) 和 File(…) 中‘…’ 代表什么
理解为参数是必须的,为空会报错,Form(None)…则非必须
- Form(…) 和 File(…) 中‘…’ 代表什么
1_初步了解和试运行相关推荐
- 大型运维环境实施安全加固
大型运维环境实施安全加固 -------------------------------------------------------------------------------- 前言 安全加 ...
- 广州住房公积金管理中心综合业务管理系统容灾项目
各投标人: 广州住房公积金管理中心综合业务管理系统容灾项目(项目编号:GZIT2010-ZB0103)的评标工作已结束,评审委员会按照采购文件约定的程序和方法进行评审,同意并推荐了中标供应商,推荐意见 ...
- 广州住房公积金管理中心综合业务管理系统容灾项目中标公告
各投标人: 广州住房公积金管理中心综合业务管理系统容灾项目(项目编号:GZIT2010-ZB0103)的评标工作已结束,评审委员会按照采购文件约定的程序和方法进行评审,同意并推荐了中标供应商,推荐意见 ...
- 广州住房公积金管理中心综合业务管理系统容灾项目(GZIT2010-ZB0103)招标公告...
的总体集成及竣工验收.根据广州市财政局<转发关于印发〈政府采购进口产品管理办法〉的通知>(穗财采[2008]171号)的有关规定,本项目所采购的产品(除小型计算机.负载均衡交换机.光纤磁盘 ...
- 中国移动助力雄安新区建设统一物联网开放平台,破解传统智慧城市建设瓶颈难题
近年来,智慧城市建设如火如荼,国家密集出台了<关于促进智慧城市健康发展的指导意见>.<"十三五"国家信息化规划>.<智慧城市信息技术运营指南>等 ...
- 关于信息系统工程中的验收问题探讨
其实信息系统工程的验收可以参照发改委2007年55号令的要求进行,定义为初步验收和最终验收两个阶段,但对于两个阶段间隔时间却没有明确规定,也没有针对各个行业信息系统工程分别说明,因此,根据本人从事几个 ...
- Nebula Graph学习篇1_基础概念、初步使用、整合SpringBoot使用
目录 一.基础概念 图数据库的概念 适用场景 数据模型 路径 点的VID 架构 二.初步使用 Windows安装Nebula-Graph服务 Nebula Console 连接 Nebula-Grap ...
- 清华“法律数据科研平台”向校内师生开放试运行
为进一步响应学校"跨学科建设"的号召,清华大学社会科学学院刘涛雄教授在清华大学第一届全国计算社会科学高端论坛首次对外透露,作为计算社会科学学科平台的子平台,"法律数据科研 ...
- Python 框架之Flask初步了解
Python 框架之Flask初步了解 前言 在了解python web 框架之前,我们需要先了解框架实现的基本原理.首先,需要了解WSGI(Web Server Gateway Interfac ...
最新文章
- mysql三大范式 答案_数据库三大范式定义与理解
- 【机器学习】特征工程概述
- Attaching to process 29139 Could not attach to process.
- SpringBoot 配置 generator代码生成+knife4j接口文档(2种模板设置、逻辑删除、字段填充 含代码粘贴可用)保姆级教程(注意事项+建表SQL+代码生成类封装+测试类)
- 企业贷款还不上,股东有偿还责任吗?
- androidsettitle方法_Android 去掉title bar的3个方法
- 互联网架构“高并发”
- python爬虫筛选数据_[python爬虫]使用beautifulsoup库的select方法对网页内容进行筛选...
- python re正则_正则表达式+Python re模块详解
- [SDOI2012]Longge的问题 phi运用
- Sqlserver的一些小笔记
- 人工智能导论测试题——第3章自动推理与专家系统
- 微信小程序万里目_微信小程序“注册”你不知道的秘密
- 索氏提取器使用注意_索氏提取器的使用方法
- zblog mysql修改_ZBlog教程 之 修改ZBlog数据库前缀
- 37互娱,2019秋招提前批,Java服务端二面
- 杭州电子科技大学acm--2022
- 实习时候的亚子==(四)
- PS2023磨皮滤镜插件Portraiture人像美容
- 关于GBK中的英文字符占用一个字节还是两个字节的问题