Flask (一)

Flask简介

Flask是一个基于Python实现的Web开发‘微’框架 'MicroFramework'
Django是一个重型框架
官方文档: http://flask.pocoo.org/docs/0.12/
中文文档: http://docs.jinkan.org/docs/flask/
FlaskDjango一样,也是一个基于MVC设计模式的Web框架
MModel   VView   C:Controller
MVVM, MVT
Flask依赖三个库
  Jinja2 模板引擎 {% %}  模板:静态html+模板语言{% %}
  Werkzeug WSGI工具集
  Itsdangerous 基于Django的签名模块
  
行的Flask
Flask流行的主要原因:
  1. 有非常齐全的官方文档,上手非常方便
  2. 有非常好的扩展机制和第三方扩展环境,工作中常见的软件都会有对应的扩展。自己动手实现扩展也很容易
  3. 社区活跃度非常高
  4. 微型框架的形式给了开发者更大的选择空间
 

MVC模式/MTV模式

一种软件设计典范,用一种业务逻辑,使数据,界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面与用户交互的同时,不需要重新编写业务逻辑。
MVC被独特的发展起来用于映射传统的输入,处理和输出功能在一个逻辑的图形化界面结构中。
    核心思想:解耦
    优点:降低各个模块之间的耦合性,方便变更,更容易重构代码,最大程度实现了代码的重用。
MVCModelViewController
    Model:用于封装与应用程序的业务逻辑相关的数据及对数据的处理方法,是Web应用程序中用于处理应用程序的数据逻辑部分,Model通常只提供功能性的接口,通过这些接口可以获取Model的所有功能。
    View:负责数据的显示和呈现,View是对用户的直接输出。
    Controller:负责从用户端收集用户的输入,可以看成提供View的反向功能,主要处理用户交互。
MVT模式简介
    本质上与MVC没什么差别,也是各组件之间为了保持松耦合关系,只是定义上有些许不同。
    Model:负责业务对象与数据库(ORM)的对象, models.py数据
    View:负责业务逻辑,并在适当的时候调用ModelTemplateviews.py:控制器
    Template:负责把页面展示给用户, html界面
url:路由, urls.py

使用Flask

虚拟环境

1, virtualenv的概述
    virtualenv是用来创建Python的虚拟环境的库,虚拟环境能够独立于真实环境存在,并且可以同时有多个互相独立的Python虚拟环境,每个虚拟环境都可以营造一个干净的开发环境,对于项目的依赖、版本的控制有着非常重要的作用。
    虚拟环境有什么意义?
    比如: 我们要同时开发多个应用程序,应用A需要Django1.11,而应用B需要Django1.8怎么办, 这种情况下,每个应用可能需要各自拥有一套独立的Python运行环境,virtualenv就可以用来为每一个应用创建一套'隔离'Python运行环境。
2, 安装pip
   【请使用普通用户】 
    a. 查看pip版本
        查看pip版本: pip -V
        查看pip3版本: pip3 -V
    b. 安装pip(如果存在则不需要安装)
        安装pip3: apt install python3-pip   
         pip2: apt install python-pip   
    c. 更新pip
        更新pip (如果pip版本高于9.0则不需要更新): 
            更新pip3: pip3 install --upgrade pip
             pip: pip install --upgrade pip
         意: 更新后如出现以下错误(这是pip 10.0.0版本的BUG):
            Traceback (most recent call last): 
            File /usr/bin/pip”, line 9, in 
            from pip import main
            解决方法:修改对应pip文件中的代码(pippip3类似)
                例如更新pip时报错则需要修改 /usr/bin/pip 文件中的代码,
                使用: sudo vim /usr/bin/pip 打开pip文件
                将:          
                    from pip import main
                    if __name__ == '__main__':
                     sys.exit(main())
                改成:
                    from pip import __main__
                    if __name__ == '__main__':
                     sys.exit(__main__._main())
    d. pip默认使用python3, 执行命令:
        sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 150
 
     
    e. pip命令
        pip install xxx:安装xxx依赖包
        pip list:查看所有依赖包
        pip freeze:查看新安装的包
        pip uninstall xxx :卸载xxx
