在前面一篇讲了如何创建一个虚拟环境,今天这一篇就来说说如何创建一个简单的Flask项目。关于Flask的具体介绍就不详细叙述了,我们只要知道它非常简洁、灵活和扩展性强就够了。它不像Django那样集成度特别高。Flask只是一个内核,默认依赖于两个外部库: Jinja2 模板引擎和 Werkzeug WSGI 工具集,其他很多功能都是以扩展的形式进行嵌入使用。

一、一个简单的小例子

  创建一个Flask项目的步骤:

  1.导入Flask类

  2.创建程序实例

  3.定义视图(函数)

  4.启动服务器

  

 from flask import Flask

 app = Flask(__name__)

 @app.route('/')
 def index():
     return 'Hello Flask'

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

二、剖析上述7行代

  导入Flask模块的那一行就不说了。我们来剖析一下app = Flask(__name__)这一行。我们可以传入其他类型的参数么?如数值,如标准模块名或其他的。

  1.app = Flask(__name__)

  (1).Flask()能不能传入数字?

    如果传入的数字,那么会产生一个错误:AttributeError: 'int' object has no attribute 'startswith',这个错误说明传入的必须是字符串,因为只有字符串类型才有startswith()方法。

  (2).Flask()能不能传入标准模块名?

    如果传入的一个标准模块名,如"re", 那么在浏览器的地址栏中输入:127.0.0.1:5000/static/index.html,此时程序会到re模块的路径(/usr/lib/pythonx.x/)下查找有没有这个文件。注意,我们一般不应该去修改python标准模块的目录结构的!所以我们传入的参数一般不使用标准模块名,要么使用__name__,要么使用一个字符串(但不能是标准模块名)。但是这个字符串必须是一个模块名。如果不是模块名,是一个随便的字符串,有时候可能也无法访问到(Working directory没有指定)。

  

  2.视图部分  

  @app.route('/')
  def index():
    return 'Hello Flask'

  在Flask中,每个视图的作用都是与一个指定的url相对应,即当浏览器发送一个请求过来之后,就会有一个视图返回响应信息给浏览器。那么问题来了:一个url可以对应多个视图么, 如何给视图传入参数以及状态码有什么用?

  (1). 一个URL可以对应多个相同的视图么?

    一个URL是不能对应多个相同的视图,但是一个URL,可以对应不同的视图。因为一个URL只能有一个响应信息!但是为什么一个URL可以有多个不同的视图呢?因为每个URL的请求方法可能是不一样的。

  

 from flask import Flask

 app = Flask(__name__)

 @app.route('/', methods=['POST', 'PUT'])
 def index1():
     return '这是index1'

 @app.route('/', methods=['DELETE'])
 def index2():
     return '这是index2'

 # 当在浏览器中输入127.0.0.1:5000/时,会触发index3(),因为这个试图有的请求方法有GET,
 # 如果是URL会向服务器提交数据的话,那么使用的方法是POST,此时会根据url_map来按顺序选择
 # 试图来进行响应
 @app.route('/', methods=['GET', 'POST'])
 def index3():
     return '这是index3'

 if __name__ == "__main__":
     print(app.url_map) # url_map是url与试图的映射关系
     app.run(debug=True)

  (2). 如何给视图传入参数?

  给视图传入参数的url格式是:"/xxxx/<type: arg>"。

  使用<类型:参数>,这样子就可以往视图中传入参数了。在Flask中有6中定义的类型,每种类型都有对应的转换器(Converter),常用的转换器是:参数的默认类型是str类型。  

 DEFAULT_CONVERTERS = {
     'default':          UnicodeConverter,
     'string':           UnicodeConverter,
     'any':              AnyConverter,
     'path':             PathConverter,
     'int':              IntegerConverter,
     'float':            FloatConverter,
     'uuid':             UUIDConverter,
 }

