文档章节

Python全栈之Flask 简介

o
 osc_15fvklrg
发布于 07/02 16:29
字数 1716
阅读 47
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

前言

Python Web框架里比较有名当属Django,Django功能全面,它提供一站式解决方案,集成了MVT(Model-View-Template)和ORM,以及后台管理。但是缺点也很明显,它偏重。就像是一个装潢好的房子,它提供好了你要用的东西,直接拿来用就可以。

Flask相对于Django而言是轻量级的Web框架。和Django不同,Flask轻巧、简洁,通过定制第三方扩展来实现具体功能。

可定制性,通过扩展增加其功能,这是Flask最重要的特点。Flask的两个主要核心应用是Werkzeug和模板引擎Jinja。

 

Python全栈之Flask 简介

 

WSGI

Web Server Gateway Interface(Web服务器网关接口,WSGI)已被用作Python Web应用程序开发的标准。 WSGI是Web服务器和Web应用程序之间通用接口的规范。

 

Werkzeug

它是一个WSGI工具包,它实现了请求,响应对象和实用函数。这使得能够在其上构建web框架。 Flask框架使用Werkzeug作为其基础之一。

 

jinja2

jinja2是Python的一个流行的模板引擎。Web模板系统将模板与特定数据源组合以呈现动态网页。

Flask通常被称为微框架。 它旨在保持应用程序的核心简单且可扩展。Flask没有用于数据库处理的内置抽象层,也没有形成验证支持。相反,Flask支持扩展以向应用程序添加此类功能。一些受欢迎的Flask扩展将在本教程后续章节进行讨论。

 

Flask工作流程图

 

Python全栈之Flask 简介

 

 

Flask扩展包:

  • Flask-SQLalchemy:操作数据库
  • Flask-migrate:管理迁移数据库
  • Flask-Mail:邮件
  • Flask-WTF:表单
  • Flask-script:插入脚本
  • Flask-Login:认证用户状态
  • Flask-RESTful:开发REST API的工具
  • Flask-Bootstrap:集成前端Twitter Bootstrap框架
  • Flask-Moment:本地化日期和时间

 

新建flask项目:

Python全栈之Flask 简介

 

建成如下:

 

Python全栈之Flask 简介

 

运行如下:

 

Python全栈之Flask 简介

 

 

必须在项目中导入Flask模块。 Flask类的一个对象是我们的WSGI应用程序。

Flask构造函数使用当前模块(__name __)的名称作为参数。

 

以下是实例化一个Flask对象可填的参数,及其默认值:

 

  • template_folder:模板所在文件夹的名字, 默认就是templates
  • root_path:可以不用填,会自动找到,当前执行文件,所在目录地址在return render_template时会将上面两个进行拼接,找到对应的模板地址
  • static_folder:静态文件所在文件的名字,默认是static,可以不用填
  • static_url_path:静态文件的地址前缀,写成什么,访问静态文件时,就要在前面加上这个

instance_path和instance_relative_config是配合来用的、这两个参数是用来找配置文件的,当用app.config.from_pyfile('settings.py')这种方式导入配置文件的时候会用到

  • instance_relative_config:默认为False,当设置为True时,from_pyfile会从instance_path指定的地址下查找文件。
  • instsnce_path:指定from_pyfile查询文件的路径,不设置时,默认寻找和app.run()的执行文件同级目录下的instance文件夹,如果配置了instance_path(注意需要是绝对路径),就会从指定的地址下里面的文件

 

Flask类的route()函数是一个装饰器,它告诉应用程序哪个URL应该调用相关的函数。

app.route(rule, options)
  • rule 参数表示与该函数的URL绑定。
  • options 是要转发给基础Rule对象的参数列表。

 

在上面的示例中,'/ ' URL与hello_world()函数绑定。因此,当在浏览器中打开web服务器的主页时,将呈现该函数的输出。

application对象的add_url_rule()函数也可用于将URL与函数绑定,如下:

def hello_world():
return ‘hello world’
app.add_url_rule(‘/’, ‘hello’,hello_world)

最后,Flask类的run()方法在本地开发服务器上运行应用程序。

app.run(host, port, debug, options)

 

  • host:监听的主机名
  • post:监听的主机端口,默认5000
  • debug:调试模式,默认false,设置为frue则显示调试信息
  • options:要转发到底层的werkzeng服务器

 

给路由传参示例:

 

from flask importFlask

app = Flask(__name__)
@app.route('/id/<int:idn>')def hello_world(idn):
   return 'HelloWorld! %d' %idn
if __name__ == '__main__':
   app.run()

 

 

路由传递的参数默认当做string处理,这里指定int,还支持float,path,尖括号中冒号后面的内容是动态的。

 

效果如下:

 

Python全栈之Flask 简介

 

 

返回状态码示例:

 

Python全栈之Flask 简介

 

 

abort函数:

如果在视图函数执行过程中,出现了异常错误,我们可以使用abort函数立即终止视图函数的执行。通过abort函数,可以向前端返回一个http标准中存在的错误状态码,表示出现的错误信息。

使用abort抛出一个http标准中不存在的自定义的状态码,没有实际意义。如果abort函数被触发,其后面的语句将不会执行。其类似于python中raise。

from flask importFlask,abort

app = Flask(__name__)
@app.route('/id/<int:idn>')def hello_world(idn):
   abort(403)
   return 'HelloWorld! %d' %idn, 888
