FastAPI--基本操作到部署

官文敬上:虽然看不明白
官方文档

安装框架

pip install fastapi					-- web框架
pip install uvicorn					--基于高并发的模块,fastapi启动依赖于它

写一个最简单的接口

import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get('/')							#一个get请求
async def root():
    return {'hello':'World'}		    #返回值


if __name__ == '__main__':
    uvicorn.run(app,host='127.0.0.1',port=8000)    #可以直接运行此脚本
  
    
#uvicorn polls:app --reload   
#uvicorn 文件名:实例名 --在代码改变后重启服务器,只能在开发的时候使用
#命令行启动必须进入该文件的根路径

Fastapi自带接口文档

启动项目后访问127.0.0.1:8000/docs
127.0.0.1:8000/redoc

fastapi使用模板渲染

pip install jinja2		  -- 安装模板渲染模块


import uvicorn
from fastapi import FastAPI
from starlette.requests import Request
from starlette.templating import Jinja2Templates

app = FastAPI()
templates = Jinja2Templates(directory='../templates')     #模板路径


@app.get('/')
async def root(request:Request):   #必须有这个参数,拿不到数据
    return templates.TemplateResponse('index.html',{'request':request,'hello':'测试数据'})
		#渲染的模板名, 后面的hello为模板的变量名,后面是数据

if __name__ == '__main__':
    uvicorn.run(app, host='127.0.0.1', port=8000)

# uvicorn polls:app --reload
# uvicorn 文件名:实例名 --在代码改变后重启服务器,只能在开发的时候使用
	



#测试渲染模板index.html中
	
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>{{ hello }}</h1>
    </body>
</html>

#启动运行项目.可以看到渲染成功的页面

路径参数的传递

import uvicorn
from fastapi import FastAPI

app = FastAPI()


@app.get('/{user_id}/')
async def root(user_id):
    return user_id


if __name__ == '__main__':
    uvicorn.run(app, host='127.0.0.1', port=8000)

#请求http://127.0.0.1:8000/12555/      可以看到12555
----------------------------------------------------------------------------












#预定传递路径参数(也就是路径参数必须是我们提前预设的值)
import uvicorn
from enum import Enum
from fastapi import FastAPI

app = FastAPI()

class ModelName(str,Enum):   #意思就是底下{name}中的值必须为我们这个类中定义的三个属性值
    alexent = 'alexnet'
    resnet = 'resnt' 	#比如,我们定义resnt,那么必须在url中输入resnt才可以执行进视图函数
    lenet = 'lenet'		#如果输入为resnet,则不可以进入视图函数        


@app.get('/api/{name}/')		#如果我们name中的值不是我们上面定义好的属性值,那么返回错误json
async def root(name: ModelName):
    if name == ModelName.alexent:				#这种方式检查路径参数比较优雅
        return {'mes':'alexent'}
    if name.value == 'lenet':					#这种方式也可以取到路径参数中的值
        return {'name':name,'mes':'lenet'}
    return {"name":name,'mes':'resnet'}

---------------------------------------------------------------------------------















#路径参数中包含路径参数(例如:api/1/2/3)
@app.get('/api/{name:path}/')
async def root(name):
	return {'mes':name}
#浏览器中随便输入,可接受多个路径参数

参数传递的类型检验(校验)

#python3.6中已经支持声明变量的类型

@app.get('/api/{user_id}/')
async def root(user_id: bool):     #这种情况下user_id被声明为bool类型,如果传递别的参数,那就type error
	return user_id

查询参数(中间带?的参数)

import uvicorn
from fastapi import FastAPI

app = FastAPI() 
fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]


@app.get("/items/")					 
async def read_item(page:int=0, size:int=10):   #当然这里不声明的话,在切片的时候声明也是可以的
    return fake_items_db[page : page + size] 
    #默认查10条,从page条开始查
#请求:127.0.0.1:8000/items/?page=1
注意:如果请求127.0.0.1:8000/items/  相当于执行视图函数中参数的默认值

输出为:
[
	{
	item_name: "Bar"
	},
	{
	item_name: "Baz"
	}
]

路径参数和查询参数配合使用

from typing import Optional
import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/api/{name}/")
async def read_item(name:str,age:Optional[str] = None): #官文中这样使用(可以理解为是可选参数)
    if age:											
        return {'name':name,'age':age}
    return name

POST请求拿raw(json)数据

from typing import Optional			
from fastapi import FastAPI
from pydantic import BaseModel

class Item(BaseModel):					#必须先定义json参数的模型
    name: str		
    description: Optional[str] = None     #非必选参数
    price: float
    tax: Optional[float] = None				#非必选参数

app = FastAPI()

@app.post("/items/")
async def create_item(item: Item):
    return item
输出如下:

在这里插入图片描述

@app.post("/items/")
async def create_item(item: Item):
	print(item.dict())							#转化字典
    item_dict = item.dict()					#可以通过.对象的方法来获取值
    if item.tax:
        price_with_tax = item.price + item.tax
        item_dict.update({"price_with_tax": price_with_tax})
    return item_dict

