• Flask—01-轻松入门Flask


    Flask入门

    WEB工作原理

    • C/S与B/S架构:客户端-服务器,浏览器-服务器
    • B/S架构工作原理
      • 客户端(浏览器) <=> WEB服务器(nginx) <=> WSGI(uWSGI) <=> Python(Flask) <=> 数据库(MySQL)
      • 说明:flask自带一个测试的WEB服务器,但是它仅仅适合于测试环境,不能用于生产环境。

    MVC与MTV框架

    • MVC框架
      • M:Model,模型,即数据模型,负责数据的存取。
      • V:View,视图,负责数据的展示效果。
      • C:Controller,控制器,负责业务逻辑的处理。
    • MTV框架
      • M:Model,模型,即数据模型,负责数据的存取。
      • T:Templates,模板,负责数据的展示效果。
      • V:View,视图函数,负责业务逻辑的处理。
    • 总结:使用MVC或MTV就是为了解耦,可以提高开发维护的效率。

    Flask框架简介

    • 说明:

      flask是一个轻量级的web框架,被称为微型框架。只提供了一个高效稳定的核心,其它全部通过扩展来实现。意思就是你可以根据项目需要进行量身定制,也意味着你需要不断学习相关的扩展库。

    • 核心:

      • WSGI系统、调试、路由
      • 模板引擎(Jinja2,是flask核心开发者人员开发的)
    • 安装:pip install flask

    启动完整代码

    • 完整代码

      # 导入类库
      from flask import Flask
      
      # 创建应用实例
      app = Flask(__name__)
      
      # 添加视图函数
      @app.route('/')
      def index():
          return 'Hello Flask!'   
      
      # 启动应用
      if __name__ == '__main__':
          app.run()
      
    • 启动参数

      参数说明
      debug 是否开启调试模式,默认为False;开启后会有出错调试信息,文件会自动加载。
      threaded 是否开启多线程,默认为Flase。
      host 指定主机,默认为'127.0.0.1',设置为'0.0.0.0'后可以通过IP进制访问
      port 指定端口,默认为5000。

      启动示例:app.run(debug=True, threaded=True, host=’0.0.0.0’, port=5555)

    flask-script

    • 说明:

      简单来说,该库就是flask终端启动的参数解析器;这样就可以不更改代码就能完成不同方式的启动。

    • 安装:pip install flask-script

    • 使用:

        # 导入类库
        from flask_script import Manager
      
        # 创建对象
        manager = Manager(app)
      
        # 启动应用
        if __name__ == '__main__':
            manager.run()
      
    • 启动参数:

      参数说明
      -?,--help 查看帮助
      -h,--host 指定主机
      -p,--port 主动端口
      -d,--debug 开启调试模式
      -r,--reload 自动加载
      --threaded 开启多线程
      --processes 指定多进程数量

      启动示例:python manage.py runserver -d -r -h 0.0.0.0 -p 5555

    flask使用

    • 视图函数

      • 示例:
      # 无参路由
      @app.route('/')
      def index():
          return '<h1>Hello Flask!</h1>'
      
      # 带参路由,可以传递多个参数
      @app.route('/welcome/<name>/<uid>/')
      def welcome(name, uid):
          return 'Hello {} {}'.format(name, uid)
      
      # 指定参数类型,如:str(默认)、int、float、path
      @app.route('/user/<int:uid>/')
      def user(uid):
          return 'Hello {}号'.format(uid)
      
      # path类型:类型仍然是str,只是将'/'当做普通字符处理而已
      @app.route('/path/<path:p>/')
      def path(p):
          return p
      
      • 说明:
      1.路由末尾的'/'建议都加上,防止出现路由多敲'/'出现的问题
      2.若需要路由参数,参数需要放在<>中,对应的视图函数需要同名的参数
      3.路由参数可以指定多个,也可以指定类型
      4.常用参数类型:str(默认)、int、float、path,使用时放在参数前面,使用':'与参数连接
      5.path类型其实是str类型,只是将'/'作为普通字符处理罢了。
      
    • 请求(request)

      from flask import request
      
      # 请求,request中存放了所有的HTTP请求信息
      @app.route('/request/')
      def req():
          # 完整的路由地址
          # return request.url
          # 不包含GET参数的路由地址
          # return request.base_url
          # 只有协议主机和端口
          # return request.host_url
          # 只包含装饰器中的路由地址
          # return request.path
          # 请求方法的类型:GET、POST
          # return request.method
          # 客户端的IP
          # return request.remote_addr
          # args:GET参数;form:POST参数;values:GET和POST
          # return request.args.get('uid', '默认值')
          # headers:所有的请求头信息
          return request.headers.get('User-Agent')
      
    • 响应(response)

      from flask import make_response
      
      # 响应response
      @app.route('/response/')
      def response():
          # 直接返回字符串
          # return 'OK'
          # 可以在返回时指定状态码,默认都是200
          # return 'page not found', 404
          # 先用专门的函数构造一个响应对象,可以指定内容及状态码等
          resp = make_response('这是通过函数构造的响应', 404)
          # 设置响应头信息
          resp.headers['uid'] = 250
          return resp
      
    • 重定向(redirect)

      from flask import redirect, url_for
      
      # 重定向
      @app.route('/old/')
      def old():
          # return '原来的数据'
          # 通过url来重定向新的路由地址,参数是希望重定向的url
          # return redirect('/new/')
          # 根据视图函数名反向构造路由地址,参数是视图函数名
          # return url_for('new')
          return redirect(url_for('new'))
      
      @app.route('/new/')
      def new():
          return '新的数据'
      
    • 反向构造路由(url_for)

      # 反向构造路由
      @app.route('/urlfor/')
      def urlfor():
          # 不带参数的路由
          # return url_for('new')
          # 可以构造带参的路由,多出来的参数以GET形式传递
          # return url_for('user', uid=250, name='cuihua')
          # 构造完整(带协议主机和端口)路由,可以进行外部跳转
          return url_for('user', uid=250, name='cuihua', _external=True)
      
    • 终止及错误定制

      # 终止abort
      @app.route('/abort/')
      def err():
          # 终止代码执行,其实是向系统抛出指定异常
          # 系统捕获异常,按照统一的方案进行处理
          abort(404)
          return '正常'
      
      # 定制错误显示
      @app.errorhandler(404)
      def page_not_found(e):
          return '是不是搞错了大哥?'
      

    蓝本使用

    • 说明:

      当大量的视图函数存放在一个文件中,很明显是不合适的。最好是根据功能模块进行划分,将相关的功能模块放在同一文件,蓝本就是用来解决这个问题的。

    • 使用:

      • user.py
      # 导入类库
      from flask import Blueprint, url_for
      
      # 创建对象,可以指定统一的前缀
      user = Blueprint('user', __name__, url_prefix='/user')
      
      # 添加视图函数
      @user.route('/login/')
      def login():
          # 当反向构造同一蓝本中的路由时,蓝本名可以省略,但是不能省略'.'
            return url_for('.register')
            return '欢迎登录'
      
      @user.route('/register/')
      def register():
          return '欢迎注册'
      
      • manage.py

        from user import user
        # 注册蓝本,注册时可以再次设置相关参数,而且优先级较高,user:蓝本名,url_prefix:路由
        app.register_blueprint(user, url_prefix='/u')
        
        @app.route('/urlfor/')
        def urlfor():
            # 构造蓝本中的路由(蓝本中的'/u')时,参数这样传递:'蓝本名.视图函数名'
            return url_for('user.login')
        
  • 相关阅读:
    轻松构建微服务之分布式事物
    Java和操作系统交互细节
    网络内核之TCP是如何发送和接收消息的
    最全的微服务知识科普
    【译】TCP Implementation in Linux
    轻松构建微服务之分库分表
    OSX的一些基本知识
    Delphi中使用比较少的一些语法
    热烈祝贺我的博客开通
    Windows 服务快捷启动命令
  • 原文地址:https://www.cnblogs.com/swjblog/p/9726612.html
Copyright © 2020-2023  润新知