2017年2月12日11:54:45

开始阅读第一篇有关Flask框架的文档:Quickstart — Flask Documentation (0.12)

安装Flask

Flask依赖外部库:WerkzeugJinja2,前者是WSGI相关的工具包,WSGI是基于Python语言的Web服务器与Web应用程序通信的标准接口。后者用来渲染模板。不过使用virtualenv可以简单粗暴地搞定安装,透明这些依赖。

virtualenv为不同的项目维护不同的环境,这在使用多个Python版本工作于多个项目的时候显得尤其有用。Linux中使用如下命令安装:

pip install virtualenv

我当前的作业系统是Windows,由于之前已经安装了pip工具,所以也可以按照如上的操作安装,安装pip工具可以参考pip and setuptools on Windows¶

然后,按照提示使用virtualenv venv创建自己的环境:

lianbche@5CG44636XG D:\Learning\git\Py103\Chap4\project
> virtualenv venv
New python executable in D:\Learning\git\Py103\Chap4\project\venv\Scripts\python.exe
Installing setuptools, pip, wheel...done.

lianbche@5CG44636XG D:\Learning\git\Py103\Chap4\project

之后使用activate, deactivate命令来激活、去激活工程环境设置:

lianbche@5CG44636XG D:\Learning\git\Py103\Chap4\project
> venv\Scripts\activate

(venv) lianbche@5CG44636XG D:\Learning\git\Py103\Chap4\project
>
(venv) lianbche@5CG44636XG D:\Learning\git\Py103\Chap4\project
>
(venv) lianbche@5CG44636XG D:\Learning\git\Py103\Chap4\project
> deactivate
lianbche@5CG44636XG D:\Learning\git\Py103\Chap4\project
>

在当前工程私有环境下安装Flask。

lianbche@5CG44636XG D:\Learning\git\Py103\Chap4\project
> venv\Scripts\activate

(venv) lianbche@5CG44636XG D:\Learning\git\Py103\Chap4\project
> pip install Flask
Collecting Flask
d:\learning\git\py103\chap4\project\venv\lib\site-packages\pip\_vendor\requests\packages\urllib3\util\ssl_.py:318: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.io/en/latest/security.html#snimissingwarning.
  SNIMissingWarning
d:\learning\git\py103\chap4\project\venv\lib\site-packages\pip\_vendor\requests\packages\urllib3\util\ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.io/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
  Downloading Flask-0.12-py2.py3-none-any.whl (82kB)
    100% |████████████████████████████████| 92kB 91kB/s
Collecting Jinja2>=2.4 (from Flask)
  Downloading Jinja2-2.9.5-py2.py3-none-any.whl (340kB)
    100% |████████████████████████████████| 348kB 164kB/s
Collecting Werkzeug>=0.7 (from Flask)
  Downloading Werkzeug-0.11.15-py2.py3-none-any.whl (307kB)
    100% |████████████████████████████████| 317kB 164kB/s
Collecting click>=2.0 (from Flask)
  Downloading click-6.7-py2.py3-none-any.whl (71kB)
    100% |████████████████████████████████| 71kB 118kB/s
Collecting itsdangerous>=0.21 (from Flask)
  Downloading itsdangerous-0.24.tar.gz (46kB)
    100% |████████████████████████████████| 51kB 128kB/s
Collecting MarkupSafe>=0.23 (from Jinja2>=2.4->Flask)
  Downloading MarkupSafe-0.23.tar.gz
Building wheels for collected packages: itsdangerous, MarkupSafe
  Running setup.py bdist_wheel for itsdangerous ... done
  Stored in directory: C:\Users\lianbche\AppData\Local\pip\Cache\wheels\fc\a8\66\24d655233c757e178d45dea2de22a04c6d92766abfb741129a
  Running setup.py bdist_wheel for MarkupSafe ... done
  Stored in directory: C:\Users\lianbche\AppData\Local\pip\Cache\wheels\a3\fa\dc\0198eed9ad95489b8a4f45d14dd5d2aee3f8984e46862c5748
Successfully built itsdangerous MarkupSafe
Installing collected packages: MarkupSafe, Jinja2, Werkzeug, click, itsdangerous, Flask
Successfully installed Flask-0.12 Jinja2-2.9.5 MarkupSafe-0.23 Werkzeug-0.11.15 click-6.7 itsdangerous-0.24

