Django框架属于重量级框架
Flask和Tornado框架就属于轻量级框架
首先安装虚拟环境,命令如下:
sudo pip3 install virtualenv
接下来还要安装虚拟环境扩展包,命令如下:
sudo pip3 install virtualenvwrapper
安装虚拟环境包装器的目的是使用更加简单的命令来管理虚拟环境。
修改用户家目录下的配置文件.bashrc,添加如下内容:
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh
然后执行source .bashrc让配置生效。
创建一个名字为 flask_1.0的环境:
mkvirtualenv flask_1.0
安装Flask
pip install flask
Flask参数配置方式有很多种,每一种都可以达到结果,在合适的场景选择合适的配置方式。
在文件加中新建一个config.cfg配置文件,在配置文件上写上下面语句,表示开启调试模式。
直接操作配置
直接操作适用于配置参数较少的场景,config本质其实就一个字典。
路由,其实就是我们在浏览器输入地址后,后台进行匹配,如果匹配上,则执行此视图函数并返回内容。我们经过前面的例子也看出来Flask是用一个叫route()的装饰器进行装饰到视图函数上,匹配的内容是去掉域名和端口后面地址.
重定向是网站比较常用的地址跳转,比如我们在网站登录后,需要重新跳转到首页,这个功能我们就可以用到重定向。
redirect函数用于重定向。
url_for参数是视图函数函数的名字,它会根据视图函数的名字找到装饰次视图的路由。
请求方式
GET 获取资源
POST 新增资源
PUSH 更新资源
DELETE 删除资源
OPTIONS 询问支持的方法
在Flask中支持下面这些转换器:
转换器 含义
default 接受字符串,默认转换器
stirng 接受字符串,跟默认一样
int 接受整数
float 同 int ,但是接受浮点数
uuid 唯一识别码
path 和默认的相似,但也接受斜线
自定义转换器
有时候系统提供的转换器并不能满足我们,比如我们需要的UID是至少5最多10位。如果不是这个范围呢,我们就可以认为不满足我们的匹配规则。而现在我们不管输入多少位,后台都会匹配上,然后就去执行我们的视图。如果要排除这种现象,我们就需要自定义转换器。
需要用到Flask这个转换器基类BaseConverter
to_python 只要使了转换器,一直会被调用
to_url 只有在重定向了,并且路由上有参数的时候才会被调用
当我们重定向了,并传递参数的时候,参数会先到to_url,返回的值会去匹配路由上的正则。
如果匹配上了,就把匹配到参数传到 to_python ,这个方法返回的值才会到视图函数中。
变量
现在模板的内容是写死的,这肯定满足不了咱们,我们希望把后台返回的内容渲染在到模板上。Flass使用 Jinja2这个模板引擎来渲染模板。
我们先把pycharm里的模板语言改成Jinja2
在模板中用模板语言解析出我们的数据,解析变量我们{{}},这种语法我们叫变量代码块
模版中的变量代码块可以是任意 Python 类型或者对象,只要它能够被 Python 的 str() 方法转换为一个字符串就可以。
标签
用 {%%} 定义的控制语句的代码块,可以实现一些语言层次的功能,比如循环或者if语句。比如我们要上面的所有的爱好变量出来,模板中可以增加
注释
使用 {# #} 进行注释,注释的内容不会在html中被渲染出来。
{# {{ name }} #}
过滤器
过滤器顾名思义就是一边进入原始数据,一边出你想要的数据。其本质就是一个函数,比如我们取列表的长度、格式化时间等操作,写法跟linux里面的管道一样。
我们在模板中加入一些过滤器试试:
长度过滤器:
{{ name|length }}<br>
默认过滤器,当后台没有返回sex的时候会执行:
{{ sex|default('男') }}<br>
反转过滤器:
{{ name|reverse }}<br>
过滤器支撑链式调用:
{{ "hello world" | reverse | upper }}
语句块操作:
{% filter upper %}
'abc'
{% endfilter %}
常用过滤器:
禁用转义:{{ '<em>hello</em>' | safe }}
删除标签:{{ '<em>hello</em>' | striptags }}
首字母大写:{{ 'hello' | capitalize }}
所有值小写:{{ 'HELLO' | lower }}
首字母大写:{{ 'hello world' | title }}
字符串反转:{{ 'hello' | reverse }}
字符串截断:{{ 'hello world' | truncate(5) }}
获取列表长度:{{ [1,2,3,4,5,6] | length }}
列表求和:{{ [1,2,3,4,5,6] | sum }}
列表排序:{{ [6,2,3,1,5,4] | sort }}
自定义过滤器
虽然系统给我提供了很多过滤器,但是需求这种东西是永远满足不了,所以这个时候就需要我们自定义过滤器。上面也说了过滤器的本质其实就一个函数
request
我们都知道当浏览器去访问一个地址时,Http协议会像后台传递一个request对象。这个request对象包含了请求头、请求参数、以及请求方式,当然后台可以取到request。然后进行逻辑处理。
GET请求
我们写一个接受个人信息的接口,也就是视图函数。我们新建一个名为register.html的模板,在模板里写如下表单:
action:表示要提交到的地址
method:请求方式
POST请求
登录和注册都会使用Post请求,谁也不希望自己的一些敏感信息在浏览器的地址上显示。那我们把刚才的列子刚改Post请求,齐前端只需要把表单里面的method改下就行
后台需要改的地方有两个地方:
请求方法:默认是get请求
参数提前:把args改成form
上传文件
上传文件也是我们经常用到的功能,前端上传一张文件,然后后端处理保存到服务器上。
文件这种类型属于多媒体类型资源。前端form表单里面需要加enctype="multipart/form-data"。我们新建一个名upload.html模板
response
视图在接收HttpRequest并处理后,必须返回HttpResponse对象。目前视图函数只是返回字符串,之后 Flask 将字符串转换为响应对象。如果你要显式地转换,你可以使用make_response()函数然后再进行修改
Cookie
我们都知道HTTP协议是无状态的请求协议,用户这次访问和下一次访问都是新的请求,它们之间是没任何关系的。但是我们需要知道上一次访问用户做了什么操作,就需要用到cookie。cookie是网站以键值对格式存储在浏览器中的一段纯文本信息,用于实现用户跟踪。cookie是基于域安全的
过期时间
cookie是有过期时间的,当我们设置cookie的时候可以直接给cookie设置过期时间,有如下几种设置方法:
max_age是一个整数,表示在指定秒数后过期。
expires是一个datetime或timedelta对象,会话将在这个指定的日期/时间过期。
max_age与expires二选一。
如果不指定过期时间,在关闭浏览器时cookie会过期。
session
除了cookie外还有一个叫session的机制。session也是可以存储一些信息的。对于一些敏感、重要的信息,我们可以存储到session中。谁也不希望自己的余额、银行卡密码存到cookie当中。
cookie和session结合使用:web开发发展至今,cookie和session的使用已经出现了一些非常成熟的方案。在如今的市场或者企业里,一般有两种存储方式:
存储在服务端:通过cookie存储一个session_id,然后具体的数据则是保存在session中。如果用户已经登录,则服务器会在cookie中保存一个session_id,下次再次请求的时候,会把该session_id携带上来,服务器根据session_id在session库中获取用户的session数据。就能知道该用户到底是谁,以及之前保存的一些状态信息。这种专业术语叫做server side session。
将session数据加密,然后存储在cookie中。这种专业术语叫做client side session。flask采用的就是这种方式,但是也可以替换成其他形式。
过期时间
如果没有设置session的有效期。那么默认就是浏览器关闭后过期。
如果设置session.permanent=True,那么就会默认在31天后过期。
如果不想在31天后过期,那么可以设置app.config[‘PERMANENT_SESSION_LIFETIME’] = timedelta(hour=2)在两个小时后过期。
删除session
删除session中的值:也是类似字典。可以有三种方式删除session中的值。
session.pop(key)
del session[key]
session.clear()
把session存在服务端
我们可以利用flask-session来把session存在服务器,毕竟session的数据比较重要,存在浏览器中不安全。
flask-session支持把session存在各种数据库中
redis
memcached
filesystem
mongodb
sqlalchmey
我们最好把session存在内存级的redis数据库中,读写速度比较快。
异常
我们在写视图函数时,会对前端传递过来的参数进行校验,如果校验不过,会给前端返回一些特定的异常信息。在Flask中,abort() 函数可以立即终止视图函数的执行,并且把相对应的错误信息返回给前端
注意abort里面的状态码必须就是HTTP状态码,不能自己随便写。常见状态码如下:
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求
常见状态码:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
网友评论