Python Flask框架

Flask 是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。

使用以下命令安装框架:

#flask的安装命令,没有带版本即安装最新版本
pip install flask

Hello World

创建一份名为flask_test_demo.py的脚本文件,并写入一下python代码段:

# 导入Flask扩展
from flask import Flask, render_template
# 创建Flask应用程序实例
# 需传入__name__,作用是为了确定资源所在的路径
app = Flask(__name__)

# 定义路由及视图函数
# Flask中定义路由是通过装饰器来实现的
@app.route('/')
def hello_world():
    return 'hello world'

# 启动程序
if __name__ == '__main__':
    #执行app.run就会将Flask程序运行在一个简单的服务器上(Flask提供的,用于测试的)
    app.run()

运行程序获得执行输出,服务会在本地5000端口开启访问入口:

/Users/******/******/flask/flask_test_demo.py
 * Serving Flask app "flask_test_demo" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

浏览器访问http://127.0.0.1:5000/即可在浏览器中展示:
hello world

模板输出

在与flask_test_demo.py同级的目录下新建文件夹“templates”,并在其文件夹下创建html文件,命名index.html。
index.html文件内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
	我的第一个Flask网页
</body>
</html>

在flask_test_demo.py文件中这样写,并运行:

#需要引入render_template来获得渲染模板到浏览器的能力
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/', methods=['get'])
def index():
	#render_template方法第一个默认参数为html文件名称(全名)
	#这里不写templates文件夹(目录),是因为框架默认就从执行文件同级的templates文件夹中获取指定html文件
    return render_template("index.html") 
    
if __name__ == '__main__':
    app.run()

浏览器访问地址:http://127.0.0.1:5000/,显示页面内容:
在这里插入图片描述

路由请求方式限定

请求方式限定, 在装饰器@app.route上添加methods参数,参数值为列表形式传入的具体请求方式名称:

# 路由默认只支持GET,需要添加其他方式,则需要自行指定
@app.route('/', methods=['GET', 'POST'])
def hello_world():
    return 'hello world'

路由参数处理

# 尖括号定义路由参数,尖括号内需要取参数名
@app.route('/order/<order_id>')
#需要在视图函数的参数内填入参数名,函数内的代码才能使用传递过来的参数
def get_order_id(order_id):
    return 'order_id:%s' % order_id

如果要限制传参的类型,则需要对路由做访问优化,在参数名通过类型加冒号方式进行设置

@app.route('/order/<int:order_id>')

如果参数类型不正确,则无法匹配到该路由

jinja2模板引擎

jingja2是Python下一个被广泛应用的模板引擎,是由Python实现的模板语言,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能,其是Flask内置的模板语言。
模板语言:是一种被设计来自动生成的文档的简单文本格式,在模板语言中,一般都会把一些变量传递给模板,替换模板的特定位置上预先定义好的站位变量名。

渲染模板函数

  • Flask提供的render_template函数封装了该模板引擎
  • render_template函数的第一个参数名是模板的文件名,后面的参数是键值对,表示模板中变量对应的真实值

变量代码块

{{}}来表示变量名,这种{{}}语法叫做变量代码块

{{orer_id}}

如下代码则可以实现后台传值到前端:
后端代码:

from flask import Flask, render_template
app = Flask(__name__)

@app.route('/')
def index():
    order_id = 88888
    return render_template('index.html', order_id=order_id)

if __name__ == '__main__':
    app.run()

在index.html文件中写入如下内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
	后端传递的order_id为:{{order_id}}
</body>
</html>

浏览器展示效果:
在这里插入图片描述

  • 列表和字典的传参和渲染
    后端赋值:
@app.route('/')
def hello_world():
    my_list = [2, 4, 6, 8, 10]
    my_dict = {'name': "方建康", 'age': 35, '性别': '男'}
    return render_template('index.html', my_list=my_list, my_dict=my_dict)

前端取值:

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
	{{my_list}}<br>
	{{my_list[2]}}<br>
	{{my_dict}}<br>
	{{my_dict['name']}}<br>
</body>
</html>

网页输出:
在这里插入图片描述

控制代码块

以{{%%}}的方式来编写控制语句,注{# #}表示前端注释

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {# for循环的使用 #}
    {% for item in my_list %}
        {# if判断的使用 #}
        {% if item > 3 %}
            {{item}} <br>
        {% endif %}
    {% endfor %}
</body>
</html>

网页输出:
在这里插入图片描述

过滤器

过滤器的本质就是函数,有时候我们不仅仅只是需要输出变量的值,我们还需要改变变量的显示,甚至格式化、运算等等,在模板中是不能直接调用python中的某些方法,那么就会用了过滤器。
使用方式:
{{ variable | filter_name(*args) }}
如果没有任何参数传给过滤器,则可以把括号省掉
{{ variable | filter_name }}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {# 字符串转大写-过滤器 #}
    {{"hello world" | upper}}
    <br>
    {# 字符串翻转-过滤器 #}
    {{"hello world" | reverse}}
    <br>
    {# 链式调用过滤器 #}
    {{"hello world" | upper | reverse}}
</body>
</html>

html展示效果:
在这里插入图片描述
常用的过滤器,点击链接进行查看 常用过滤器

Web表单

在Flask中,为了处理Web表单一般使用Flask-WTF扩展,它封装了WTForms,并且它有验证表单数据的功能。

from flask import Flask, render_template, request, flash
app = Flask(__name__)
app.secret_key = 'fjk'  # 设置加密文本

@app.route('/', methods=['POST', 'GET'])
def index():
    # 判断请求方式,若是POST请求则获取请求参数进一步处理,此处需要用的request的method方法
    if request.method == 'POST':
        # 获取请求参数
        username = request.form.get('username')
        passwd = request.form.get('password')
        if not all([username, passwd]):
            flash('参数不完整')  # 可以将后台的文本,闪现到页面,但需要进行加密
        else:
            flash('success')
    # 若不是POST请求则返回页面
    return render_template('index.html')

if __name__ == '__main__':
    app.run()
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <form method="post">
  		<lable>用户名:</lable>
        <input type="text" name="username"><br>
     	<lable>密码:</lable>
     	<input type="password" name="password"><br>
     	<input type="submit" value="提交"><br>
     	{#使用遍历方式,获取闪现消息并显示在页面上#}
     	{% for messgae in get_flashed_messages() %}
         	{{ messgae }}
     	{% endfor %}
	</form>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值