if __name__ == '__main__':
   app.run()

 

 

在Flask中通过装饰器来实现捕获异常,errorhandler()接收的参数为异常状态码。视图函数的参数,返回的是错误信息。

 

Python全栈之Flask 简介

 

 

重定向redirect示例:

from flask importFlask,redirect

app = Flask(__name__)
@app.route('/')def hello_world():
   return redirect('https://www.baidu.com')
if __name__ == '__main__':
   app.run()

 

效果如下:

Python全栈之Flask 简介

 

这里再介绍一下url_for(),url_for()函数对于动态构建特定函数的URL非常有用。该函数接受函数的名称作为第一个参数,以及一个或多个关键字参数,每个参数对应于URL的变量部分。

 

如下:

@app.route('/user/<name>')def hello_user(name):
   if name=='admin':
      return redirect(url_for('hello_admin'))
   else:
      return redirect(url_for('hello_guest',guest =name))

 

HTTP方法:

Http协议是万维网中数据通信的基础。在该协议中定义了从指定URL检索数据的不同方法。

方法介绍:

  • GET:以未加密的形式将数据发送到服务器获取响应内容
  • POST: 用于将HTML表单数据上传到服务器
  • PUT:用上传的内容替换目标资源的数据
  • DELETE:删除由URL给出的目标资源的数据
  • HEAD: 和GET方法相同,但没响应体

默认情况下,Flask路由响应GET请求。但是,可以通过为route()装饰器提供方法参数来更改此首选项。

为了演示在URL路由中使用POST方法,首先让我们创建一个HTML表单,并使用POST方法将表单数据发送到URL。

 

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
   <body>

      <form action = "http://localhost:5000/login"method = "post">
         <p>Enter Name:</p>
         <p><input type = "text" name = "nm"/></p>
         <p><input type = "submit" value = "submit"/></p>
      </form>

   </body>
</html>

 

 

loginok.html

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

 

 

WC_public_flask.py

from flask importFlask, render_template, request

app = Flask(__name__, template_folder='templates')
@app.route('/')def login():
   return render_template('login.html')
@app.route('/login',methods = ['POST', 'GET'])def loginok():
   if request.method== 'POST':
      user = request.form['nm']
      return render_template('loginok.html',name =user)
   else:
      user = request.args.get('nm')
      return render_template('loginok.html',name =user)
if __name__ == '__main__':
   app.run(debug = True)

 

o
粉丝 0
博文 67
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
开源数据访问组件--Smark.Data

Smark.Data是基于Ado.net实现的数据访问组件,提供基于强类型的查询表达式进行灵活的数据查询,统计,修改和删除等操作;采用基于条件驱动的操作模式,使数据操作更简单轻松;内部通过标准SQL...

泥水佬
2013/03/12
2.6K
0
硬实时操作系统--Raw OS

Raw-OS 起飞于2012年,Raw-OS志在制作中国人自己的最优秀硬实时操作系统。 Raw-OS 操作系统特性 内核最大关中断时间无限接近0us, s3c2440系统最大关中断时间实测0.8us。 支持idle任务级别的事...

jorya_txj
2013/03/19
6.3K
1
个人计算机操作系统--eComStation

eComStation(简写为 eCS)是一款基于OS/2,由Serenity Systems发布的个人计算机操作系统。它包含了一系列在OS/2的IBM版本中没有的组件及应用。 eComStation的最初版本v1发布于2001年,基于I...

匿名
2013/03/26
3.2K
0
Python开发者社区整站源码--Pythoner

pythoner.net 整站源代码 依赖模块 Django 1.4.2 PIL DjangoVerifyCode 0.2.2 开发环境配置 运行scripts目录下的setupenv.sh文件,将会自动安装配置所需环境 设置本地环境变量:export env=D...

~T.y~
2013/04/10
3.2K
0
Python数据分析工具包--Pandas

Python Data Analysis Library 或 pandas 是连接 SciPy 和 NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集...

匿名
2012/10/30
2.1W
2

没有更多内容

加载失败,请刷新页面

加载更多

如何使用jQuery获取元素的ID? - How can I get the ID of an element using jQuery?

问题: <div id="test"></div><script> $(document).ready(function() { alert($('#test').id); }); </script> Why doesn't the above work, and how should I do this? 为什么上......

技术盛宴
20分钟前
11
0
为什么在允许某些Unicode字符的注释中执行Java代码?

问题: The following code produces the output "Hello World!" 以下代码生成输出“Hello World!” (no really, try it). (不,真的,试试吧)。 public static void main(String... args......

富含淀粉
50分钟前
8
0
字符串格式:%与.format - String formatting: % vs. .format

问题: Python 2.6 introduced the str.format() method with a slightly different syntax from the existing % operator. Python 2.6引入了str.format()方法,其语法与现有的%运算符略有不......

javail
今天
22
0
什么是按位移位(位移)运算符以及它们如何工作? - What are bitwise shift (bit-shift) operators and how do they work?

问题: I've been attempting to learn C in my spare time, and other languages (C#, Java, etc.) have the same concept (and often the same operators) ... 我一直在尝试在业余时间学习......

法国红酒甜
今天
32
0
OSChina 周二乱弹 —— 卧槽 李荣浩的契约兽啊

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《红色的回忆》- 痛仰乐队 手机党少年们想听歌,请使劲儿戳(这里) 动弹, 又好多...

小小编辑
今天
61
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部