Flask框架简介

JessePinkmen 2020-06-14

一、Flask简介

Flask 是一个Python编写的一种轻量级的框架,只提供了web框架基本的功能,比其他的框架更加灵活、自由

二、Flask的安装

框架开发的时候,兼容性是一个很大的问题

开发环境:Python3.7版本,Flask1.1.1 版本

  1. 虚拟环境的使用

    工作中会根据需求,在Python环境下使用各种框架和包,但是可能每个项目使用的框架和版本不一样,这样就要根据需要更新和卸载相应的库,为了不必要的麻烦,便于管理,使用虚拟环境

  2. anaconda虚拟环境的安装,创建指定Python版本的环境

    conda create -n flask_env python=3,7

    flask_env:环境的名字,任意,有阅读性

    Python=3.7:指定Python的版本

  3. 激活进入/离开虚拟环境

    conda active flask_env

    conda deacticve

  4. 进入虚拟环境,下载flask

    pip install flask==1.1.1

    查看当前环境下的包

    pip freeze

二、创建Flask项目

  • 实现最小应用

    使用 pycharm 创建一个项目project01,设置Python虚拟环境

  • 路由

    Flask 根据 HTTP 请求的url在路由表中匹配定义好的路由规则,找到对应的函数处理请求。

    在这个过程中需要保存一个url到行数的映射关系,我们把处理url到函数之间的关系成为路由

    flask中的路由是使用装饰器的形式定义的,并且必须是/开头,否则报错

  • 视图函数

    视图函数是处理用户的请求,返回响应的函数代码块

    在Flask中视图函数的名字不能重复

  • 启动服务器

run启动参数说明
host主机地址,默认是127.0.0.1,运行外部ip地址访问,0.0.0.0
port端口号,默认是5000
debug调试模式,默认为false,开发的时候一般设置为true,这样有视图有错误,在浏览器中显示,方便调试错误。项目上线需要改为false。也可以启动重启代码。
use_reloader是否自动重启代码,默认为false,true为自定义
  • url路径参数(动态路由)

    可以通过请求的url中获取需要的参数。例如:现在定义一个路由/users/,如果请求的url为/users/1,表明想要获取编号为1的用户信息,则这里的1就是请求中传递的参数

    @app.route(‘/users/<sid>‘)
    def hello_world(sid):
        return ‘查询id是{}的用户信息‘.format(sid)

    上面代码中<>即为转换器语法,默认为字符串类型,即匹配到的内容始终为字符串类型

    Flask中其他类型转换器

转换器类型使用
string字符串类型< string:name >
int整数类型< int:name >
float小数类型< float:name >
path路径类型< path:name >

三、Flask模板系统

flask默认采用是jinja2模板进行模板渲染,jinja2是python第三方的一个模板渲染模块,通常用于flask,tornado框架中,jinja2的开发大量参考了django的模板渲染系统,相似度达到98%

静态文件:css,js,img等这些都是静态文件,flask中默认加载当前目录下的static目录下的静态文件

模板文件:flask默认当前目录下的templates目录下的模板文件

  • 调用静态页面
    1. 新建一个templates目录,存放了html文件
    2. 导入from flask import render_template模块,调用静态页面
@app.route(‘/index‘)
def hello_world():
    return render_template("index.html")
  • 视图传递参数到模板

    如果使用这种方式传递参数,如果变量的数量多的情况下,使用起来不方便,可以使用解包将函数内的所有变量传递到模板中。

    html页面参数语法:{{name}}

@app.route(‘/index‘)
def hello_world():
    name = "老王"
    age = 33
    gender = "男"
    return render_template("index.html",name=name,age=age,gender=gender)

@app.route(‘/index‘)
def hello_world():
    name = "老王"
    age = 33
    gender = "男"
    return render_template("index.html", **locals())
  • 模板语法

    1. 变量的使用

      语法:{{变量名}},jinja2模板引擎支持python中基本数据类型,类变量等

      变量可以根据索引或者 . 取出来

      jinja2模板引擎可以使用一些python提供的一些方法。例如:upper,replace,lower等方法

      比如:{{p.name.replace("老","小")}}

    2. 控制语句

      (1) if语句

      {% if 条件%}

      {% elif 条件 %}

      {% else %}

      {% endif %}

      (2) for循环

      {% for 变量 in 可迭代对象 %}

      {% endfor %}

#if控制语句
{% if age<18 %}
    未成年
{% elif age<50 %}
    青壮年
{% else %}
    老年
{% endif %}

#for循环
{% for i in hobby %}
        {{ i }}
    {% endfor %}
    
{% for k,v in info.items() %}
        {{ k }}-{{ v }}
    {% endfor %}
    
    {% for i in hobby %}
        {% if loop.index%2 == 0 %}
            {{ loop.index0 }}:{{ i }}
        {% else %}
           {{ loop.index0 }}:{{ i }}
        {% endif %}
    {% endfor %}

(3) loop

在for循环中,jinja2还提供一个特殊变量,用来获取当前的遍历状态

方法说明
loop.index当前迭代的索引(从1开始)
loop.index0当前迭代的索引(从0开始)
loop.first是否是第一次迭代,返回bool
loop.last是否是最后一次迭代,返回bool
loop.length序列中项目的数目
  • 过滤器

    过滤器本质是函数,可以使用过滤器将视图传递过来的值进行修改显示的效果

    jinja2提供的常见过滤器:

{{ nick_name | capitalize }}
{{ nick_name | upper }
{{ nick_name | replace("ni","NI") }}
方法说明
capitialize首字母转换成大写,其他字母转换为小写
lower转换成小写形式
upper转换成大写形式
title每个单词的首字母都转换成大写
replace替换字符串的值
round对数字进行四舍五入
safe渲染时值不转义
  • 自定义过滤器
    1. 定义过滤器函数
    2. 注册过滤器函数(函数的名字,过滤器的名字)
#自定义过滤器
def my_add(num1, num2):
    return num1 + num2


app.add_template_filter(my_add, "myadd")

四、静态文件

在全栈开发过程中,把css,js,img等非html内容看做是静态内容

在网站有很多资源不存在数据库中,直接放在服务器上,那么这样的资源叫做静态资源

flask在开发过程中,静态文件需要放在默认的静态位置(当前脚本目录下的static目录,并且在html中,使用/static/来代替目录)

五、模板继承与加载

针对网站所有的页面通常使用一个模板,由于风格和需求导致,所有页面都相同的部分,为了减少代码冗余,方便代码修改,出现了继承和加载两种机制

1、继承:

当我们浏览器一个网站的时候发现里面有大部分是相同的,这时候我们为了去除代码的冗余,使用继承。

(1) 定义父模板,在父模板中定义block

(2) 在子模板中继承,根据需要实现父模板中的block

2、包含

将可以常用的页面内容如导航条,尾页信息等不变的组件可以保存到单独的文件中,然后在需要使用敌方按照如下语法导入即可。

#继承
{% extends "father.html" %}
{% block title %}{% endblock %}

#包含
{% include "myblock.html" %}

相关推荐

yyyxxxs / 0评论 2020-05-10