zoukankan      html  css  js  c++  java
  • Flask

    主要内容:

    • 1. Flask基本概述
    • 2. 请求相关
    • 3. Flask中模板语言 jinja2 
    • 4. 内置Session

    1. Flask 基本概述:

    1.1  web框架 Django,Flask, Tornado 的对比

    特点:

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

    使用方面

    • Django 通常用于大型Web应用由于内置组件足够强大所以使用Django开发可以一气呵成
    • Tornado 通常用于API后端应用,游戏服务后台,其内部实现的异步非阻塞真是稳得一批
    • Flask 通常应用于小型应用和快速构建应用,其强大的三方库,足以支撑一个大型的Web应用

    优缺点:

    • Django 优点是大而全,缺点也就暴露出来了,这么多的资源一次性全部加载,肯定会造成一部分的资源浪费
    • Tornado 优点是异步,缺点是干净,连个Session都不支持
    • Flask 优点是精悍简单,缺点是过分依赖于第三方插件

    1.2实例化一个 Flask 对象

    app = Flask(__name__)    # 这是实例化一个Flask对象,最基本的写法
    # 但是Flask中还有其他参数,以下是可填的参数,及其默认值
    
    def __init__(self, import_name, static_path=None, static_url_path=None,
                     static_folder='static', template_folder='templates',
                     instance_path=None, instance_relative_config=False,
                     root_path=None):

    其他参数:

    • template_folder:模板所在文件夹的名字
    • root_path:可以不用填,会自动找到,当前执行文件,所在目录地址(在return render_template时会将上面两个进行拼接,找到对应的模板地址)
    • static_folder:静态文件所在文件的名字,默认是static,可以不用填
    • static_url_path:静态文件的地址前缀,写成什么,访问静态文件时,就要在前面加上这个
      app = Flask(__name__,template_folder='templates',static_url_path='/xxxxxx')
    • instance_pathinstance_relative_config是配合来用的 (这两个参数是用来找配置文件的,当用app.config.from_pyfile('settings.py')这种方式导入配置文件的时候会用到)

    • instance_relative_config:默认为False,当设置为True时from_pyfile会从instance_path指定的地址下查找文件。

    • instsnce_path:指定from_pyfile查询文件的路径,不设置时,默认寻找和app.run()的执行文件同级目录下的instance文件夹;如果配置了instance_path(注意需要是绝对路径),就会从指定的地址下里面的文件

    2. 请求相关

    2.1 获取请求数据 & 响应

    • Request
          request.method     #存放 HTTP 请求方式
          request.form        #存放 FormData 中的数据
          request.args        #存放 URL 中的参数数据
          request.data        #存放 原始请求体中数据 因为 Content-type : 不被认可,原始请求体中数据
          request.json        #存放 Content-type:application/json 
          request.files        #存放 FormData 中文件数据
          request.path        #获取当前访问路径的路由地址(/login)
    • Response
          HttpResponse        #return "字符串"
          render_template     #return render_template("模板名称") 默认存放路径 = templates
          redirect            #return redirect("/login")
          Flask 特殊
          jsonify             #return jsonify({"name":1}) # 在响应头中加入 Content-type:application/json
                                 - app.config["JSONIFY_MIMETYPE"]
          
          send_file           #return send_file("文件路径") # 打开并返回文件内容
    • session
      #存在浏览器上,并且是加密的
      # 依赖于:secret_key
      from flask import  Flask,request,render_template,session
      app.config["SECRET_KEY"] ="aewqweqe"
      
      ........
      session["user"] = request.form.get("username")

    另外: flask中获取URL后面的参数(from urllib.parse import urlencode,quote,unquote)

    from urllib.parse import urlencode,quote,unquote
    
    def login():
        if request.method == 'GET':
            s1 = request.args
            s2 = request.args.to_dict()
            s3 = urlencode(s1)
            s4 = urlencode(s2)
            s5 = unquote(s3)
            s6 = unquote(s4)
            s7 = quote("胡冲")
            print('s1',s1)
            print('s2',s2)
            print('s3',s3)
            print('s4',s4)
            print('s5',s5)
            print('s6',s6)
            print('s7',s7)
    
            return render_template('login.html')
    
    #############结果如下####################
    
    s1 ImmutableMultiDict([('name', "'胡冲'"), ('nid', '2')])
    s2 {'name': "'胡冲'", 'nid': '2'}
    s3 name=%27%E8%83%A1%E5%86%B2%27&nid=2
    s4 name=%27%E8%83%A1%E5%86%B2%27&nid=2
    s5 name='胡冲'&nid=2
    s6 name='胡冲'&nid=2
    s7 %E8%83%A1%E5%86%B2
    View Code

    3. Flask中模板语言 jinja2 

    3.1 jinja2模板语言

    • {{ }} 取值 执行
    • {% %} 逻辑代码 for if else macro

    4. 内置Session

    Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪

    Session

    • Flask中的session是需要secret_key的
      # secret_key 实际上是用来加密字符串的,如果在实例化的app中没有 secret_key 那么开启session一定会抛异常的
      from flask import session
      app = Flask(__name__)
      app.secret_key = "DragonFire"
    • session的使用
       #session["user"] = USER["username"] 这样用就代表这个请求带上来的session中保存了一个user=name
      @app.route("/login", methods=["GET", "POST"])
      def login():
          if request.method == "POST":
              if request.form["username"] == USER["username"] and request.form["password"] == USER["password"]:
                  session["user"] = USER["username"]
                  return redirect("/student_list")
              return render_template("login.html", msg="用户名密码错误")
      
          return render_template("login.html", msg=None)  # 如果前端Jinja2模板中使用了msg,这里就算是传递None也要出现msg
    • cookies中的session
      #cookies 中 session 存储的是通过 secret_key 加密后的 key , 通过这个 key 从flask程序的内存中找到用户对应的session信息
    • 用session进行验证
      #进行验证
      @app.route("/student_list")
      def student():
          if session.get("user"):
              return render_template("student_list.html", student=STUDENT_DICT)
      
          return redirect("/login")
  • 相关阅读:
    php知识点
    cdnbest里站点域名不同步到节点,报400错误的一般原因
    linux删除历史操作命令
    linux 查看进程启动路径
    Linux中systemctl命令详细介绍
    申请ssl证书报提示caa提示
    开启swap交换分区
    mysql里max_allowed_packet的作用
    抓包工具tcpdump用法说明--1
    echo和print的区别
  • 原文地址:https://www.cnblogs.com/wcx666/p/10446956.html
Copyright © 2011-2022 走看看