前言
最近打算将学过的python后端再系统地去梳理一下,学得再深入一些,一直停留在表面的知识在需求面前总是显得如此苍白。只能说自己的知体系识欠缺很多呐,从零到一的路总是比较坎坷的,踏实一点啃一下文档吧,总之继续加油咯!
那么在接下来的几篇文章中我会将python的后端框架 —— Flask框架的基础知识再整理一下,希望对未来的自己和一起学习的你们有帮助吧。
本篇文章主要是重新梳理Flask知识并整理了一下主要的知识点,顺便带大家大致入个门哈哈哈。
目录
5.request对象、Session、g对象和Cookies值
在正式梳理之前我们要明确一个概念,什么是后端,后端是在做什么的?
我个人的理解是:后端是在本地服务器或者是和云服务器上跑的应用程序,响应着前端页面的同时也为前端提供着数据服务,并对前端返回的的用户数据和储存在数据库中的数据进行管理,进而实现软件服务的功能。
一、什么是Flask?
Flask其实是python语言编写的一个轻量级的后端框架,更加适合MVC软件架构的开发模式。Flask是一个微框架,他不像Django内置了一个数据库的操作,所以显得轻量且灵活。当然了,他也是基于python的网络接口WSGI提供底层的网络服务,在数据库的选择使用比较灵活,关系型数据库和非关系型的数据库均可。以关系型数据库为例,我们可以使用SQLAlchemy构建关系型数据库的ORM框架,使用flask-sqlacodegen拓展来快速生成数据库文件Model,提高我们的开发效率。这也体现了Falsk的另一个特点:高效性。
二、基础语法
1.快速上手
from flask import Flask
app = Flask(__name__)
@app.route('/crj')
def hello():
return 'Hello, CRJ'
if __name__ == '__main__':
app.run()
上面的代码就是Flask的一个小型的应用,我们可以看到,我们首先导入了一个Flask类并创建了该类的实例,然后使用@route装饰器来为编译器注明URL地址,当客户端访问到该URL地址的时候,就会触发该路由下的函数并执行其功能。
__name__ == '__main__'
这行代码表示的是当该模块被当前程序单独运行而不是以代码包的形式导入运行的时候,才可以进入改判断语句执行程序。
2.重定向问题
先来看看下面的代码段:
@app.route('/projects/')
def projects_01():
return 'I am 01'
@app.route('/projects')
def projects_02():
return 'I am 02'
我们看到,这上面的装饰器修饰的路由就只是在结尾有没有加一个反斜杠的问题。那么加不加反斜杠有什么区别呢?其实在客户端输入ip后,我们的浏览器会从服务器那里查询有没有指定路由下的文件,如果没有,那么浏览器会做出修正,在路由末端加上一个反斜杠,即当成一个目录来处理,默认访问该目录下的首页并报一个301的状态码。
3.动态路由
3.1url_for()——构建URL
在url_for()函数中可以直接传参数,一般直接将第一个参数作为函数名称,同时可以接受任意个关键字参数,分别对应着URL中的变量,如果在URL中没有这个变量的话,那么就会作为查询参数加在URL后。
3.2路由中的变量
#路由函数
@app.route('/user/<name>')
def fun(name):
return 'fun_name is {}'.format(name)
#调用url_for()
url_for('fun',name='CRJ')
为什么可以使用url_for函数访问路由函数的名称?
url_for()函数是基于视图名称和arguments对象来生成对应视图的URL的,这个与视图相关联的名称被称为端点,在一般情况下,视图函数的名称与端点是相同的。
4模板与静态文件
跟Django框架一样,Flask在安装的时候就已经自动安装了它的配套模板引擎——Jinja2。Jinja2所实现的功能非常强大且必要,在实际开发做项目的时候它可以将我们的前端模块化地封装起来,同时,提高前端代码地复用率,减少开发时的资源浪费。
4.1 Jinja2的基础语句:
<!--模板继承-->
{% block content %}
...
{% endblock %}
<!--导入js/css文件-->
{% block js %}
...
{% endblock %}
{% block css %}
...
{% endblock %}
<!--逻辑语句-->
{% for item in list %}
...
{% endfor %}
{% if name %}
...
{% else %}
...
{% endif %}
<!--变量引用-->
{{变量}}
4.2 render_template()
先来看看着两句代码:
@app.route('/')
def fun2():
return render_template('test.html', name=name)
在客户端访问到指定的ip下的路由时,会执行fun2函数,同时浏览器会渲染一个名字为test.html的模板,并向该模板传递参数。
5.request对象、Session对象、g对象和Cookies
5.1 request对象
Flask的request对象在我们实际的开发中用的还是比较多的,通过它我们可以获取客户端发起的请求数据,包括访问的地址、表单提交的数据、请求头、查询参数、请求方法等等。
request 对象的常见属性
属性 | 意义 |
---|---|
method | 当前http请求方法(大多时候用来区分get和post方法) |
headers | http请求的请求头 |
cookies | cookies名称和值的字典对象 |
files | 与上传文件有关的参数 |
args | 客户端请求的查询参数的字典对象 |
form | 表单参数及其值的字典对象 |
values | 包含所有数据的字典对象,可以理解为是args+form |
url | 整个url地址 |
base_url | 出去查询参数以外的地址 |
host | 主机名+域名 |
host_url | 出去路径、文件名和查询参数以外的部分 |
path | 路径 |
full_path | 路径+查询参数 |
URL结构:协议+主机名+域名+端口+路径+文件名+查询参数
5.2 Session——会话
首先我们需要指导session是什么,其实session的作用跟cookies是差不多的,较大的区别就是session是服务器从自身内存中开辟出来的一块储存用户状态数据的区域,而cookies则是储存在客户端。session虽然是在服务器端的,但是它的运行需要客户端的cookies中session id来作为识别标志区分不同的客户端。在创建session之后如果不再访问,那么session就会开始计时,一旦在整个生命周期中没有客户端访问,那么session就会被销毁。
from flask import session,Flask,render_template
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)#必须设置,否则会报错
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7) #生成过期日期
@route('/')
def fun():
#获取名称为key的session变量值
values = session.get('key')
session.permanent = True #设置为true后用户退出浏览器后不会删除session值
return render_template('index.html',values=values)
if __name__ == '__main__':
app.run()
获取session变量还可以使用
values=session['key']
但如果这个变量不存在的话,那么可能会抛出异常;而使用session.get()方法的话会返回一个None值,不会抛出异常。
设置session变量
session['key'] = values
删除session变量
session.pop('key')
清空变量值
session.clear();
5.3 g变量
我们需要区别的是g变量和session的区别:g变量是在一个请求内创建的临时全局变量,作用的区域就是在这个请求内;而session则是在器生命周期内同一个客户端发来的不同请求均可以共享该session变量,需注意该变量的唯一性。
使用方法很简单,只需要从flask调入g拓展模块就好。
from flask import Flask,g
这时候就可以讲g变量作为一个全局变量来使用了
5.4 Cookies值
Cookies是储存在客户端的用户状态数据,用于网站跟踪用户动态,实现用户的自定义功能。Cookies在用户关闭浏览器的时候就结束其生命周期,通常是以小型文本文件(txt)保存在用户的主机上。
cookies的读取
values= request.cookies.get('key')
创建cookies
如果想在一个响应中添加cookies,我们可以借助response对象的set_cookies()方法:
方法参数:
参数名称 | 含义 |
---|---|
key | cookies键名 |
value | cookies值 |
max_age | cookies可以被保存的时间 |
expires | 具体的过期时间 |
path | 指定cookies可用路径,默认为域名 |
domain | 指定cookies可用域名 |
secure | 若为True,则只有通过HTTPS才可以使用 |
httponly | 若为True,则可以禁止客户端js获取cookies |
from flask import make_response
@app.route('/')
def index():
resp = make_response(render_template(...))
resp.set_cookie('key', 'values')
return resp
获取cookies
cookies = request.cookies.get('key')
删除cookies
resp = make_response(render_template('...'))
resp.pop('key')
6.Blueprint——蓝图
为了更好的管理代码,flask为我们提供了Blueprint这个对象。在构建项目的时候,我们总是需要考虑到代码的可读性和再维护的能力,Blueprint的出现无疑为我们开发降低了难度。通过Blueprint我们可以将功能进行模块化,将负责相同功能的视图函数注册在同一个路径下;Blueprint可以有自己单独的静态文件和模板;再使用Blueprint时,我们需要将Blueprint注册到一个应用上。
那么如何使用呢?先举个例子
我们首先创建一个蓝图文件www.py,作为一个路由映射表
#从视图层导入视图函数
from web.controlers.account.account import route_account
#Flask实例
from application import app
#对蓝图进行配置
app.register_blueprint(route_account, url_prefix="/account")
接着创建所对应的视图文件account.py
# -*- coding: utf-8 -*-
from flask import Blueprint, request, redirect, jsonify
from application import app, db
route_account = Blueprint( 'account_page',__name__ )
@route_account.route( "/index" )
def index():
resp_data = {}
return resp_data
需要注意的是,视图文件中的Blueprint对象route_account需register_blueprint()中进行注册,url_prefix属性决定了该注册的Blueprint对象的根路径。当然了,我们也可以在视图文件中为该视图文件中创建的Blueprint对象添加子路径以区分不同的功能块。
总结
洋洋洒洒也写了五千字了,大概Flask入门掌握这些基础概念就差不多了,那么如何开启一个flask项目呢?所需要学习的还不止这些,接下来我也会着重整理一下如何去部署一个flask项目,同时也要继续深入学习下去。之后有意向去往后端方向发展的话学习一两个框架是远远不够的,后端其实门槛挺高的,想靠这个养活自己我觉得至少计算机网络、操作系统、数据库和Linux都得精通,并且最好具备多种技术栈吧。未来,荔枝和大家一起加油哦!
码文不易,喜欢的小伙伴麻烦举个爪子,给荔枝来个一键三连哈~
~~~比心心~~~