(venv) lianbche@5CG44636XG D:\Learning\git\Py103\Chap4\project
>

一个简单的Flask应用

2017年2月12日13:44:34

按照Flask文档中的示例,编写如下代码:

from flask import Flask
app = Flask(__name__)

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

这部分代码就是Server端程序,使用Web浏览器访问Server时所触发的逻辑全部在这里,这段代码的意思是当Server接收到用户的访问请求时将“Hello, World!”传送给请求方。在使用Web浏览器访问时,Server必须先启动。

Server的启动通过如下命令进行:

lianbche@5CG44636XG D:\Learning\git\Py103\Chap4\project
> venv\Scripts\activate

(venv) lianbche@5CG44636XG D:\Learning\git\Py103\Chap4\project
> set FLASK_APP=example_hello.py

(venv) lianbche@5CG44636XG D:\Learning\git\Py103\Chap4\project
> flask run
 * Serving Flask app "example_hello"
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

注:前面已经提到通过virtualenv来管理工程的环境变量,Flask安装在当前工程的venv私有环境下,在启动服务器时必须也先激活venv私有环境。

之后打开Web浏览器,在地址栏中输入:http://127.0.0.1:5000/ 进行访问:

Web框架

前面完成了Flask的安装,并测试了一个简单的Flask应用,对它有了感性认识,但是为什么会有Flask?Flask里面的运作机制是怎样的?为什么会存在许多所谓的框架呢?第二篇参考文章:What is a Web Framework?便是与Web框架有关。

1.Web Server

我们日常所看到的网页都是Web浏览器依据Web Server传送的HTML显示出来的(注:HTML是描述网页内容和结构的编程语言),负责发送的HTML内容的应用就称为Web Server,我们同时也将运行该应用的物理机器称作为Web Server。Web Server依据Web浏览器的请求来传送HTML内容。

2.HTTP

Web 浏览器基于request-response模型通过HTTP协议从Web Server下载数据,并将其显示出来。该模型下,每一次通信过程均是由Web浏览器发起,Web Server只是被动地传送Web浏览器所请求的数据。Web浏览器在请求数据的时候可以采用不同的方式:

HTTP GET:这是最为常用的请求方式,Web Server仅仅将准备好的网页内容传送给Web 浏览器。

HTTP POST: 当有Web浏览器需要与Web Server有更多交互的时候,比如将用户在Web浏览器上填写的数据发送到Web Server触发更多Server端的流程时使用这种方式。

因此,HTTP GET单纯的从Web Server端获取网页数据,并不会改变Web Server的状态,而HTTP POST则会将用户的数据发送给Web Server,Web Server根据这些数据做出处理,状态也就会发生变化。

3.HTTP Response Codes

针对每一次HTTP请求,Web Server会返回一个Response Code,它用来指示本次请求的结果。比如200表示“OK”,204表示“No Content”。

4.Web Application

Web应用,也就是在前面提到的Web Server,它负责接收Web浏览器传送过来的HTTP请求,然后回复HTTP响应。

5.Web Framework

任何一个Web Server除了本身的业务逻辑不同之外,均遵从接收HTTP请求,回复HTTP响应这一通用流程,这个过程当中有两个主要处理:其一,将Web浏览器请求的URL对应到Web Server的特定代码;其二,根据Web浏览器的请求动态生成响应的HTML内容。所谓的Web Framework便是为这些通用的流程提供统一的解决方案,使得在编写Web应用的时候开发人员的精力不为这些基础流程分散,可以高效集中到业务逻辑的编写当中。

基本概念清楚了,第三篇参考文档Welcome | Flask (A Python Microframework)是Flask的官方站点,等到编写代码的时候再去参考。

生词:

  • kick-ass 强大的;粗暴的。
  • fire up 生火;煽动。
  • delve into 专研。
  • glossing over 掩盖;掩饰;粉饰。
  • anatomy 解剖;解剖学。
  • fatigue 疲劳,疲乏。
  • beast 野兽。
  • deviate 脱离;使偏离。
  • canonical 依教规的;权威的。
  • rudimentary 基本的;初步的。
  • round-up 聚拢;聚集。
  • boilerplate 样板文件;引用。
  • detriment 损害;伤害。

results matching ""

    No results matching ""