python学习之flask基础

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python学习之flask基础相关的知识,希望对你有一定的参考价值。

什么是Flask?
Flask是一个Web框架,就是提供一个工具,库和技术来允许你构建一个Web应用程序.这个Web应用程序
可以是一些Web页面,博客, wiki ,基于 Web 的日历应用或商业网站。
Flask依赖模块:
web服务网关接口(Python Web Server Gateway Interface,缩写为WSGI
Werkzeug 一个WSGI工具包, 是为python语言定义的web服务器和web应用程序或框架之间的一
种简单而通用的借口,其他语言也有类似的接口)
jinja2模板引擎

Flask的优势

Flask属于微框架( micro-framework )这一类别,微架构通常是很小的不依赖外部库的框架.
框架很轻量
更新时依赖小
专注于安全方面的bug

第一个flask程序

from flask import Flask
app = Flask(__name__)  #导入Flask对象

@app.route(‘/‘)    #把修饰的函数注册为路由
def hello_world():
    return ‘Hello World!‘

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

变量规则

要给url添加变量部分,可以把这些特殊的字符标记为<variable_name> 这部分将会作为命名参数传递到你的函数

from flask import  Flask
app = Flask(__name__)  #创建对象

@app.route(‘/‘)
def hello_world():
    return ‘Hello World‘

@app.route(‘/user/<username>‘)
def show_user_profile(username):
    # 显示该用户名的用户信息
    return ‘User %s‘  % username

@app.route(‘/post/<int:post_id>‘)
def show_post(post_id):
    # 根据ID显示文章,ID是整型数据
    return ‘Post %d‘  % post_id

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

运行程序将浏览器地址修改成 http://127.0.0.1:5000/user/历史
则显示:
技术图片

构建url

如果flask能匹配url,那末你可以用url_info()来给指定的函数
构建url ,他接收函数名作为第一个参数,也接受对应url规则的变量部分的命名参数,未知变量部分会添加到url末尾作为查询参数

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

@app.route(‘/‘)
def hello_world():
    return ‘Hello World!‘

@app.route(‘/user/<username>‘)
def show_user_profile(username):
    # 显示该用户名的用户信息
    return ‘User %s‘ % username

@app.route(‘/post/<int:post_id>‘)
def show_post(post_id):
    # 根据ID显示文章,ID是整型数据
    return ‘Post %d‘ % post_id

@app.route(‘/url/‘)
def get_url():
    # 根据ID显示文章,ID是整型数据
    return url_for(‘show_post‘,post_id=2)

if __name__ == ‘__main__‘:
    app.run(debug=True)

浏览器访问url:
技术图片

渲染模板

当用户访问程序的根地址时,我们的视图函数会向客
户端返回一行HTML代码。然而,一个完整的HTML页面往往需要几十
行甚至上百行代码,如果都写到视图函数里,那可真是个噩梦。这样的
代码既不简洁也难于维护,正确的做法是把HTML代码存储在单独的文
件中,以便让程序的业务逻辑和表现逻辑分离,即控制器和用户界面的
分离。
在动态Web程序中,视图函数返回的HTML数据往往需要根据相应
的变量(比如查询参数)动态生成。当HTML代码保存到单独的文件中
时,我们没法再使用字符串格式化或拼接字符串的方式来在HTML代码
中插入变量,这时我们需要使用模板引擎(template engine)。借助模
板引擎,我们可以在HTML文件中使用特殊的语法来标记出变量,这类
包含固定内容和动态部分的可重用文件称为模板(template)。
模板引擎的作用就是读取并执行模板中的特殊语法标记,并根据传
入的数据将变量替换为实际值,输出最终的HTML页面,这个过程被称
为渲染(rendering)。Flask默认使用的模板引擎是Jinja2,它是一个功
能齐全的Python模板引擎,除了设置变量,还允许我们在模板中添加if
判断,执行for迭代,调用函数等,以各种方式控制模板的输出。对于
Jinja2来说,模板可以是任何格式的纯文本文件,比如HTML、XML、
CSV、LaTeX等

在该文件下创建templates文件夹,然后创建2个文件,分别命名为index.html和user.html 然后render.py 渲染这些模板

render.py

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

@app.route(‘/‘)
def hello_world():
    return render_template(‘index.html‘,name=‘经验‘)

@app.route(‘/user/<username>‘)
def show_user_profile(username):
    # 显示该用户名的用户信息
    return render_template(‘user.html‘, name=username)

if __name__ == ‘__main__‘:
    app.run(debug=True)

user.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>hello, {{ name }}!</h1>

</body>
</html>

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>hello {{ name }} </h1>

</body>
</html>

浏览器:
技术图片
技术图片

模板语法

利用Jinja2这样的模板引擎,我们可以将一部分的程序逻辑放到模
板中去。简单地说,我们可以在模板中使用Python语句和表达式来操作
数据的输出。但需要注意的是,Jinja2并不支持所有Python语法。而且
出于效率和代码组织等方面的考虑,我们应该适度使用模板,仅把和输
出控制有关的逻辑操作放到模板中。
Jinja2允许你在模板中使用大部分Python对象,比如字符串、列
表、字典、元组、整型、浮点型、布尔值。它支持基本的运算符号
(+、-、*、/等)、比较符号(比如==、!=等)、逻辑符号(and、
or、not和括号)以及in、is、None和布尔值(True、False)。
Jinja2提供了多种控制结构来控制模板的输出,其中for和if是最常用
的两种。在Jinja2里,语句使用{%...%}标识,尤其需要注意的是,在语
句结束的地方,我们必须添加结束标签:
{% if user.bio %}
<i>{{ user.bio }}</i>
{% else %}
<i>This user has not provided a bio.</i>
{% endif %}

