在前面一篇讲了如何创建一个虚拟环境,今天这一篇就来说说如何创建一个简单的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. 替换富文本里的px为rem

    var content = '23px' content = content.replace(/(\d+)px/g, function(s, t) { s = s.replace('px', ''); ...

  2. Django之模板

    Django模板系统 官方文档 常用语法 Django模板中只需要记两种特殊符号: {{  }}和 {% %} {{ }}表示变量,在模板渲染的时候替换成值,{% %}表示逻辑相关的操作. 变量 {{ ...

  3. C#基础(203)实例方法和重载方法总结,构造方法与实例方法总结,this关键字

    c#方法的重载:分为实例方法重载和静态方法重载俩种 1.实例方法重载的调用特点 首先写三个Add方法和三个Sub方法 public int Add(int a,int b) { return a + ...

  4. Duplicate entry '0' for key 'PRIMARY'

    一般使用ORM时,提交新增实体时, mysql会出现此错误:Duplicate entry '0' for key 'PRIMARY' 原因是插入语句,未提供主键的值,且主键是非自增长的. 解决办法是 ...

  5. 无需ORM的数据库

    DynamicDB是一种NoSQL数据库.一个实例下可以创建多种Database,一个Database中可以包含多个Collection(相当于关系型数据库中的Table),一个Collection中 ...

  6. Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较

    本篇博文用一个稍复杂点的案例来对比一下基于XML配置与基于AspectJ注解配置的AOP编程的不同. 相关引入包等Spring  AOP编程准备,请参考小编的其他博文,这里不再赘述. 案例要求: 写一 ...

  7. Android IPC机制(三)使用AIDL实现跨进程方法调用

    上一篇文章中我们介绍了使用Messenger来进行进程间通信的方法,但是我们能发现Messenger是以串行的方式来处理客户端发来的信息,如果有大量的消息发到服务端,服务端仍然一个一个的处理再响应客户 ...

  8. git 入门教程之分支策略

    默认情况下合并分支常常直接使用 git merge 命令,是最方便快速的合并方法.其实这种情况下 git 采用的是 fast forward 模式,特点是删除分支后,会丢失分支信息,好像从来没存在该分 ...

  9. (网页)websocket后台调用Service层

    百度论坛里面有很多好的方法,借鉴. 重点:因为项目是StringBoot所以我用的是下面的方法很好使: Service.... service = (Service....) ContextLoade ...

  10. awesomium_v1.6.6_sdk 百度云下载地址

    awesomium的官网已经关闭很久了,所以找不到正规的下载地址. 而csdn上面的又收费.所以这里提供一个不收费的百度云的下载地址给大家. 不足就是不是1.7版本,所以对于某些有特殊用途的满足不了了 ...