POST请求拿from(表单)数据

pip install python-multipart						#装模块

from fastapi import FastAPI, Form

app = FastAPI()

@app.post("/login/")
async def login(username: str = Form(...), password: str = Form(...)):  #可以拿到表单数据
    return {"username": username,"passwod":password}
如下:

在这里插入图片描述
文件流上传

from fastapi import FastAPI, File, UploadFile

app = FastAPI()

@app.post("/files/")           #这种方式是在表单中提交,需要前端吧文件转字节码
async def create_file(file: bytes = File(...)):		
    print(file)
    return {"file_size": file}
#注意:这种方式是吧文件存在内存中,适合小文件传输

表单中文件上传

from fastapi import FastAPI, File, UploadFile

app = FastAPI()

@app.post("/files/")
async def upload_file(file: UploadFile = File(...)):
    content = await file.read()					#一次性读取,文件太大服务器就得崩溃
    with open(f'{file.filename}','wb') as f:
        f.write(content)
    return {"filename": file.filename,'content_type':file.content_type}
#注意:这种方式只适合小文件上传
--------------------------------------------------------------------------------











#大文件上传		
from fastapi import FastAPI, File, UploadFile

app = FastAPI()

@app.post("/files/")
async def upload_file(file: UploadFile = File(...)):
    with open(f'{file.filename}','wb') as f:
        for i in iter(lambda : file.file.read(512),b''):
            f.write(i)
    f.close()

    return {"filename": file.filename,'content_type':file.content_type}

UploadFile
UploadFile 具有以下属性:

filename:str具有上载的原始文件名的A (例如myimage.jpg)。
content_type:str具有内容类型(MIME类型/媒体类型)(例如image/jpeg)的A。
file:一个SpooledTemporaryFile(类似文件的对象)。这是实际的Python文件,您可以将其直接传递给需要“类文件”对象的其他函数或库。
UploadFile具有以下async方法。它们都调用了下面的相应文件方法(使用internal SpooledTemporaryFile)。

write(data):将data(str或bytes)写入文件。
read(size):读取size(int)个文件的字节/字符。
seek(offset):转到文件中的字节位置offset(int)。
例如,await myfile.seek(0)将转到文件的开头。
如果您运行await myfile.read()一次然后需要再次读取内容,则此功能特别有用。
close():关闭文件。

批量上传文件

from typing import List
from fastapi import FastAPI, File, UploadFile

app = FastAPI()

@app.post("/file/")
async def create_files(files: List[bytes] = File(...)):
    return {"file_sizes": [len(file) for file in files]} 
#注意:这里必须前端表单中必须为file类型,而不是上面的text类型


@app.post("/files/")
async def create_upload_files(files: List[UploadFile] = File(...)):
    return {"filenames": [file.filename for file in files]}
#注意:表单中包含多个files文件,推荐使用这种方法
----------------------------------------------------------------------------------






#大文件批量上传
@app.post("/files/")
async def create_upload_files(files: List[UploadFile] = File(...)):
    for file in files:
        with open(f'{file.filename}','wb') as f:
            for i in iter(lambda : file.file.read(512),b''):
                f.write(i)
            f.close()
    return {"filenames": [file.filename for file in files]}

表单中text与file类型配合使用

from fastapi import FastAPI, File, Form, UploadFile

app = FastAPI()


@app.post("/files/")
async def create_file(
    file: bytes = File(...), fileb: UploadFile = File(...), token: str = Form(...)
):
    return {
        "file_size": len(file),
        "token": token,
        "fileb_content_type": fileb.content_type,
    }

