zoukankan      html  css  js  c++  java
  • flask使用基础

    1、安装

      pip install Flask

      基本依赖库:

        jinja2:实现对模板的处理

        werkzeug:本质是socket服务器,用于接收http请求,并对请求进行预处理,然后触发Flaks框架,开发人员基于Flask框架提供的功能对请求进行相应的处理并返回给用户。

     2、创建核心对象

      from flask import Flask

      app = Flask(__name__)

      值得注意的是,这里的__name__,一般是模块名或者包名,如果是单个模块,这里直接写__name__肯定是没有问题的。

      但是如果使用的是软件包,官方建议的是这里使用硬编码来传入包名。

      还可以直接在包的__init__.py文件中穿件方法来实例化我们的app,这样传入的__name__名称也是包名。

      def instance_app():

        app = Flask(__name__)

        ...

        return app

      然后在入口文件中引入instance_app

      __name__的名称决定了项目的根目录。项目中的静态文件,模板文件等都是通过根目录路径在寻找的。

      默认情况下,静态文件时放在根目录下的static文件夹中的。但是如果我们修改了静态文件夹的位置或者名称,可以在实例化Flaks核心对象的时候指定自定义路径

      

      如上图,默认情况下,Flask实例化可以接受静态文件,模板路径等等,如在根目录下新建文件夹static12,然后上传图片timg.jpg

      然后在实例化Flaks核心对象的时候传入自定义静态文件地址

      app = Flask(__name__, static_folder='static12', static_url_path='static12')即可

      static_folder:是我们自定义的静态文件夹相对于根目录的位置。

      static_url_path:用于为静态文件指定不同的路径,static_url_path+filename 整理构成了静态文件的访问路径,默认情况下static_url_path和static_folder是一样的,所以上面的例子,也可以省略掉static_url_path

      从下面的源码可以看到,定义了_get_static_url_path()函数用来获取static_url_path,如果我们配置了static_url_path,直接取我们配置的,如果static_url_pathNone,回去取static_folder的值。

      

      最后,调用Flask的add_url_rule函数配置静态文件访问路径,最终执行静态文件访问的是view_func即send_static_file()

      

       所以,我们可以重写send_static_file()函数,可以用来判断是否有权限访问此文件等

       

    2、启动程序

      from apps import instance_app(这里apps是我的应用包名)

      app = instance_app()

      if __name__=="__main__":

        app.run(host='0.0.0.0', port=80, thread=True)

      1)我们为什么要在入口函数中添加__name__=='__main__'判断?

        原因1:加入__name__=="__main__" 确保我们的run()函数只有在当前脚本被python解释器直接执行的时候才会运行,而被其他模块import的时候不会被执行

        原因2:开发环境下,我们启动的是flask自带的一个非常简单的服务器,但是在部署到生产环境中时,用的是uwsgi和nginx组合来部署项目,nginx作为前置服务器用来接收我们浏览器发来的请求,转发给uwsgi,

            在生产环境中,并不是我们手动的去启动我们的模块,而是通过uwsgi来加载我们的模块来启动代码。

            所以如果在生产环境中,我们的入口文件就不再是入口文件了,解了if判断后,app.run就不会去执行。

            但是如果不加if判断,生产环境一旦加载了我们的入口文件后,app.run()就会被执行,这样就会导致我们在已经拥有了uwsgi作为外部服务器的同时,又启动了内部服务器,这种情况是不可取的。

    3、配置路由

      使用核心对象的route()装饰器把函数绑定到对应的url上

      @app.route("/hello")  # 无参

      def say_hello():

        return "hello"

      @app.route("/hello/<name>")  # 有参

      def say_hello1(name)

        return "hello"+name

      

      flask的url规则基于werkzeug的路由模块。这个模块背后的思想是基于Apache和更早的http服务器主张的先例,保证优雅且唯一的url。

      以下面两个规则为例:

      @app.route("/hello")

      def say_hello():

        return "hello"

      

      @app.route("/hello1/")

      def say_hello1():

        return "hello1"

       

      上面两种情况看起来url很相似,一个加斜线,一个不加斜线,但是他们结尾的斜线在url定义中不同

      第一个结尾不带斜线的,如果访问url后面加上斜线,会返回404

      第二个结尾带斜线的,如果访问url后面忘了加上斜线,Flask在收到这个请求后,会将请求重定向到到斜线的url上面去,所以我们看到第二种情况中,输入不到斜线的url访问目标函数,浏览器请求了两次,第一次返回301,即告诉浏览器,需要重定向。

    3、生成url

      通过url_for()来给指定的函数构造url

      1)它接收函数名作为第一个参数

        url_for("login")  #  /login

      2)它也接收对应url规则的变量部分的命名参数,如一个url需要参数username

        url_for("login", username="john")  # /login/john

      3)对于未知变量部分,会添加到url末尾作为查询参数

        url_for("login", next='/')  # /login?next=/

      4)使用反向构建url的意义:

        a)易于维护

        b)url构建会自动转义特殊字符和Unicode数据,省去很多麻烦

        c)如果我们的应用不是在根路径下面,url_for会妥善的处理这个问题。

    4、HTTP方法

      通过route()装饰器的methods参数可以定义该方法介绍哪些请求

      @app.route("/login", methods=['GET', 'POST'])

      from flask import request

      def login():

        if request.method=='POST':

          pass

    5、模板渲染

      flask配备了jinja2模板引擎,我们可以使用render_template方法来渲染模板。

      from flask import render_template

      @app.route("/hello/<name>")

      def hello(name):

        return render_template("index.html", name=name)

    6、关于响应

      flask转换响应对象的逻辑如下:

      1)如果返回的是一个合法的响应对象,它会从视图直接返回

      2)如果返回的是一个字符串,它会被转换为该字符串为主体的,状态码为200,MIME类型为‘text/html’的响应对象。

      3)如果返回的是一个元组,且元组中的元素可以提供额外的信息。这样的元组必须是(response,status,header)的形式。header作为额外的消息头标志,可以是一个列表或字典。

      如果我们想要在视图里操作响应对象,可以使用make_response()函数

      如我们有这样一个函数

      @app.errorhandler(404)

      def not_found(error):

        return render_template("error.html",404)

      我们只需要将返回值表达式传递给make_response()函数,获取结果对象,并修改,然后返回

      from flask import make_response

      @app.errorhandler(404)

      def not_found(error):

        resp = make_response(render_remplate("error.html"),404)

        resp.headers[X-something] = 'A-value'

        return resp

    参考:http://docs.jinkan.org/docs/flask

  • 相关阅读:
    linux配置虚拟主机
    mysql允许远程登录
    php优化
    php socket 函数
    1-- prometheus安装、图形化界面
    Ansible Roles
    Ansible 的 Playbook
    Ansible 变量
    Ansible 模块
    Ansible入门;Ansible ad-hoc; ansible-vault加密工具 ;ansible-console
  • 原文地址:https://www.cnblogs.com/fiona-zhong/p/10133524.html
Copyright © 2011-2022 走看看