3, virtualenvvirtualenvwrapper 的安装和使用
   【请使用普通用户】 
    a. 安装虚拟环境
        sudo apt update
        sudo pip3 install virtualenv virtualenvwrapper
        
        安装后如果不能使用虚拟环境命令,则需要配置环境变量
            1, 进入家目录: cd ~
            2, 使用vim打开.bashrc, 定位到最后:shift+g,并添加以下2行代码(注意修改自己Ubuntu的用户名)
                    export WORKON_HOME=/home/自己Ubuntu的用户名/.virtualenvs
                    source /usr/share/virtualenvwrapper/virtualenvwrapper.sh
            3, 在家目录创建.virtualenvs目录: mkdir .virtualenvs
            4, 加载修改后的设置,使之生效:source .bashrc
            (如果找不到virtualenvwrapper.sh,
             则将路径改成/usr/local/bin/virtualenvwrapper.sh
             后重试 
    b. 创建虚拟环境: 
        mkvirtualenv env  
        mkvirtualenv env2 -p /usr/bin/python3 (指定python路径)
    c. 退出虚拟环境
        deactivate 
    d. 进入虚拟环境: 
        workon 虚拟环境名称
 

第一个Flask项目

创建项目

创建虚拟环境
    mkvirtualenv flaskenv
在虚拟环境中安装flask
    pip install flask
    
创建helloFlask.py文件,并写入以下代码:
    from flask import Flask
    app = Flask(__name__)
    @app.route('/')
    def hello():
        return 'Hello Flask'
    if __name__ == '__main__':
        app.run()
run()启动的时候还可以添加参数:
    debug 是否开启调试模式,开启后修改过python代码会自动重启
    port 启动指定服务器的端口号
    host 主机,默认是127.0.0.1,指定为0.0.0.0代表本机所有ip
 

flask-script插件使用

flask-script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shell,设置数据库的脚本及其他运行在web应用之外的命令行任务;使得脚本和系统分开;
1.安装
    pip install  flask-script
2.初始化
    manager = Managerapp
3.调用
    run的地方修改,修改manager.run()
4.可以在命令行中使用: python manage.py runserver
  可以接收参数: python manage.py runserver -p 8000 -h 0 -d -r
    p  端口 port
    h  主机  host
    d  调试模式  debug
    r  重启(重新加载) reloadrestart

代码结构

static 静态资源文件
templates 模板文件
默认两个都可以直接使用, 直接使用相对路径就好
模板渲染
  render_template()
  实也是分为两个过程,加载和渲染
    template = Template(<h2>呵呵</h2>”)
    template.render()
静态使用,相当于反向解析
  url_for(’static’,filename=hello.css’)

请求流程

项目拆分

代码全都写在manage.py一个文件中是不现实的, 我们可以对项目进行简单的拆分

将原来的app.py文件重命名为:manage.py

 
from flask_script import Manager
from App import create_app
# 创建app
app = create_app()
# 创建manager对象
manager = Manager(app)
if __name__ == '__main__':    
    manager.run()
 

新建目录App, 并在App的init文件中创建app对象

from flask import Flask
# 创建app
def create_app():
    app = Flask(__name__)       
    return app
 
蓝图blueprint
 
1,宏伟蓝图(宏观规划)
2,蓝图也是一种规划,主要用来规划urls(路由)
3,蓝图基本使用
  安装
    pip install flask-blueprint
    
  views.py中初始化蓝图
    blue = Blueprint('first', __name__)
    
  init文件中调用蓝图进行路由注册
    app.register_blueprint(blueprint=blue)
   

route路由

 
路由:
   从客户端发送过来的请求分发到指定函数上
路由通过装饰器对应视图函数,并且可以接收参数,所以我们只需要在视图函数上使用装饰器即可
语法
  @app.route(/rule/’)
  def hello():
      return Hello World!
      
  @app.route(/rule/<id>/’)
  def hello(id):
      return Hello%s% id
写法
    <converter:variable_name>
converter类型
    string  接收任何没有斜杠(‘/’)的文件(默认)
    int 接收整型
    float   接收浮点型
    path    接收路径,可接收斜线(’/’)
    uuid    只接受uuid字符串,唯一码,一种生成规则
    any 可以同时指定多种路径,进行限定
     
请求方法
    默认支持GETHEADOPTIONS, 如果想支持某一请求方式,需要自己手动指定
    @app.route(/rule/’,methods=[GET’,POST’])
    def hello():
        return LOL
    
methods中指定请求方法
    GET
    POST
    HEAD 
    PUT
    DELETE
    
url_for
    反向解析,根据函数名字,获取反向路径
    url_for("蓝图名.函数名")
    url_for(‘函数名’,参数名=value)
 

Request

服务器在接收到客户端的请求后,会自动创建Request对象
Flask框架创建,Request对象不可修改
属性
  url  完整请求地址
  base_url  去掉GET参数的URL
  host_url  只有主机和端口号的URL
  path  路由中的路径
  method  请求方法
  remote_addr  请求的客户端地址  
  args  GET请求参数 
  form  POST请求参数
  files  文件上传 
  headers  请求头
  cookies  请求中的cookie
    
ImmutableMultiDict: 类似字典的数据结构, 与字典的区别,可以存在相同的键  
    argsform都是ImmutableMultiDict的对象
ImmutableMultiDict中数据获取方式
    dict['uname'] dict.get('uname)
获取指定key对应的所有值
    dict.getlist('uname')
                             
1. args
   - get请求参数的包装,args是一个ImmutableMultiDict对象,类字典结构对象
   - 数据存储也是key-value
   - 外层是列表,列表中的元素是元组,元组中左边是key,右边是value
2. form
   - 存储结构个args一致
   - 默认是接收post参数
   - 还可以接收 PUTPATCH参数
 

Response

服务器返回给客户端的数据
由程序员创建,返回Response对象
  1. 直接返回字符串, 可以返回文本内容,状态码
  2. render_template 渲染模板,将模板转换成字符串
  3. 通过make_response(data,code)
    - data 返回的数据内容
    - code 状态码
  4. 返回Response对象
重定向
  redirect()
  url_for(‘函数名’,参数=value)
终止执行, 抛出异常
    主动终止 abort(code)
捕获异常
    @app.errorhandler(404)
    def hello(e):
        return LOL
 

会话技术

Cookie

客户端端的会话技术
cookie本身由浏览器保存,通过Responsecookie写到浏览器上,下一次访问,浏览器会根据不同的规则携带cookie过来
特点:
    - 客户端会话技术,浏览器的会话技术
    - 数据全都是存储在客户端中
    - 存储使用的键值对结构进行的存储
    - 特性
        - 支持过期时间
        - 默认会自动携带本网站的所有cookie
        - 根据域名进行cookie存储
        - 不能跨域名
        - 不能跨浏览器
    - Cookie是通过服务器创建的Response来创建的
 
 设置cookie:
    response.set_cookie(key,value[,max_age=None,exprise=None)]
        max_age: 整数,指定cookie过期时间
        expries: 整数,指定过期时间,可以指定一个具体日期时间
        max_ageexpries两个选一个指定
 获取cookie:
    request.cookie.get(key)
 删除cookie
    response.delete_cookie(key)
 

session

服务器端会话技术,依赖于cookie
特点:
    - 服务端的会话技术
    - 所有数据存储在服务器中
    - 默认存储在内存中
        - django是默认做了数据持久化(存在了数据库中)
    - 存储结构也是key-value形势,键值对
    - session 是离不开cookie
常用操作:
    设置session
        session[key’] = value
        
    获取session
        session.get(key,default=None) 根据键获取会话的值
        
    删除session
        pop(key) 删除某一值  
        clear()   清除所有
        
 

猜你喜欢

转载自www.cnblogs.com/gugubeng/p/9722668.html