创建虚拟环境

anaconda

conda create --name flask_dev python=<版本号>

Linux:

source activate <虚拟环境名称>

Windows:

activate <虚拟环境名称>

在虚拟环境下安装需要的包

# 在虚拟环境激活的状态命令行下直接
conda install [包名]
# OR
conda install -n <虚拟环境名称> [package]

关闭虚拟环境

# Linux
source deactivate
# Windows
conda deactivate
flask如何兼容url后边带不带“/”
  • flask将不带/的url重定向到了带/的url上来
flask自启动
  • flask内置

    app.run(debug=True)

Flask 注册路由

  • 装饰器

    @app.route('/hello/')
    def hello():
        return 'hello,fmujie'
  • 通过核心对象app来装饰

    app.add_url_rule('/hello/', view_func=hello)
    #第一个参数为路由,第二个参数为绑定的视图函数

路由的注册都是使用add_url_rule的方式来实现的,只不过flask为了方便大家使用,将add_url_rule封装成为一个装饰器,让大家可以更优雅的实现路由的注册

def route(self, rule, **options):
    def decorator(f):
        endpoint = options.pop('endpoint', None)
        self.add_url_rule(rule, endpoint, f, **options)
        return f
    return decorator

app.run()相关参数

app.run(host='0.0.0.0', debug=True, port=81)
#host='0.0.0.0'开启外网可访问、port自定义端口号

关于debug

  • 推到线上可以通过设置debug=False来关闭调试模式,
  • 部署原则 - 镜像关系(两份源代码相同)启用配置文件

    新建config.py文件

    DEBUG = True

    入口文件载入配置文件(app核心对象提供了一个方法,能够将config.py模块内定义的参数导入进来)

    app.config.from_object('config')
    # app对象下有一个config属性,该属性下有一个from_object()方法,使用该方法导入配置文件
    # 接收的参数为 模块的路径

    读取配置文件

    app.run(debug=app.config['DEBUG'])
    # config为dict的一个子类
    # !!!使用该种方法载入配置文件,大小写需注意[大写-flask规定]

生产环境

nginx+uwsgi

  • nginx作为前置服务器,用于转发浏览器的请求给uwsgi
  • uwsgi加载run.py模块启动flask的相关代码

    生产环境下当前run.py文件便不是一个入口文件了,只是被uwsgi加载的模块文件,所以说app.run()是根本不会去执行的。

    如果没有if __name__ == '__main__':这个判断,在生产环境下一旦加载了run.py这个文件,app.run()就会执行,我们已经有了uwsgi来作为Web服务器,在这种情况下又启用了flask内置的Web服务器,两个服务器是不可以的,如果有if __name__ == '__main__':判断的话,保证了在生产环境下不会启动Flask自带的Web服务器。

响应对象

视图函数的return与普通函数的return有什么区别?

  • 视图函数Flask会在背后做一系列的封装,不仅仅是一个普通函数

    视图函数在返回内容之外还会返回各种附加信息

    • status code 响应状态码
    • content-type 放置于httpheaders属性中

      @app.route('/hello')
      def hello():
          return '<html></html>'
      
      def hell():
          return 'hello,fmujie'

      Flask会给视图函数返回的内容,在headers属性中的content-type增添一个值,该值明确的指明了http客户端(接收方如:浏览器)在拿到内容后以什么样的方式去解析。

      视图函数返回的内容永远都是以上的文本,但是如何解析这串文本,我们的服务器是需要告诉客户端。默认情况下,如果我们不指定content-type,那么Flask将会把content-type设置为一个默认值content-type = text/html

      • 等等……

        使用Postman查看头信息

      Flask会将字符串作为响应的主体内容,同时它会将之前说的信息封装成为一个Response对象,本质上说视图函数返回的永远都是Response对象。

      @app.route('/hello/')
      def hello():
          headers = {
              'content-type': 'text/plain'
          }
          response = make_response('<html></html>', 404)
          response.headers = headers
          return response

      json格式相同,将content-type的值更换为application/json即可

  • Flask比较方便的返回写法

    @app.route('/hello/')
    def hello():
        headers = {
            'content-type': 'text/plain'
        }
        return '<html></html>', 404, headers
    # 实质是一个元组,Flask内部最终还是会将其变成Response对象返回

    这样的返回形式是在Flask中使用最多的。


本文由 fmujie 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论

召唤看板娘