在这个If语句里,如果user.bio已经定义,就渲染{%if user.bio%}和
{%else%}之间的内容,否则就渲染{%else%}和{%endif%}之间的默认内容。末尾的{%endif%}用来声明if语句的结束,这一行不能省略。
和在Python里一样,for语句用来迭代一个序列:
<ul>
{% for movie in movies %}
<li>{{ movie.name }} - {{ movie.year }}</li>
{% endfor %}
</ul>

jinja2 模板引擎

1. 什么是Jinja2模板引擎?

  • 官方网址: http://docs.jinkan.org/docs/jinja2/
    Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全:
  • 1). python的Web开发中, 业务逻辑(实质就是视图函数的内容)和页面逻辑(html件)分开的, 使得代码的可读性增强, 代码容易理解和维护;
  • 2). 模板渲染: 在html文件中,通过动态赋值 ,将重新翻译好的html文件(模板引擎生效) 返回给用户的过程。
  • 3). 其他的模板引擎: Mako, Template, Jinja2

2. Jinja2语法

Jinja2变量显示语法:

{{ 变量名| 函数调用 }}

{{ name }}
{{ url_for() }}
{{ get_flshed_messages() }}

Jinja2变量内置过滤器:

"hello".lower()

safe            渲染值时不转义
capitalize      把值的首字母转换成大写,其他字母转换成小写
lower           把值转换成小写形式
upper           把值转换成大写形式
title           把值中每个单词的首字母都转换成大写
trim            把值的首尾空格去掉
striptags       渲染之前把值中所有的 HTML 标签都删掉

如何自定义过滤器?

for循环:

        {% for i in li%}
            xxx
        {% endfor %}

if语句

        {% if user == ‘westos‘%}
            xxxx
        {% elif user == ‘hello‘ %}
            xxx
        {% else %}
            xxx
        {% endif%}

宏的操作

  • 相当于函数

    如何定义宏?

        <!--相当于python里面的定义函数, 后面使用的场景: 分页显示-->
        {%  macro render(id) %}
            <h1>hello world {{ id }}</h1>
        {% endmacro %}

如何调用宏?

    <!--调用定义好的宏(类似于python中的函数)-->
    {{ render(1) }}
    {{ render(2) }}
    {{ render(3) }}

include包含操作

  • 如何使用: {% include "06_inclued.html"%}

模板的继承:

一般网站的导航栏和底部不会变化, 为了避免重复编写导航栏信息;

  • 如何定义模板?
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %}  {% endblock %}</title>
</head>
<body>
<div style="width: 100px; height: 200px" > 这是导航栏</div>
{% block body %}
hello
{% endblock %}
<div style="width: 100px; height: 200px" >这是底部</div>
</body>
</html>

- 如何继承基模板?

{% extends  ‘06_base.html‘%}
{% block title %}
    继承案例
{% endblock %}
{% block body %}
<span style="color: green">这是最新填的block内容</span>
{% endblockfrom flask  import  Flask, render_template

例:模板继承py:

app = Flask(__name__)
@app.route(‘/‘)
def index():
    return  render_template(‘index.html‘)

@app.route(‘/bbs/‘)
def bbs():
    return  render_template(‘bbs.html‘)

@app.route(‘/blog/‘)
def blog():
    return  render_template(‘blog.html‘)
if __name__ == ‘__main__‘:
    app.run(port=5002) %}

base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %} {% endblock %}</title>
    <style>
        .nav{
            width: 100%;
            height: 50px;
            border: 1px solid red;
        }
        .left{
            width: 20%;
            border: 1px solid red;
            float: left;
            height: 100px;
        }

        .right{
            width: 79%;
             border: 1px solid green;
            float: left;
            height: 100px;
        }
    </style>
</head>
<body>

<div class="nav">
    导航栏
    <button>登录</button>
    <button>注册</button>
</div>

<div class="left">
    {% include ‘left.html‘ %}

</div>

<div class="right">
    {% block body %}

    {% endblock %}
</div>

</body>
</html>

bbs.html

{% extends ‘base.html‘ %}

{% block title %}

论坛
{% endblock %}
{% block body %}
<h1>bbs</h1>

blog.html

{% extends ‘base.html‘ %}
{% block title %}

博客
{% endblock %}

{% block body %}
<h1>blog</h1>

index.html

{% extends ‘base.html‘ %}

{% block title %}

主页
{% endblock %}
{% block body %}
<h1>index</h1>

left.html

<ul>
    <li>新闻</li>
    <li>财经</li>
    <li>八卦</li>
<url>

以上是关于python学习之flask基础的主要内容,如果未能解决你的问题,请参考以下文章

Flask Web开发学习之“HelloWorld”

Flask Web开发学习之“HelloWorld”

Python面向对象学习之八,装饰器

Python框架学习之Flask中的常用扩展包

Python框架学习之Flask中的数据库操作

Python基础学习之语句和语法