基本概念

什么是Flask?

Flask 是一个 web 框架。也就是说 Flask 为你提供工具,库和技术来允许你构建一个 web 应用程序。这个 web 应用程序可以是一些 web 页面、博客、wiki、基于 web 的日历应用或商业网站。

Flask 属于微框架(micro-framework)这一类别,微架构通常是很小的不依赖于外部库的框架。这既有优点也有缺点,优点是框架很轻量,更新时依赖少,并且专注安全方面的 bug,缺点是,你不得不自己做更多的工作,或通过添加插件增加自己的依赖列表。Flask 的依赖如下:

维基百科 WSGI 的介绍:

Web服务器网关接口Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器Web应用程序框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。

什么是模板引擎?

你搭建过一个网站吗?你面对过保持网站风格一致的问题吗,你不得不写多次相同的文本吗?你有没有试图改变这种网站的风格?

如果你的网站只包含几个网页,改变网站风格会花费你一些时间,这确实可行。尽管如此,如果你有许多页面(比如在你商店里的售卖物品列表),这个任务便很艰巨。

使用模板你可以设置你的页面的基本布局,并提及哪个元素将发生变化。这种方式可以定义您的网页头部并在您的网站的所有页面使它保持一致,如果你需要改变网页头部,你只需要更新一个地方。

使用模板引擎创建/更新/维护你的应用会节约你很多时间。

"Hello World"应用

我们将使用 flask 完成一个非常基础的应用。

  • 安装 flask
$ sudo pip3 install flask
  • 创建项目结构
$ cd /home/shiyanlou
$ mkdir -p hello_flask/{templates,static}

这是你的 web 应用的基本结构:

$ tree hello_flask/
hello_flask
|-- static
`-- templates 2 directories, 0 files

templates 文件夹是存放模板的地方,static 文件夹存放 web 应用所需的静态文件(images, css, javascript)。

  • 创建应用文件
$ cd hello_flask
$ vim hello_flask.py

hello_flask.py 文件里编写如下代码:

#!/usr/bin/env python3

import flask

# Create the application.
APP = flask.Flask(__name__) @APP.route('/')
def index():
""" 显示可在 '/' 访问的 index 页面
"""
return flask.render_template('index.html') if __name__ == '__main__':
APP.debug=True
APP.run()
  • 创建模板文件 index.html
$ vim templates/index.html

index.html 文件内容如下:

<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset="utf-8" />
<title>Hello world!</title>
<link type="text/css" rel="stylesheet"
href="{{ url_for('static',
filename='hello.css')}}" />
</head>
<body> It works! </body>
</html>
  • 运行 flask 应用程序
$ python3 hello_flask.py

访问 http://127.0.0.1:5000/,这应该只是显示黑字白底的 "It works!" 文本,如下图:

Flask中使用参数

在本节中我们将要看到如何根据用户使用的 URL 返回网页。

为此我们更新 hello_flask.py 文件。

  • 在 hello_flask.py 文件中添加以下条目
@APP.route('/hello/<name>/')
def hello(name):
""" Displays the page greats who ever comes to visit it.
"""
return flask.render_template('hello.html', name=name)
  • 创建下面这个模板 hello.html
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset="utf-8" />
<title>Hello</title>
<link type="text/css" rel="stylesheet"
href="{{ url_for('static',
filename='hello.css')}}" />
</head>
<body> Hello {{name}} </body>
</html>
  • 运行 flask 应用

访问 http://127.0.0.1:5000/ ,这应该只是显示黑字白底的 "It works!" 文本。

访问http://127.0.0.1:5000/hello/you,这应该返回文本 "Hello you",见下图:

无论你在 URL 中 /hello/ 后填写的什么,都会出现在返回的网页中。

这是你第一次使用模板,我们在 hello_flask.py 中建立了 name 变量(参见 hello 函数的 return 行)。通过语法 {{name}},name 变量之后在页面中显示其自身。

额外工作

目前,对于每一个页面我们都创建了一个模板,其实这是不好的做法,我们应该做的是创建一个主模板并且在每个页面使用它。

目前,对于每一个页面我们都创建了一个模板,其实这是不好的做法,我们应该做的是创建一个主模板并且在每个页面使用它。

  • 创建模板文件 master.html。
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset="utf-8" />
<title>{% block title %}{% endblock %} - Hello Flask!</title>
<link type="text/css" rel="stylesheet"
href="{{ url_for('static',
filename='hello.css')}}" />
</head>
<body> {% block body %}{% endblock %} </body>
</html>
  • 调整模板 index.html。
{% extends "master.html" %}

{% block title %}Home{% endblock %}

{% block body %}
It works!
{% endblock %}

正如你所看到的,在 master.html 模板中我们定义了两部分,名为 title 和 body 的 blocks

在模板 index.html 中,我们声明这个模板扩展自 master.html 模板,然后我们定义了内容来放在这两个部分中(blocks)。在第一个 block title 中,我们放置了 Home 单词,在第二个 block body 中我们定义了我们想要在页面的 body 中有的东西。

  • 作为练习,更改其他模板 hello.html,同样要使用 master.html。
  • 在 hello 页面添加首页链接。

调整模板 hello.html,添加到首页的链接。

<a href="{{ url_for('index') }}"><button>Home</button></a>
  • 作为你的任务,在首页添加到 hello 页面的链接。

总结

本实验中我们了解了微框架、WSGI、模板引擎等概念,学习使用 Flask 做一个 web 应用,在这个 web 应用中,我们使用了模板。而用户以正确的不同 URL访问服务器时,服务器返回不同的网页。最后还给大家留了一个小任务,希望大家能完成。

想要深入学习Flask,你还可以学习实验楼的Python Flask Web框架课程。

当然,在学习过程中有任何不懂的地方或者对Flsak非常感兴趣,推荐学习Flask官方文档

参考链接:https://www.shiyanlou.com/courses/596

Python3基础教程(二十)—— flask介绍的更多相关文章

  1. Python3基础教程(十九)—— 项目结构

    本节阐述了一个完整的 Python 项目结构,你可以使用什么样的目录布局以及怎样发布软件到网络上. 创建Python项目 我们的实验项目名为 factorial,放到 /home/shiyanlou/ ...

  2. Python3基础教程(十八)—— 测试

    编写测试检验应用程序所有不同的功能.每一个测试集中在一个关注点上验证结果是不是期望的.定期执行测试确保应用程序按预期的工作.当测试覆盖很大的时候,通过运行测试你就有自信确保修改点和新增点不会影响应用程 ...

  3. Python3基础教程(十六)—— 迭代器、生成器、装饰器

    在这个实验里我们学习迭代器.生成器.装饰器有关知识. 这几个概念是 Python 中不容易理解透彻的概念,务必把所有的实验代码都完整的输入并理解清楚其中每一行的意思. 迭代器 Python 迭代器(I ...

  4. Python3基础教程(十五)—— PEP8 代码风格指南

    编程语言不是艺术,而是工作或者说是工具,所以整理并遵循一套编码规范是十分必要的. 这篇文章原文实际上来自于这里:https://www.python.org/dev/peps/pep-0008/ 有很 ...

  5. SpringBoot进阶教程(二十九)整合Redis 发布订阅

    SUBSCRIBE, UNSUBSCRIBE 和 PUBLISH 实现了 发布/订阅消息范例,发送者 (publishers) 不用编程就可以向特定的接受者发送消息 (subscribers). Ra ...

  6. 无废话ExtJs 入门教程二十[数据交互:AJAX]

    无废话ExtJs 入门教程二十[数据交互:AJAX] extjs技术交流,欢迎加群(521711109) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...

  7. ComicEnhancerPro 系列教程二十:用“文件比较”看有损、无损

    作者:马健邮箱:stronghorse_mj@hotmail.com 主页:http://www.comicer.com/stronghorse/ 发布:2017.07.23 教程二十:用“文件比较” ...

  8. C#学习基础概念二十五问

    C#学习基础概念二十五问 1.静态变量和非静态变量的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abstract 是什么意思?5.internal ...

  9. (Python基础教程之十二)Python读写CSV文件

    Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...

  10. SpringBoot进阶教程(二十六)整合Redis之共享Session

    集群现在越来越常见,当我们项目搭建了集群,就会产生session共享问题.因为session是保存在服务器上面的.那么解决这一问题,大致有三个方案,1.通过nginx的负载均衡其中一种ip绑定来实现( ...

随机推荐

  1. 【NOI 2015】软件包管理器

    [题目链接] 点击打开链接 [算法] 树链剖分,子树的DFS序也是连续的一段 要注意细节! [代码] #include<bits/stdc++.h> using namespace std ...

  2. Android笔记---常用控件以及用法

    这篇文章主要记录下Android的常用控件以及使用的方法,Android 给我们提供了大量的UI控件,合理地使用这些控件就可以非常轻松地编写出相当不错的界面,这些是Android学习的基础,没有什么业 ...

  3. Thrift 入门

    1下载 https://thrift.apache.org/download 或 Apache Thrift Archive 下载编译好的release可执行文件: Thrift compiler f ...

  4. 51nod 1050【DP】

    思路: 就是先正常的dp一下求一个最大连续子串,然后特殊情况就是sum-最小连续子串.. 比一比谁大谁小就好了 #include <stdio.h> #include <string ...

  5. python __builtins__ memoryview类 (46)

    46.'memoryview',  返回给定参数的内存查看对象(Momory view).所谓内存查看对象,是指对支持缓冲区协议的数据进行包装,在不需要复制对象基础上允许Python代码访问. cla ...

  6. bzoj3343 教主的魔法【分块入门】By cellur925

    题意:维护一个数列,给出维护区间加法,询问区间内大于等于某个值的元素个数. 算法:分块.因为本题第二问显然可以用二分的思想,但是这貌似并不符合区间可加性,线段树好像就不好用了呢.所以本蒟蒻学习了分块. ...

  7. 如何让Android微博个人详情页滚动到顶部

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/103 个人详情页滑动到顶部 最近产品提了个新需求,需要实现 ...

  8. PostgreSQL - 允许远程访问的设置方法

    原文转载至:PostgreSQL 允许远程访问设置方法 安装PostgreSQL数据库之后,默认是只接受本地访问连接.如果想在其他主机上访问PostgreSQL数据库服务器,就需要进行相应的配置. 配 ...

  9. python之url编码

    import urllib.parsempp='besttest 自动化测试'print(urllib.parse.quote_plus(mpp)) #url编码print(urllib.parse. ...

  10. 洛谷p2234/BZOJ1588 [HNOI2002]营业额统计

    题目链接: 洛谷 BZOJ 分析: 好像没有什么好说的就是一个平衡树的板子--唯一要注意的就是这里要找的并不是严格的前驱和后继,因为如果找到之前某一天的营业额和它相等那么差就是0,所以我们仍然在结构体 ...