配置跨域资源共享

  • allow_origins-应该允许进行跨域请求的来源列表。例如[‘https://example.org’, ‘https://www.example.org’]。您可以[‘*’]用来允许任何来源。

  • allow_origin_regex-一个正则表达式字符串,与应允许进行跨域请求的原点匹配。例如。‘https://.*.example.org’。

  • allow_methods-跨域请求应允许的HTTP方法列表。默认为[‘GET’]。您可以使用[‘*’]允许所有标准方法。

  • allow_headers-跨域请求应支持的HTTP请求标头列表。默认为[]。您可以[‘*’]用来允许所有标头。的Accept,Accept-Language,Content-Language和Content-Type头总是允许CORS请求。

  • allow_credentials-表示跨域请求应支持cookie。默认为False。

  • expose_headers-指出应该使浏览器可以访问的任何响应头。默认为[]。
    max_age-设置浏览器缓存CORS响应的最长时间(以秒为单位)。默认为600。

      from fastapi.middleware.cors import CORSMiddleware
      
      app = FastAPI()
      
      origins = [
         "*",
      ]
      
      app.add_middleware(
          CORSMiddleware,
          allow_origins=origins,
          allow_credentials=True,
          allow_methods=["*"],
          allow_headers=["*"],
      )
    

部署fastapi

利用进程管理gunicorn

流式响应

在 FastAPI 中,可以通过 StreamingResponse 类来实现流式响应。StreamingResponse 类需要传入一个生成器函数,该函数会在响应被发送到客户端时逐步生成响应内容。

以下是一个示例代码,演示如何使用 StreamingResponse 类返回流式响应:

from fastapi import FastAPI, Response
from fastapi.responses import StreamingResponse
import time

app = FastAPI()

def generate():
    for i in range(10):
        yield f"streaming response {i}\n"
        time.sleep(1)

@app.get("/stream")
async def stream():
    return StreamingResponse(generate())

在上面的示例中,generate 函数是一个生成器函数,它会逐步生成响应内容。stream 函数使用 StreamingResponse 类来返回流式响应,generate 函数作为参数传入 StreamingResponse 类的构造函数中。

当客户端请求 /stream 路径时,stream 函数会返回一个 StreamingResponse 对象,该对象会逐步生成响应内容并发送到客户端。客户端可以通过读取响应内容来逐步接收数据。

需要注意的是,由于 StreamingResponse 类会逐步生成响应内容,因此在生成器函数中需要适当地添加延时,以便客户端有足够的时间来接收数据。

### 回答1: renren-fast-vue 是一个基于 Vue.js 和 Element UI 的后台管理系统模板,用于快速开发企业级管理系统。要部署 renren-fast-vue,您需要按照以下步骤进行操作: 1. 克隆 renren-fast-vue 代码库到本地。 2. 安装 Node.js 和 npm。 3. 在命令行中进入 renren-fast-vue 项目目录,运行 npm install 命令安装依赖。 4. 修改 config/index.js 文件中的 dev 和 prod 环境的 API 地址,使其指向您的后端服务地址。 5. 运行 npm run dev 命令启动开发服务器,或者运行 npm run build 命令构建生产环境代码。 6. 将生成的 dist 目录中的文件上传到您的 Web 服务器上,即可完成部署。 以上是 renren-fast-vue 部署的基本步骤,具体操作可能会因环境和需求而有所不同。如果您遇到任何问题,可以参考 renren-fast-vue 的文档或者向社区寻求帮助。 ### 回答2: renren-fast-vue 是一款基于 Vue.js 和 SpringBoot 的前后端分离快速开发平台,在进行部署时需要进行以下步骤: 1. 服务器环境搭建:需要安装 JDK、Maven、Nginx 等工具。 2. 下载源码:可以通过 GitHub 下载 renren-fast-vue 的源码,并且可以根据具体需要进行个性化的定制。 3. 配置数据库:可以在 application.yml 文件中,填写数据库配置信息,支持 MySQL、Oracle、SQL Server 等多种数据库。 4. 打包部署:可以通过 Maven 将前后端代码打包为一个 WAR 包,并且可以将其通过 Tomcat、Jetty 等 Web 服务器进行部署。 5. 配置反向代理:可以通过 Nginx 进行部署,将 HTTP 请求转发到后端的接口,这样可以提高系统的稳定性和安全性。 6. 配置域名和SSL:可以通过购买域名和 SSL 证书,并且将其配置到 Nginx 上,以保证系统的正常运行。 7. 配置缓存和负载均衡:可以通过 Redis 缓存和负载均衡器等技术,来提高系统的性能和可用性。 总之,在进行 renren-fast-vue 的部署时,需要进行全面的准备工作,并且要考虑到所有的细节,以确保系统的顺利运行。同时,也需要持续进行监控和维护,以保证系统的稳定性和安全性。 ### 回答3: renren-fast-vue 是一个基于 Vue.js 技术栈的前后端分离的开发框架,提供了快速搭建前后端分离的基本架构和多种组件库、工具库、UI 库等等。如果你想要部署 renren-fast-vue,可以按照以下步骤进行。 首先,你需要确保你的电脑上已经安装了 Node.js,可以在命令行窗口中输入 node -v 命令,如果输出版本信息就证明已经安装成功了。 接着,你需要将 renren-fast-vue 的源代码从 Github 上克隆到本地电脑上。可以在命令行窗口中输入以下命令: ```bash git clone https://github.com/renrenio/renren-fast-vue.git ``` 克隆完成之后,进入 renren-fast-vue 目录,输入以下命令安装依赖: ```bash cd renren-fast-vue npm install ``` 安装依赖完成后,你可以运行以下命令启动前端页面: ```bash npm run dev ``` 此时,你可以在浏览器中访问 http://localhost:8000,就可以看到 renren-fast-vue 的前端页面了。 如果你想要部署后端,需要在 renren-fast-vue 目录下找到 renren-generator 目录,运行以下命令生成代码: ```bash npm run gen src/server.java ``` 这条命令会在 src 目录下生成 server.java 文件,你需要用一个 Java IDE 打开这个文件,运行 main 方法启动后端服务器。 以上就是部署 renren-fast-vue 的基本步骤,如果你想要进一步优化和部署,可以参考官方文档或者通过搜索引擎和开发社区获取更多的技巧和经验。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像风一样的男人@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值