比如:  

 # 视图parse_args携带两个参数,一个是int类型,另一个是str类型
 # 此时组成的URL格式是:127.0.0.1:5000/args/111abc,
 # 也就是说args/后面的参数是整数在前,字符串在后,必须是两个都存在。
 @app.route('/args/<int:int_arg><string:str_arg>')
 def parse_args(int_arg, str_arg):
     return '该URL携带的参数是:%s和%s' % (int_arg, str_arg)

  (3). 状态码有什么用?

  在程序中,我们可以自定义状态码,也可以使用HTTP协议规定的状态码。

  自定义状态码的目的是为了实现前后端的数据交互!如在js脚本中使用ajax去请求服务器的数据时,如果请求的数据不存在,那么后端就返回一个错误码和错误信息,这样只要判断错误码就知道错误的结果了!比如检验用户名和密码的时候就会用到。

  HTTP规定的状态码可以在视图中使用abort(status_code)函数把想要返回的状态码返回给客户端。这条语句就像raise语句。当abort函数执行后,程序就不会再往下执行了。不过abort()只能抛出HTTP协议规定的状态码,不能抛出自定义的状态码。

  

 @app.route('/status')
 def resp_status():
     # 当视图返回时,响应体被渲染到浏览器中,状态码由浏览器获得,这个状态码可以是任意的。
     return '响应成功!', 600

  如果当发生标准错误(如404, 500...)了,有没有什么更好的解决方案呢?

  在Flask中,@app.errorhandlers()装饰器是一个很好的选择,当发生诸如404, 500这样HTTP标准错误时,我们可以自定义错误的信息,如果返回一个好看的页面,而不是返回专业术语,这些术语又不是给用户看的!

  

 @app.route('/status')
 def resp_status():
     # 当返回时,响应体被渲染到浏览器中,状态码由浏览器获得,
     # 这个状态码可以是任意的。
     abort(500)
     return '响应成功!', 600

 @app.errorhandler(500)
 def error_500(e):
     return '不好意思,服务器出了点小毛病!请稍后再试!'

  在浏览器的地址栏中输入:127.0.0.1:5000/status 之后。先执行resp_stauts视图,当执行到abort语句时,会抛出500错误,此时因为在程序中定义了状态码为500的处理视图,也就是说程序会自动执行error_500视图,然后把响应体返回给浏览器。

  (4). 如何实现重定向功能?

  重定向也算是一个比较常见的功能,比如某宝,某东每年都会有很多活动,那么在剁手节的时候很多商品可能很快就会被剁走了。此时,如果当用户没有找到他们想要的东西时,我们不应该直接报告错误吧,而是应该把用户一步步的引诱到其他的剁手活动中,这就是重定向功能!

  

 @app.route('/redirect')
 def redirect_resp():
     # 重定向到百度去
     # 但是这种方式不是很好,因为如果每个试图都用重定向的话,会写很多相同的代码,扩展性差
     # 那有没有更好的办法?
     return '你们都是重定向过来的!'

 @app.route('/xxx')
 def redirect_url():
     # 当地址栏中是127.0.0.1:5000/xxx时,会重定向到redirect_resp试图去
     # 然后redirect_base又重定向到百度。
     # 这实际上是一个反向解析的过程,即通过试图去匹配url, 并响应.
     # url_for()中的参数是由试图名组成的字符串,使用url_for的扩展性特别强。
     return redirect(url_for('redirect_resp'))

  

  

