赞
踩
基于以下第三方包开发(部分):
安装
.venv1
是虚拟环境名,不一定是这个可以自己起名。
安装教程
激活:
venv1\Scripts\activate
在虚拟环境中使用以下命令即可
pip install fastapi
由于启动需要依赖于Uvicorn
,还需要安装,命令如下
uvicorn
官方解释:自行搜索。
通俗解释:就是一个ASGI服务器,就是把你代码跑在一个你认识的一个平台上。
ASGI服务器:
解释:异步网关协议接口。它是介于网络协议服务和Python应用之间的标准接口。
通俗解释:就是能够处理多种通用的协议类型,例如:HTTP、HTTP2、WebSocket等
pip install uvicorn
这种情况就是端口占用
这种情况博主还没解决,不过在PyCharm
中运行就不会出现。
在虚拟环境中运行
main.py
文件from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello","World"}
第一行:导入了FastAPI
类
第二行:创建了该类的一个实例
第四行:使用app()装饰器告诉FastAPI
什么样的URL能触发被装饰的函数。
需要注意的是:
get
操作方法更改成@app.post()、@app.put()、@app.delete()
等方法("/hello_word/")
uvicorn main:app --reload
参数说明:
main:
main.py文件
app :
在main.py内部创建的对象,通过app = FastAPI()
创建
--reload :
使服务器在代码更改后重新启动,仅在开发的时候使用就好了。
也可以不在虚拟环境下运行,这就需要在本机上安装上面说的两个库。
步骤和上面是类似的。
我们可不可以不用命令行运行呢,是可以的,看下面代码:
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello","World"}
if __name__ == '__main__':
uvicorn.run(app=app,host="127.0.0.1",port=8000)
添加了
import uvicorn
if __name__ == '__main__':
uvicorn.run(app=app,host="127.0.0.1",port=8000)
.host="127.0.0.1",port=8000
,表示指定本地电脑为服务器,端口号为8001
在PyCharm
直接运行即可
.FastAPI
提供了两种文档形式:交互式API 文档 和备份API 文档
在新建的main.py
文件中写入,如下代码:
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello","World"}
@app.get("/items/{item_id}")
def read_item(item_id:int,q:str =None):
return {"item_id":item_id,"q":q}
if __name__ == '__main__':
uvicorn.run(app=app,host="127.0.0.1",port=8000)
我们重点看第二个函数,其中{item_id}
是路径参数,q:str =None
是查询参数,详细的会在后边解释。
我们运行后,在浏览器中输入http://127.0.0.1:8000/docs
图中的== GET ==就是 @app.get("/")
指定的请求方式,我们点击第二个
填入信息后 单击 Execute
按钮。
程序就会响应。
交互式是在后边添加docs
备份则是 redoc
@app.get("/items/{item_id}")
def read_item(item_id:int):
return {"item_id":item_id}
{item_id}
就是路径参数,其值会作为参数item_id
传递到read_item
视图函数中。路径参数有多种类型,如int 、str、float
等
如上面的 item_id:int
就是将路径参数指定为int
类型
我输入http://127.0.0.1:8000/items/sd
因为sd 是字符串型,而不是int型
。
有了上面的路径参数,或许你会问了,
@app.get("/items/me")
@app.get("/items/{item_id}")
当我输入http://127.0.0.1:8000/items/me
会调用那个?
当声明不属于路径参数的其他函数参数时, FastAPI
会将其自动解释为Query
参数,也就是查询参数。Query参数就是**URL地址中“?”之后的一系列 value键值对,每组键值对用“&”分割开来。**这也是我们在网址中经常看到的。
Query 参数 是在视图函数中声明的:如
@app.get("/items/{item_id}")
def read_item(item_id:int,q:str =None):
return {"item_id":item_id,"q":q}
q:str =None
中 q 就是Query 参数。Query 参数不是path 中固定的部分,它们是可选的,并且有默认值。
在上面的例子中,Query 参数 拥有默认值 q= None
如果访问http://127.0.0.1:8000/items/1
得到
Pydantic
模型实现请求体总共包含三个步骤。
(1)定义模型。从pydantic
中导入BaseModel
from pydantic import BaseModel
(2)创建模型。声明模型需要一个类,且该类继承BaseModel
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
和Query参数
一样:数据类型的属性如果不是必须的话,可以拥有一个默认值或者是可选None。否则,该属性就是必须的。
Header
类from fastapi import FastAPI,Header
Header
参数。第一个值是默认值,可以传递所以验证或注释参数。from fastapi import FastAPI,Header
app = FastAPI()
&app.get("/items/")
async def read_items(*,userget : str = Header(None)):
return {"userget":userget}
Form
类需要先安装python-multipart
,安装命令如下pip install python-multipart
FastAPI
中导入 Form
from fastapi import FastAPI,Form
Form
参数。from fastapi import FastAPI,Form
app = FastAPI()
@app.post("/login/")
async def login(*,
userneme : str = Form(...),
password : str = Form(...)
):
return {"userneme":userneme}
注意:async
是异步async/await
功能。
因为用到 ORM框架
:SQLAlchemy
。所以可以看下面这篇文章了解一下。
ORM
使用SQLAlchemy
进行数据库操作,其具体设置如下:
class Config:
SECRET_KEY = 'mrsoft' #密钥
SQLALCHEMY_TRACK_MODIFICATIONS = True
# 数据库链接地址
SQLALCHEMY_DATABASE_URL = "mysql+pymysql://root:andy123456@localhost/idiom?charset=utf8mb4"
dialect+driver://username:password@host:port/database
charset=utf8
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from fastapi_idiom.config import Config
#创建引擎
engine = create_engine(Config.SQLALCHEMY_DATABASE_URL)
#创建数据库会话
SessionLocal = sessionmaker(autocommit= False,autoflush =False,bind = engine)
#声明基类,创建了一个ORM基类
Base = declarative_base()
from sqlalchemy import Column,Integer,String,DateTime from fastapi_idiom.models.database import Base from datetime import datetime #会员数据模型 #定义 User 类 class User(Base): __tanlename__ = "user" #定义表名 # 定义属性 #在这个ORM模型中创建一些属性,来跟表中的字段进行一一映射。这些属性必须#是sqlalchemy给我们提供好的数据类型 id = Column(Integer,primary_key=True,index=True) openid = Column(String(80)) nickname = Column(String(100)) avatar = Column(String(255)) level = Column(Integer) addtime = Column(DateTime,index=True,default=datetime.now) def __repr__(self): #Python中这个_repr_函数,对应repr(object)这个函数,返回一个可以用来表示对象的可打印字符串: return '<User %r>'%self.nickname
为了实现代码重用,需要将模型对象用到的方法写入 一个文件中。
from datetime import datetime import sqlalchemy from fastapi_idiom.models.database import SessionLocal from .models import User,Game db = SessionLocal() #创建会话 # 获取用户信息 def get_user(openid : str): return db.query(User).filter(User.openid == openid).first() #创建用户 def create_user(openid ,nickname,avatar): db_user = User( openid = openid, nickname = nickname, avatar = avatar, level = 0, addtime = datetime.now() ) db.add(db_user) db.commit() db.refresh(db_user) return db_user
详细的SQLAlchemy
使用可以参考这篇文章:
SQLAlchemy
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。