说到web开发框架,我平时用的比较多的有Flask和Django,其中Flask是一个轻量级的开发框架,写一个API接口也很方便,但是我们今天要介绍的框架FastAPI在Python开发者中也有很好的口碑,所以在开始之前,我们首先要安装我们需要的模块,使用pip命令。pipinstallfastapi和ASGIserver可以使用uvicorn,那就一样了。pipinstalluvicornHelloWorld我们先尝试使用Flask框架写一个HelloWorld,代码如下:fromflaskimportFlask,requestimportjsonapp=Flask(__name__)@app.route('/')defhello_world():return'helloworld'if__name__=='__main__':app.run(host='0.0.0.0',port=8889)编辑器使用的开发工具是Pycharm。当我们运行这个脚本时,会弹出如下结果。然后在浏览器中输入弹出的url访问页面,会出现一个包含“helloworld”的页面,如下图。从代码的逻辑上看,app=Flask(__name__)是创建一个Flask程序实例。我们在浏览器中输入url向web服务器发送请求,然后web服务器将url转发给Flask程序实例,所以我们需要知道对于每个url请求需要启动哪部分代码,所以保存了url和Python函数的映射关系,通过路由处理两者的关系,使用程序实例的app.route装饰器实现。并执行最后的app.run()启动服务,0.0.0.0表示监听所有地址,指定端口号为8889,接下来我们看看对应的FastAPI版本“HelloWorld”是什么样子的,代码如下:fromfastapiimportFastAPIfromfastapi.responsesimportPlainTextResponse,HTMLResponse,FileResponseimportuvicornapp=FastAPI()@app.get("/",response_class=PlainTextResponse)asyncdefhello():##async可以加也可以不加,这可以随意返回"HelloWorld!"@app.get("/items/{item_id}")defread_item(item_id:int,q:str=None):return{"item_id":item_id,"q":q}if__name__=='__main__':uvicorn.run('fast_api_1:app',host='0.0.0.0',port=8000)让我们也运行这段代码。FastAPI默认的监听地址是127.0.0.1,指定的端口号是8000,所以我们输入http://127.0.0.1:8000/,结果如下:由于返回的是字符串,所以我们填写response_class和PlainTextResponse,我们也可以在浏览器中输入http:///127.0.0.1:8000/items/5?q=somequery,结果如下:返回一个随机数我们在上面的基础上再写几个案例“HelloWorld”,比如返回一个随机数的操作,在Flask框架中的代码如下:@app.route('/random-number')defrandom_number():returnstr(random.randrange(100))下面在浏览器中测试一下结果,如下图:FastAPI框架中的代码也很相似。@app.get('/random-number',response_class=PlainTextResponse)asyncdefrandom_number():returnstr(random.randrange(100))判断是否都是字母组成接下来我们看一下,当我们发送GET请求,判断其中一个url请求参数是否由字母组成,Flask框架中的代码如下:@app.route('/alpha',methods=['GET'])defalpha():text=request.args.get('text','')result={'text':text,'is_alpha':text.isalpha()}returnjsonify(result)让我们在浏览器中测试结果,如如下所示:FastAPI框架中对应的代码如下:@app.get('/alpha')asyncdefalpha(text:str):result={'text':text,'is_alpha':text.isalpha()}returnresult创建新用户以上案例均为GET请求。让我们看看如何处理POST请求。比如我们想通过POST请求创建一个新用户,Flask框架中的代码如下:@app.route('/create-user',methods=['POST'])defcreate_user():id=request.form.get('id','0001')name=request.form.get('name','Anonymous')data={'id':id,'name':name}result={'status_code':'0','status_message':'Success','data':data}returnjsonify(result)可以直接在Postman中测试API的功能,如下图:我们需要在"methods"表示使用POST请求,但是在FastAPI框架中,不需要指定,直接只需使用app.post()装饰器:@app.post('/create-user')asyncdefcreate_user(id:str=Form(...),name:str=Form(...)):data={'id':id,'name':name}result={'status_code':'0','status_message':'Success','data':data}returnresult返回一个静态页面,如果touch时它到了返回静态页面的时候,Flask框架中的代码是这样的@app.route('/get-webpage',methods=['GET'])defget_webpage():returnrender_template('flask_1.html',message="ContactUs")在FastAPI中有点麻烦framework,代码如下:app.mount("/static",StaticFiles(directory="static"),name="static")##用于加载静态页面templates=Jinja2Templates(directory="templates")@app.get('/get-webpage',response_class=HTMLResponse)asyncdefget_webpage(request:Request):returntemplates.TemplateResponse("index.html",{"request":request,"message":"联系我们"})由于return是一个静态页面,所以response_class对应的是HTMLResponse总结把上面写的所有Flask代码总结一下,如下:('/')defhello_world():return'helloworld'@app.route('/random-number')defrandom_number():returnstr(random.randrange(100))@app.route('/alpha',methods=['GET'])defalpha():text=request.args.get('text','')result={'text':text,'is_alpha':text.isalpha()}返回jsonify(result)@app.route('/create-user',methods=['POST'])defcreate_user():id=request.form.get('id','0001')name=request.form.get('name','Anonymous')data={'id':id,'name':name}result={'status_code':'0','status_message':'成功','data':数据}returnjsonify(result)@app.route('/get-webpage',methods=['GET'])defget_webpage():returnrender_template('flask_1.html',message="联系我们")if__name__=='__main__':app.run(host='0.0.0.0',port=8889)并将所有的FastAPI框架下的代码全部汇集到一起,则如下所示:fromfastapiimportFastAPI,Request,Formimportuvicornfromfastapi.staticfilesimportStaticFilesfromfastapi.responsesimportPlainTextResponse,HTMLResponse,FileResponseimportrandomfromfastapi.templatingimportJinja2Templatesapp=FastAPI()app.mount("/templates",StaticFiles(directory="templates"),name="templates")模板=Jinja2Templates(directory="templates")@app.get("/",response_class=PlainTextResponse)asyncdefhello():返回"HelloWorld!"@app.get("/items/{item_id}")defread_item(item_id:int,q:str=None):return{"item_id":item_id,"q":q}@app.get('/random-number',response_class=PlainTextResponse)asyncdefrandom_number():returnstr(random.randrange(100))@app.get('/get-webpage',response_class=HTMLResponse)asyncdefget_webpage(请求:请求):returntemplates.TemplateResponse("index.html",{"request":request,"message":"ContactUs"})if__name__=='__main__':uvicorn.run('fast_api_1:app',主机='0.0.0.0',端口=8000)