Python框架学习之用Flask创建一个简单项目的更多相关文章

  1. python Django 学习笔记(二)—— 一个简单的网页

    1,创建一个django项目 使用django-admin.py startproject MyDjangoSite 参考这里 2,建立视图 from django.http import HttpR ...

  2. Windows 8.1 应用再出发 (WinJS) - 创建一个简单项目

    前面几篇我们介绍了如何利用 C# + XAML 完成Windows Store App 功能的实现,接下来的几篇我们来看看如何利用 Html + WinJS 来完成这些功能. 本篇我们使用WinJS ...

  3. maven学习3,如何创建一个web项目

      Maven学习 (三) 使用m2eclipse创建web项目   1.首先确认你的eclipse已经安装好m2eclipse的环境,可以参照上两篇Maven学习内容 2.新建一个maven的项目 ...

  4. twisted 学习笔记二:创建一个简单TCP客户端

    #coding=utf-8 from twisted.internet import reactor,protocol class QuickClient(protocol.Protocol): de ...

  5. Python框架学习之Flask中的视图及路由

    在前面一讲中我们学习如何创建一个简单的Flask项目,并做了一些简单的分析.接下来在这一节中就主要来讲讲Flask中最核心的内容之一:Werkzeug工具箱.Werkzeug是一个遵循WSGI协议的P ...

  6. 一个先进的App框架:使用Ionic创建一个简单的APP

    原文  http://www.w3cplus.com/mobile/building-simple-app-using-ionic-advanced-html5-mobile-app-framewor ...

  7. Spring.NET依赖注入框架学习-- 泛型对象的创建和使用

    Spring.NET依赖注入框架学习-- 泛型对象的创建和使用 泛型对象的创建方法和普通对象是一样的. 通过构造器创建泛型对象 下面是一个泛型类的代码: namespace GenericsPlay ...

  8. 通过创建一个简单的骰子游戏来探究 Python

    在我的这系列的第一篇文章 中, 我已经讲解如何使用 Python 创建一个简单的.基于文本的骰子游戏.这次,我将展示如何使用 Python 模块 Pygame 来创建一个图形化游戏.它将需要几篇文章才 ...

  9. Python创建一个简单的区块链

    区块链(Blockchain)是一种分布式账本(listributed ledger),它是一种仅供增加(append-only),内容不可变(immutable)的有序(ordered)链式数据结构 ...

随机推荐

  1. BZOJ4407: 于神之怒加强版(莫比乌斯反演 线性筛)

    Description 给下N,M,K.求 感觉好迷茫啊,很多变换看的一脸懵逼却又不知道去哪里学.一道题做一上午也是没谁了,, 首先按照套路反演化到最后应该是这个式子 $$ans = \sum_{d ...

  2. Django引入静态文件

    在HTML文件中引入方式: 简单引入一个bootstrap中的内敛表单,效果图如下:

  3. FUNCTIONALITY OF ITEM CATEGORY

    Item Category Purpose This wiki page will breify discuss about functionality of Item Category in SAP ...

  4. 通过git上传本地代码到github仓库

    最近呢,武汉天气燥热,在公司没啥事,就自己写了一下小demo. 作为一个菜鸟,只在github上扒过别人的代码,还没自己上传过,就试了一下,遇到了一些坑,记录一下. 前提是电脑上安装了git,没有安装 ...

  5. springboot 学习之路 5(打成war包部署tomcat)

    目录:[持续更新.....] spring 部分常用注解 spring boot 学习之路1(简单入门) spring boot 学习之路2(注解介绍) spring boot 学习之路3( 集成my ...

  6. 企业建立成功 DevOps 模式所需应对的5个挑战

    [编者按]本文作者为 Kevin Goldberg,主要介绍要想成功部署 DevOps 模式,企业所需应对的5大挑战与问题.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 要给 DevOps ...

  7. C#-多态(十二)

    继承概念 多态:即一个接口,多个功能 同一种操作作用于不同的对象,可以有不同的解释,产生不同的执行结果 多态性可以是静态的或动态的.在静态多态性中,函数的响应是在编译时发生的.在动态多态性中,函数的响 ...

  8. shell编程-输入/输出重定向(十一)

    linux中文件描述符 linux跟踪打开文件,而分配的一个数字,通过这个数字可以实现对文件的读写操作 用户可以自定义文件描述符范围是:3-max,max跟用户的ulimit –n 定义数字有关系,不 ...

  9. ArcGIS Server10.2 集群部署注意事项

    不接触Server很久了,最近一个省级项目需要提交一个部署方案,由于是省级系统,数据.服务数量都较大,需要考虑采用Server集群的方式来实现.在网上搜罗了以下Server集群的资料,按照步骤一步步来 ...

  10. 用emacs 阅读 c/c++ 代码

    在emacs编程中有以下需求 从调用一个函数的地方跳转到函数的定义的地方 或是反过来从函数定义的地方列出所有调用这个函数的地方 实现办法 需要安装以下软件 gnu global(阅读源代码的工具)官网 ...