Flask

第一个flask程序及运行过程

  1.当客户端想要获取资源时,一般会通过浏览器发起http请求

  2.此时,Web服务器会把来自客户端的所有请求都交给Flask程序实例

  3.程序实例使用Werkzeug来做路由分发(URL请求和视图函数之间的对应关系)

  4.根据每个URL请求,找到具体的视图函数并进行调用

    在Flask程序中,路由的实现一般是通过程序实例的装饰器实现

  5.Flask调用视图函数后,可以返回两种内容:

    1.字符串内容:将视图函数的返回值作为响应的内容,返回给客户端

    2.HTML模板内容:获取到数据后,把数据传入HTML模板文件中,模板引擎(Jinja2)负责渲染HTTP响应数据,然后返回响应数据给客户端

# -*- coding:utf-8 -*-
# 1.导入Flask扩展
from flask import Flask
# 2.创建Flask应用程序实例
# 需要传入__name__,作用是为了确定资源所在路径
app = Flask(__name__)
# 3.定义路由及视图函数
# Flask中定义路由是通过装饰器实现的,路由默认只支持GET,如果需要增加,需要自行指定
@app.route('/',methods=['GET','POST'])
def hello_world():
    return 'Hello Flask'
# 4.启动程序
if __name__ == '__main__':
    # 执行了app.run()就会将Flask程序运行在一个简易的服务器(Flask提供的,用于测试的)上
    app.run()

路由定义的基本方式

  默认路由只支持GET请求,但是可以通过methods指定http请求的方式

  如:@app.route('/',methods=['GET','POST'])

给路由传参示例

  有时候我们需要将同一类URL映射到同一个视图函数处理,比如使用同一个视图函数来显示不同用户的订单信息

  路由传递的参数默当做string:

# -*- coding:utf-8 -*-
# 1.导入Flask扩展
from flask import Flask
# 2.创建Flask应用程序实例
# 需要传入__name__,作用是为了确定资源所在路径
app = Flask(__name__)
# 3.定义路由及视图函数
# Flask中定义路由是通过装饰器实现的
@app.route('/')
def hello_world():
    return 'Hello Flask'

# 使用同一个视图函数,来显示不同用户的订单信息,<>定义路由的参数,<>内需要起一个名字
@app.route('/orders/<int:order_id>')# 参数默认类型为字符串,通过int:强制转换,如果转换失败无法匹配该路由,现在参数为int类型
def get_order_id(order_id):
    # 需要在视图函数的()内填入参数名,那么后面的代码才能去使用
    return 'order_id: %s' % order_id
# 4.启动程序
if __name__ == '__main__':
    # 执行了app.run()就会将Flask程序运行在一个简易的服务器(Flask提供的,用于测试的)上
    app.run()

 Jinja2模板引擎

使用模板的好处

  1.视图函数只负责业务逻辑和数据处理(业务逻辑方面)

  2.而模板则取到视图函数的数据结果进行展示(视图展示方面)

  3.代码结构清晰,耦合度低

两个概念

  1.Jinja2:是python下一个被广泛应用的模板引擎,是由python实现的模板语言,他的设计思想来源于Django的模板引擎,并扩展了其他语法和一系列强大的功能,其是Flask内置的模板语言

  2.模板语言:是一种被设计来自动生成文档的简单文本格式,在模板语言中,一般都会把一些变量传给模板,替换模板的特定位置上预先定义好的占位变量名.

    比如:render_template('index.html', 模板中要使用的变量名=视图函数中的变量)

模板渲染函数

  Flask提供的render_template函数封装了该模板引擎

  render_template函数的第一个参数是模板的文件名(需要放在templates目录下面),后面的参数都是键值对,表示模板中变量对应的真是值

模板语言的使用

  1.使用{# #}进行注释

  2.变量代码块

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

  3.Jinja2模板中的变量代码可以是Python类型或者对象,只要它能够被python的str()方法转换为一个字符串就可以

控制代码块

  用{%%}定义的控制代码块,可以实现一些语言层次的功能,比如循环或if语句

    {% if user %}

               {{user}}

    {%  else %}

    {%  for index in indexs%}

      {{index}}

    {% endfor %}

过滤器

  过滤器的本质就是函数,有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化,运算等,而在模板中是不能直接调用python中的某些方法,那么就用到了过滤器

  使用方式:

    过滤器的使用方式为:变量名|过滤器

    {{variable | filter_name(*args)}}

    如果没有任何参数传递给过滤器,则可以把括号省略掉

    {{variable | filter_name}}

  链式调用

    {{variable | filter_name1 | filter_name2}}

from flask import Flask, render_template
app = Flask(__name__)
# 1.返回一个网页(模板)
# 2.给模板填充数据
@app.route('/')
def index():
    url_str = 'www.baidu.com'
    my_list = [1,3,5,7]
    # html文件需要放在templates目录下
    return render_template('index.html',
            tem_url=url_str,
            my_list=my_list)

if __name__ == '__main__':
    app.run(debug=True)
<!DOCTYPE html>
<html lang='en'>
<head>
    <meta charset='UTF-8'>
    <title>Flask</title>
</head>
<body>
    {#这是模板 #}
    这是首页<br>
    百度网址:{{tem_url}}
    <hr>
    {%for num in my_list%}
        {% if num >=3 %}
            {{num}}<br>
        {% endif %}
    {% endfor%}
    {#过滤器#}
    {{tem_url | upper}}
</body>
</html>

 Web表单

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

 

 

 

 

 

  

 

posted @ 2019-04-01 22:55  xdl_smile  阅读(174)  评论(0编辑  收藏  举报