少女祈祷中...

入门Flask框架

Flask是一个用Python语言编写的轻量级Web应用框架,它采用WSGI工具箱和Jinja2模板引擎,该框架使用简单的核心和扩展,没有默认的数据库和窗体验证工具,被称为“微框架”。

核心

WSGI工具箱采用Werkzeug(路由模块),模板引擎采用jinja2

特点

轻量级,只提供一些核心操作

相关知识

框架:Web框架是一种用于开发Web应用的软件架构,它提供了一些通用的功能和组件,使得开发者可以更方便、高效、安全地构建Web应用。

模板引擎(Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。

模板引擎的核心原理就是两个字:替换。将预先定义的标签字符替换为指定的业务数据,或者根据某种定义好的流程进行输出

模板:模板是一种文件,它可以包含固定的和动态的内容。动态的内容通常是用一种特定的语法来表示的,

**路由(route)**:简单来说,路由就是URL到视图函数的映射。当访问某个URL时,就会执行对应的函数

如:/usersu -> getAllUsers()

router 可以理解为一个容器,或者说一种机制,它管理了一组 route。简单来说,route 只是进行了URL和函数的映射,而在当接收到一个URL之后,去路由映射表中查找相应的函数,这个过程是由 router 来处理的。

构成

from flask import Flask        #1.导入
app=Flask(__name__) #2.创建Flask对象,管理全局路由,配置信息

@app.route('/') #3.设置装饰器,将路由映射到视图函数
def index(): #4.定义触发函数
return 'Hello world'

if __name__=='__main__':
app.run() #5.Flask对象调用run方法,启动服务器

目录结构:app.py主程序,templates存放模板文件,static存放静态文件

装饰器

装饰器的一般语法结构如下:

def decorator(func): 
# 定义装饰器函数,接收一个函数作为参数
def wrapper(*args, kwargs):
# 定义包装函数,接收任意数量的参数
# 在这里可以添加一些代码,在原函数执行前后执行
return func(*args, kwargs)
# 调用原函数,并返回结果
return wrapper # 返回包装函数

要使用装饰器,可以在要被装饰的函数上方使用@符号,后面跟着装饰器的名称。

@decorator # 使用@符号应用装饰器def my_func(): # 定义要被装饰的函数pass # 函数体

这相当于执行了以下代码:

def my_func():
pass

my_func = decorator(my_func) # 将my_func作为参数传给decorator,并将返回值赋给my_func

初始化

flask对象初始化参数

Flask(import_name,static_url_path,static_floder,template_folder)

import_name(必要):

工程(主模块)目录名称,__name__当前模块(目录)名称,可决定访问静态文件的路径

static_url_path

静态文件访问路径,默认为/+static_floder

static_floder

静态文件存储的文件夹名称,默认为’stastic’

template_folder

模板文件存储的文件夹名称,默认为’templates’

web应用程序配置参数

作用:集中管理项目中所有的配置

flask将配置信息放入了app.config属性之中,该属性可以按照字典类型进行操作

设置

1.从配置对象中加载

app.config.from_object(配置对象),如

class DefaultConfig(object):          #设置配置类
SECRET_KEY='acdvdasd'

app.config.from_object(DefaultConfig)

2.从配置文件中加载

app.config.from_pyfile(‘文件名’)

3.从环境变量中加载

app.config.from_envvar(‘环境变量名’)

app.run(host=”0.0.0.0”,port=5000,debug=True,threaded=True)

debug调试模式

1.程序修改后可以自动重启

2.服务器出现错误能够返回给前端

threaded–是否开启多线程

终端启动–flask run -h 0.0.0.0 -p 5000

读取环境变量FLASK_APP的值作为启动文件

export FLASK_APP=app

路由与蓝图

查看全部路由

1.命令行

flask routes

2.程序中查看

app.url_map

app.url_map.iter_rules()–返回列表

指定请求方式

默认支持的请求方式:GET、OPTION、HEAD

app.route(‘url’,methods=list)

蓝图

一个存储一组视图方法的容器对象,具有以下特d

  • 一个应用可以具有多个Blueprint
  • 可以将一个Blueprint注册到任何一个未使用的URL下
  • 蓝图可以单独具有自己的模板、静态文件、或其他通用操作方法,并不是必须实现应用视图和函数
  • 一个应用初始化时,就应该注册需要使用Blueprint,蓝图并不是一个完整应用,必须要注册到某一应用中

使用

1.创建蓝图对象

from flask import Blueprint
user_bp=Blueprint('user',__name__)

2.在这个蓝图对象上进行操作,注册路由,指定静态文件,注册模板过滤器

@user_bp.route('/')
def user_profile():
return 'usee_profile'

3.在应用对象上注册蓝图对象

app.register_blueprint(user_bp)

请求与响应

转化器,获取动态url参数

获取路径参数

route(‘/user/converter:id‘)

converter–数据类型:string(默认)、int、flaot、path、uuid、any

url_for()–根据函数获取url

获取请求数据

通过request对象获取

属性 说明 类型
data 记录请求数据,并转化为字符串 *
form 记录请求中的表单数据 MultiDict
args 记录查询参数 MultiDict
cookies 记录请求中cookie信息 Dict
headers 记录请求头信息 EnvironHeaders
method 记录请求的HTTP方法 GET/POST
url 记录URL地址 string
files 记录请求上传的文件 *

示例

id=request.args.get('id')

处理响应

1.模板渲染

使用render_template方法渲染模板并返回

导入

from flask import render_template

使用

return render_template('index.html',mystr(模板内变量名)=strval(程序中的变量),...)

参数已经封装成字典,在字典前添加**,如**data

render_template_string()将字符串当作模板文件内容进行渲染

2.重定向
from flask import redirect
...
return redirect(url)
3.返回JSON
from flask import jsonify
return jsonify(json_dict)

自定义状态码和响应头

make_respone(其中一种方式)

resp=make_respone('test')
resp.headers['Itcast']='Test'
resp.status="404 not found"
return resp

cookie和session

response.setcookie( )

response.delete_cookie()–删除cookie

from flask import session
session['test']='test'

请求钩子与上下文

异常处理

abort(code)

http异常主动抛出,抛出一个状态码code

捕获错误

errorhandler装饰器

注册一个错误处理程序,当程序抛出异常时,就会执行装饰器的方法

@app.errorhandler(500(状态码或异常的类型))
def server_error(e):
...

请求钩子

请求钩子是一种在Flask框架中实现请求前后执行一些操作的方法,比如打印日志、验证身份、处理异常等。请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:

  • before_first_request:在处理第一个请求之前执行,可以用于初始化项目的一些配置或资源。
  • before_request:在每次请求之前执行,可以用于判断权限、转换路由参数或预处理客户端请求的数据。
  • after_request:在每次请求(视图函数处理)之后执行,前提是视图函数没有出现异常,可以用于修改响应数据、记录操作历史、清理收尾工作等。
  • teardown_request:在每次请求之后执行,无论视图函数是否出现异常,可以用于记录异常信息、释放资源等。

示例

@app.before_first_request
def init_db():
print("初始化数据库连接")

上下文

Flask中的上下文是指在处理请求时,Flask会创建一些对象,如request, session, current_app, g等,这些对象保存了请求相关的信息或程序的状态。上下文可以让视图函数直接访问这些对象,而不需要通过参数传递。

Flask中有两种上下文:请求上下文和程序上下文。

  • 请求上下文包括request和session,它们是从_request_ctx_stack这个LocalStack对象中获取的。
  • 程序上下文包括current_app和g,它们是从_app_ctx_stack这个LocalStack对象中获取的。
请求上下文

–解决多线程问题

request、session

程序上下文

不同文件下调用对象

current_app

from flask import current_app
引用current_app相当于主程序中的app对象
current_app.config.get('Itcast')

g对象

g作为flask程序全局的一个临时变量,便于函数之间的参数传递

模板

模板中的变量

{{ var }},视图传递模板的数据,变量不存在,默认忽略

模板中的标签

{% tag %}

主要语法标签:

变量标记 - {{ }}

语句执行 - {% %}

注释语句 - ````

变量输出:

变量输出以{{ }}包裹

变量 - {{变量名}},比如{{myname}}

对象 - {{obj.属性}}、字典 - {{dict['key']}}、列表 - {{lists[i]}}、函数 - {{func()}}

条件语句

根据条件选择显示不同的html部分

{% if condition %}
html
{% elif condition %}
html
{% else %}
html
{% endif %}

for 循环语句

{% for item in items %}
html{{item}} html
{% endfor %}

设置变量

{% set a='666' %}
{{ a }}
模板继承

将网页结构提取出来,新建一个base.html

继承语法:

{% extend "base.html" %}

其中base.html为父模板,所有的字模板脑结构都继承自base

模板全局变量

上下文处理函数:

@app.context_processor
def account():
username = "luxp"
return {'username':'luxp'}

每个视图函数执行的时候,会自动执行该函数,接受该变量传给模板渲染函数