• 手把手教你入门Python中的Web开发框架,干货满满!!


    在上一边的文章当中,有粉丝嫌弃小编在可视化方面写作得太多了,希望写一些别的内容,

    【Plotly快速入门】用Plotly绘制了几张精湛的图表,美翻了!!

    那好吧,今天小编就说一下Python编程语言在web开发方面的内容。

    说到web开发框架,小编平常用FlaskDjango的比较多,其中的Flask属于是轻量级的开发框架,写一个API接口也是十分地方便,不过今天我们要介绍的框架FastAPI同样在Python开发者当中有着较好地口碑,那么在开始之前,我们先要安装好需要用到的模块,通过pip命令

    pip install fastapi

    ASGI服务器可以使用uvicorn,那么同样地

    pip install uvicorn

    HelloWorld

    我们先尝试用Flask框架来写一个HelloWorld,代码如下

    1. from flask import Flask, request
    2. import json
    3. app = Flask(__name__)
    4. @app.route('/')
    5. def hello_world():
    6.     return 'hello world'
    7. if __name__ == '__main__':
    8.     app.run(host='0.0.0.0', port=8889)

    小编用的开发工具是Pycharm,我们运行这个脚本会弹出以下的结果

    37aa134083bc8803614225d2f1221e0a.png

    然后在浏览器当中输入弹出来的url去访问页面,如下所示就会出现含有“hello world”的页面

    bcebf9607762cc82a99fa51785debb38.png

    从代码的逻辑中来看,app = Flask(__name__)是创建Flask程序实例,我们在浏览器中输入url发送请求给web服务器,然后web服务器将url转发给Flask程序实例,因此需要知道对于每一个url请求需要启动哪一部分的代码,所以保存了urlPython函数之间的映射关系,处理上述两者之间关系的是路由,是使用程序实例app.route装饰器来实现。而执行最后的app.run()就可以启动服务了,0.0.0.0表示监听所有地址,指定的端口号是8889,那么我们来看一下相对应的FastAPI版本的“HelloWorld”是什么样子的,代码如下

    1. from fastapi import FastAPI
    2. from fastapi.responses import PlainTextResponse, HTMLResponse, FileResponse
    3. import uvicorn
    4. app = FastAPI()
    5. @app.get("/", response_class=PlainTextResponse)
    6. async def hello(): ## async可加可不加,这个随意
    7.     return "Hello World!"
    8.     
    9. @app.get("/items/{item_id}")
    10. def read_item(item_id: int, q: str = None):
    11.     return {"item_id": item_id, "q": q}
    12. if __name__ == '__main__':
    13.     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/,结果如下所示

    40693864f396b01c955192f5580867f8.png

    由于返回的是一个字符串,因此我们在response_class处填的是PlainTextResponse,同时我们也可以在浏览器中输入http://127.0.0.1:8000/items/5?q=somequery,出来的结果如下所示

    f9d9a130de446c29e313d4fe3a551465.png

    返回随机数

    我们在上面的“Hello World”的基础之上再来写几个案例,例如返回随机数的操作,在Flask框架当中的代码如下

    1. @app.route('/random-number')
    2. def random_number():
    3.     return str(random.randrange(100))

    我们在浏览器中测试一下出来的结果,如下所示

    f09dffb412fed145f2aebe25ab6eb55a.png

    而在FastAPI框架当中的代码也是非常类似的

    1. @app.get('/random-number', response_class=PlainTextResponse)
    2. async def random_number():
    3.     return str(random.randrange(100))

    判断是否都是由字母组成

    接下来我们来看一下,当我们发送一个GET请求,判断当中的一个url请求参数是否都是由字母组成的,其中Flask框架当中的代码如下

    1. @app.route('/alpha', methods=['GET'])
    2. def alpha():
    3.     text = request.args.get('text''')
    4.     result = {'text': text, 'is_alpha' : text.isalpha()}
    5.     return jsonify(result)

    我们在浏览器中测试一下出来的结果,如下所示

    9ca6a5af8a6d4ec7a81bacaf96b52af6.png

    而在FastAPI框架当中相对应的代码如下

    1. @app.get('/alpha')
    2. async def alpha(text: str):
    3.     result = {'text': text, 'is_alpha' : text.isalpha()}
    4. return result

    创建新用户

    上面的几个案例都是GET请求,下面我们来看一下POST请求该如何处理,例如我们想通过POST请求来创建一个新用户,在Flask框架中的代码如下

    1. @app.route('/create-user', methods=['POST'])
    2. def create_user():
    3.     id = request.form.get('id''0001')
    4.     name = request.form.get('name''Anonymous')
    5.     data = {'id': id, 'name': name}
    6.     result = {'status_code''0''status_message' : 'Success''data': data}
    7.     return jsonify(result)

    可以直接在Postman当中测试一下该API的功能,如下所示

    a6f541b658335b9d4b23563bb6fe293b.png

    我们需要在“methods”当中指定是用POST请求,而在FastAPI框架当中则不需要指定,直接只用app.post()装饰器即可

    1. @app.post('/create-user')
    2. async def create_user(id: str = Form(...), name: str = Form(...)):
    3.     data = {'id': id, 'name': name}
    4.     result = {'status_code''0''status_message' : 'Success''data': data}
    5.     return result

    返回静态页面

    而要是碰到需要返回一个静态页面的时候,在Flask框架中的代码是这样子的

    1. @app.route('/get-webpage', methods=['GET'])
    2. def get_webpage():
    3.     return render_template('flask_1.html', message="Contact Us")

    而在FastAPI框架当中则稍微有些麻烦,代码如下

    1. app.mount("/static", StaticFiles(directory="static"), name="static")
    2. ## 用来加载静态页面
    3. templates = Jinja2Templates(directory="templates")
    4. @app.get('/get-webpage', response_class=HTMLResponse)
    5. async def get_webpage(request: Request):
    6.     return templates.TemplateResponse("index.html", {"request": request, "message""Contact Us"})

    由于返回的是静态页面,因此response_class相对应的是HTMLResponse

    总结

    我们将上面所写的Flask代码全部都归总一下,如下所示

    1. from flask import Flask, request, render_template
    2. import random
    3. from flask import jsonify
    4. import json
    5. app = Flask(__name__)
    6. @app.route('/')
    7. def hello_world():
    8.     return 'hello world'
    9. @app.route('/random-number')
    10. def random_number():
    11.     return str(random.randrange(100))
    12. @app.route('/alpha', methods=['GET'])
    13. def alpha():
    14.     text = request.args.get('text''')
    15.     result = {'text': text, 'is_alpha' : text.isalpha()}
    16.     return jsonify(result)
    17. @app.route('/create-user', methods=['POST'])
    18. def create_user():
    19.     id = request.form.get('id''0001')
    20.     name = request.form.get('name''Anonymous')
    21.     data = {'id': id, 'name': name}
    22.     result = {'status_code''0''status_message' : 'Success''data': data}
    23.     return jsonify(result)
    24. @app.route('/get-webpage', methods=['GET'])
    25. def get_webpage():
    26.     return render_template('flask_1.html', message="Contact Us")
    27. if __name__ == '__main__':
    28.     app.run(host='0.0.0.0', port=8889)

    而将所有的FastAPI框架下的代码全部汇总到一起,则如下所示

    1. from fastapi import FastAPI, Request, Form
    2. import uvicorn
    3. from fastapi.staticfiles import StaticFiles
    4. from fastapi.responses import PlainTextResponse, HTMLResponse, FileResponse
    5. import random
    6. from fastapi.templating import Jinja2Templates
    7. app = FastAPI()
    8. app.mount("/templates", StaticFiles(directory="templates"), name="templates")
    9. templates = Jinja2Templates(directory="templates")
    10. @app.get("/", response_class=PlainTextResponse)
    11. async def hello():
    12.     return "Hello World!"
    13. @app.get("/items/{item_id}")
    14. def read_item(item_id: int, q: str = None):
    15.     return {"item_id": item_id, "q": q}
    16. @app.get('/random-number', response_class=PlainTextResponse)
    17. async def random_number():
    18.     return str(random.randrange(100))
    19. @app.get('/get-webpage', response_class=HTMLResponse)
    20. async def get_webpage(request: Request):
    21.     return templates.TemplateResponse("index.html", {"request": request, "message""Contact Us"})
    22. if __name__ == '__main__':
    23.     uvicorn.run('fast_api_1:app', host='0.0.0.0', port=8000)

    NO.1

    往期推荐

    Historical articles

    【Plotly快速入门】用Plotly绘制了几张精湛的图表,美翻了!!

    【优质佳作】浅谈神经网络中的优化算法总结

    全网最详细教程整理,Python办公自动化操作Excel总结归纳

    【原创佳作】介绍Pandas实战中一些高端玩法

    分享、收藏、点赞、在看安排一下?

    10390aa8672c1d132d83d7ea9106f91d.gif

    6f9ae6ce241f8beda488b3d61f1e4b53.gif

    c0070718a95c3dffdcf5871a9a05d513.gif

    33fcd5ee9ebb9143d36486f728594381.gif

  • 相关阅读:
    A-level经济难,但是想学好应该怎么做?
    求解八皇后问题
    前端培训栈和堆有什么区别
    idea插件(free mybatis plugin)
    InfiniBand网络带宽从SDR、DDR、QDR、FDR、EDR、HDR到NDR发展
    Spark Standalone HA基本原理及部署
    海量数据处理面试题
    关于MybatisPlus使用的部分经验
    力扣469A
    springboot16:指标监控(线上指标监控,微服务,高级特性)
  • 原文地址:https://blog.csdn.net/weixin_43373042/article/details/125325906