侧边栏壁纸
博主头像
xiaoming博主等级

累死自己,卷死别人,为了小刘而努力!!!

  • 累计撰写 24 篇文章
  • 累计创建 7 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Flask 基础使用教程

Administrator
2023-04-15 / 0 评论 / 0 点赞 / 53 阅读 / 12954 字 / 正在检测是否收录...
  • 1. url和视图
    • 1.1 定义不带参数的url
    • 1.2 定义参数的url
    • 1.3 重定向
    • 1.4 使用jsonify,生成json数据响应体
    • 1.5 请求钩子函数
    • 1.6 request
  • 2. 模板的渲染
    • 2.1 导入render_template
    • 2.2 模板控制语法
    • 2.3 过滤器
      • 2.3.1 字符串
      • 2.3.2列表
      • 2.3.3 自定义过滤器
    • 2.4 继承
  • 3. 静态的文件的加载
  • 4. Flask连接MySQL数据库
    • 4.1 docker安装mysql数据库
      • 4.1.1 启动docker容器
      • 4.1.2 配置数据库支持远程连接
      • 4.1.3 配置支持Navicat远程连接(mysql5.7 版本之后需要,因为加密算法改变)
    • 4.2 安装 flask-sqlalchemy
    • 4.3 flask连接mysql数据库配置
    • 4.4 ORM与表的关系
      • 4.4.1

1. url和视图

1.1 定义不带参数的url

@app.route('/')
def hello_world():
	return 'hello world!'

@app.route('/profile')
def profile():
	return '我是个人中心'

@app.route('/blog/list')
def blog_list():
	return '我是博客列表'

1.2 定义参数的url

# 带参数的url:将参数固定到path中
@app.route("/blog/<int:blog_id>")
def bolg_detail(blog_id):
	return "您访问的博客是:%s" % blog_id

# 查询字符串的方式传参
# /blog/list: 会给我们返回第一页的数据
# /blog/list?page=2: 获取第二页的数据
@app.route('/book/list')
def book_list():
	page = request.args.get("page", default=1, type=int)
	return f"您获取的是第{page}的图书列表"

1.3 重定向

# 重定向到其他网址
@app.route('/demo5')
def demo5():
    return redirect('https://www.baidu.com')
  

# url_for重定向
# 路由传递参数
@app.route('/user/<int:user_id>')
def user_info(user_id):
    return 'hello %d' % user_id
  
# 重定向
@app.route('/demo5')
def demo5():
    # 使用 url_for 生成指定视图函数所对应的 url
    return redirect(url_for('user_info', user_id=100))

1.4 使用jsonify,生成json数据响应体

# 生成json数据响应体
@app.route('/demo4')
def demo4():
    json_dict = {
        "user_id": 10,
        "user_name": "laowang"
    }
    return jsonify(json_dict)

1.5 请求钩子函数

在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:

  • 在请求开始时,建立数据库连接;
  • 在请求开始时,根据需求进行权限校验;
  • 在请求结束时,指定数据的交互格式;

为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。

请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:

  • before_first_request:在处理第一个请求前执行
  • before_request:在每次请求前执行,在该装饰函数中,一旦return,视图函数不再执行
  • after_request:如果没有抛出错误,在每次请求后执行
    • 接受一个参数:视图函数作出的响应
    • 在此函数中可以对响应值,在返回之前做最后一步处理,再返回
  • teardown_request:在每次请求后执行
    • 接受一个参数:用来接收错误信息
from flask import Flask
from flask import abort

app = Flask(__name__)

# 在第一次请求之前调用,可以在此方法内部做一些初始化操作
@app.before_first_request
def before_first_request():
    print("before_first_request")


# 在每次请求之前调用,这时候已经有请求了,可能在这个方法里面做请求的校验
# 如果请求的校验不成功,可以直接在此方法中进行响应,直接return之后那么就不会执行视图函数
@app.before_request
def before_request():
    print("before_request")
    # if 请求不符合条件:
    #     return "laowang"

# 在执行完视图函数之后会调用,并且会把视图函数所生成的响应传入,可以在此方法中对响应做最后一步统一的处理
@app.after_request
def after_request(response):
    print("after_request")
    response.headers["Content-Type"] = "application/json"
    return response

# 请每一次请求之后都会调用,会接受一个参数,参数是服务器出现的错误信息
@app.teardown_request
def teardown_request(e):
    print("teardown_request")

@app.route('/')
def index():
    return 'index'

if __name__ == '__main__':
    app.run(debug=True)
  • 在第1次请求时的打印:
before_first_request
before_request
after_request
teardown_request
  • 在第2,3,.. n次请求时的打印:
before_request
after_request
teardown_request

1.6 request

