Flask入门

Flask

首先,要看你学没学过Django 如果学过Django 的朋友,请从头看到尾,如果没有学过Django的朋友,并且不想学习Django的同学,轻饶过第一部分

一、Python 现阶段三大主流Web框架 Django Tornado Flask 对比

  1. Django 主要特点是大而全,集成了很多组件,例如: Models Admin Form 等等, 不管你用得到用不到,反正它全都有,属于全能型框架
  2. Tornado 主要特点是原生异步非阻塞,在IO密集型应用和多任务处理上占据绝对性的优势,属于专注型框架
  3. Flask 主要特点小而轻,原生组件几乎为0, 三方提供的组件请参考Django 非常全面,属于短小精悍型框架

Django 通常用于大型Web应用由于内置组件足够强大所以使用Django开发可以一气呵成

Tornado 通常用于API后端应用,游戏服务后台,其内部实现的异步非阻塞真是稳得一批

Flask 通常应用于小型应用和快速构建应用,其强大的三方库,足以支撑一个大型的Web应用

Django 优点是大而全,缺点也就暴露出来了,这么多的资源一次性全部加载,肯定会造成一部分的资源浪费

Tornado 优点是异步,缺点是干净,连个Session都不支持

Flask 优点是精悍简单,缺点是你不会!哈哈哈哈哈哈!

二. Flask 的安装与HelloWorld

Flask的安装特别难,但是以一个多年奋斗在程序界的我,肯定会找出一个最简单的方法,具体操作如下:

pip install Flask

Flask安装完成了,下面使用Flask走一遍仪式:

from flask import Flask  # 导入Flask类

app = Flask(__name__)  # 实例化Flask对象app

@app.route("/") # route装饰器用来指定视图函数的URL地址
def func(): # 视图函数
    return ("Hello Flask!")

app.run()  # 启动Flask web服务

实现了Flask 的第一个HelloWorld程序!

三、Response三剑客

  1. HttpResponse

    # 在flask中HttpResponse不需要单独引入,直接返回字符串就能显示!
    @app.route("/")  # 视图函数
        return ("Jiumo")
    
  2. Redirect

    # 导入
    from flask import redirect
    @app.route("/index")
    def index():
        # 重定向至login路由
        return redirect("/login")
    
  3. Render(render_template)

    # 导入
    from flask import render_template
    @app.route("/home")
    def home():
        # 渲染HTML模板返回html页面
        return render_template("home.html")
    

    注意: 如果要使用 render_template 返回渲染的模板,请在项目的主目录中加入一个目录 templates

否则可能会有一个Jinja2的异常哦

遇到上述的问题,基本上就是你的template的路径问题!

  1. 知识点补充

    • jsonify

    from flask import jsonify
    
    @app.route("/jsonifys")
    def jsonifys():
        t2 = {"name": "jiumo", "age": 18}
        return jsonify(t2)
    
    import json
    @app.route("/jsons")
    def jsons():
        t1 = {"name": "jiumo", "age": 18}
        return json.dumps(t1)
    

  • file

    # 打开文件并返回文件内容(自动识别文件格式)
    from flask import send_file
    
    @app.route("/file")
    def file():
        return send_file("01.jpg")
    

四、Request

每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的

为了了解Flask的request中都有什么东西,首先写基于HTML + Flask 写一段前后端的交互

<body>
<form acteion="" method="post" enctype="multipart/form-data">
    用户名<input type="text" name="username">
    密码<input type="password" name="password">
    <input type="submit" value="登录">
</form>
</body>
from flask import request
# 代表这个url地址只允许列表也中的请求方式
# 路由当中默认get请求,如果添加了methods,则会覆盖还需添加get请求
@app.route("/login", methods=["POST", "GET"])
def login():
    print(request.method) # 捕获当此请求的方式
    if request.method == "GET":
        return render_template("login.html")
    print(request.form) # ImmutableMultiDict([('user', '久末'), ('pwd', '123')])
    print(request.form["user"]) # 久末
    print(request.form.get("pwd")) # 123
    print(list(request.form.keys())) # ['user', 'pwd']
    return "登录成功!"

​ 注意: 若没有在methods中添加"GET",会出现以下错误

request中常用的参数

  1. request.args

    # 存的是url中传递的参数
    # GET请求
    # URL: http://127.0.0.1:5000/login?id=1&name=wbw
    print(request.args)
    
    ImmutableMultiDict([('id', '1'), ('name', 'wbw')])
    
  2. request.values

    # 存的是url中传递的参数
    # 带form的post参数
    # URL: http://127.0.0.1:5000/login?id=1&name=wbw
    print(request.values )
    
    CombinedMultiDict([ImmutableMultiDict([('id', '1'), ('name', 'wbw')]), ImmutableMultiDict([('user', '久末'), ('pwd', '123')])])
    
    # 这回喜欢直接操作字典的小伙伴们有惊喜了! to_dict() 方法可以直接将我们的参数全部转为字典形式
    print(request.values.to_dict())
    
    {'user': '久末', 'pwd': '123456', 'id': '1', 'name': 'wbw'}
    

    :如果url和form中的Key重名的话,form中的同名的key中value会被url中的value覆盖

    知识点:错误—KeyError是字典专有的错误!!!

  3. request.files

    # 序列化文件存储
    print(request.files)
    # ImmutableMultiDict([('file', <FileStorage: '命令.txt' ('text/plain')>)])
    print(request.files["file"])
    # <FileStorage: '命令.txt' ('text/plain')>
    my_file = request.files["file"]
    # save内不加条件,就会按照原有的格式提交
    my_file.save("jiumo.txt")
    
    <body>
    <form acteion="" method="post" enctype="multipart/form-data">
        <input type="file" name="file">
        <input type="submit" value="提交">
    </form>
    </body>
    
  4. 其他

    request.url # 访问的完整路径
    request.path # 路由地址
    request.host # 主机地址
    request.json  # 如果提交时请求头中的Content-Type:application/json 字典操作
    request.data  # 如果提交时请求头中的Content-Type 无法被识别 将请求体中的原始数据存放 byte
    request.cookies # 获取Cookie中的数据
    request.headers # 获取请求头
    

原文地址:https://www.cnblogs.com/jiumo/p/10246897.html