request 就是flask中代表当前请求的 request 对象,其中一个请求上下文变量(理解成全局变量,在视图函数中直接使用可以取到当前本次请求)

常用的属性如下:

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

2. 模板的渲染

2.1 导入render_template

使用render_template('xxx.html')模板

2.2 模板控制语法

  • 获取变量值:
    <h1>整数:{ {number} }</h1>
    <h1>元祖:{ {tuple[0]} }</h1>
    <h1>列表:{ { list[0] } }</h1>
    <h1>字典:{ { dict['key'] } }</h1>
  • 分支语句if
{ % if 条件 % }
    语句1
 { % else % }  
    语句2
{ % endif % }
  • for循环
{% for 变量  in 容器 %}
    语句
{% endfor%}

2.3 过滤器

2.3.1 字符串

* 使用格式:{{ 字符串 | 字符串过滤器 }}
  • safe:禁用转义
<p>{{ '<em>hello</em>' | safe }}</p>
  • capitalize:把变量值的首字母转成大写,其余字母转小写
<p>{{ 'hello' | capitalize }}</p>
  • lower:把值转成小写
<p>{{ 'HELLO' | lower }}</p>
  • upper:把值转成大写
<p>{{ 'hello' | upper }}</p>
  • title:把值中的每个单词的首字母都转成大写
<p>{{ 'hello' | title }}</p>
  • reverse:字符串反转
<p>{{ 'olleh' | reverse }}</p>
  • format:格式化输出
<p>{{ '%s is %d' | format('name',17) }}</p>
  • striptags:渲染之前把值中所有的HTML标签都删掉
<p>{{ '<em>hello</em>' | striptags }}</p>

2.3.2列表

* 使用格式:{{ 列表 | 列表过滤器 }}
  • first:取第一个元素
<p>{{ [1,2,3,4,5,6] | first }}</p>
  • last:取最后一个元素
<p>{{ [1,2,3,4,5,6] | last }}</p>
  • length:获取列表长度
<p>{{ [1,2,3,4,5,6] | length }}</p>
  • sum:列表求和
<p>{{ [1,2,3,4,5,6] | sum }}</p>
  • sort:列表排序
<p>{{ [6,2,3,1,5,4] | sort }}</p>

2.3.3 自定义过滤器

  • 先定义函数
  • 后添加到过滤器列表,app.add_template_filter('函数名','过滤器名称')
def do_listreverse(li):
    # 通过原列表创建一个新列表
    temp_li = list(li)
    # 将新列表进行返转
    temp_li.reverse()
    return temp_li

app.add_template_filter(do_listreverse,'lireverse')
  • 在 html 中使用该自定义过滤器
<h2>my_array 原内容:{{ my_array }}</h2>
<h2> my_array 反转:{{ my_array | lireverse }}</h2>

2.4 继承

将公共的内容抽取到父类模板,共子类使用的形式称为继承。
一般Web开发中,继承主要使用在网站的顶部菜单、底部。这些内容可以定义在父模板中,子模板直接继承,而不需要重复书写。

父模板中使用多个block组成,新建base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    {% block body %}{% endblock %}
</body>
</html>

子模板

{% extends "base.html" %}
{% block title %}
需要填充的文字
{% endblock %}
{% block body %}
需要填充的文字
{% endblock %}

3. 静态的文件的加载

4. Flask连接MySQL数据库

4.1 docker安装mysql数据库

4.1.1 启动docker容器

docker run -it -d --name mysql -p 3306:3306  -v /home/mysql/data:/var/lib/mysql -v /home/mysql/config:/etc/mysql/conf.d  -e MYSQL_ROOT_PASSWORD=wangyp0206. -e TZ=Asia/Shanghai mysql:8.0

4.1.2 配置数据库支持远程连接

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'wangyp0206.';
flush privileges; # 刷新数据库

4.1.3 配置支持Navicat远程连接(mysql5.7 版本之后需要,因为加密算法改变)

grant all PRIVILEGES on *.* to root@'%' WITH GRANT OPTION;
ALTER user 'root'@'%' IDENTIFIED BY 'wangyp0206.' PASSWORD EXPIRE NEVER;
ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'wangyp0206.';
FLUSH PRIVILEGES;

4.2 安装 flask-sqlalchemy

pip install flask-sqlalchemy

4.3 flask连接mysql数据库配置

app = Flask(__name__)
# mysql所在的主机名
HOSTNAME = "127.0.0.1"
# mysql监听的端口
PORT = 3306
# 连接数据库的用户名
USERNAME = "root"
# 连接数据库的密码
PASSWORD = "wangyp0206."
# 连接的数据库的名字
DATABASE = "database_lean"

app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}/?charset=utf8"

4.4 ORM与表的关系

4.4.1

0

评论区