开始使用Flask,Python微框架

2017-10-09

flask

Flask是一个简单,易于使用的Python的微框架,可帮助构建可扩展和安全的Web应用程序。以下是Flask对于初学者很有好处的几个原因:

  1. 很容易设置
  2. 它得到了一个活跃的社区的支持
  3. 它有很好的记录
  4. 这是非常简单和简约的,不包括你不会使用的任何东西
  5. 同时,它的灵活性足够您可以添加扩展,如果您需要更多的功能

在本教程中,我们将介绍以下内容:

  1. 安装Flask及其先决条件
  2. Flask项目的推荐文件和目录结构
  3. Flask应用程序的配置和初始化
  4. 创建视图和模板

在本教程末尾,我们将使用Flask构建一个简单的静态网站。本教程中使用的代码可供您参考GitHub。

准备?我们来吧!

安装

  1. Python(本教程使用Python 2)
  2. virtualenvvirtualenvwrapper
  3. flask

您可能已经在系统上安装了Python。您可以通过python在终端中运行命令进行检查。如果已安装,您应该看到以下输出:

$ python
Python 2.7.10 (default, Oct 23 2015, 19:19:21)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

如果没有安装,可以在这里下载。

我们将首先安装virtualenv,一个创建孤立的Python环境的工具。我们需要使用虚拟环境来保持不同Python项目分开使用的依赖关系,并保持我们的全局站点包目录清洁。我们将进一步,并安装virtualenvwrapper,这是一组扩展,通过提供更简单的命令使得使用virtualenv更容易一些。

$ pip install virtualenv
$ pip install virtualenvwrapper
$ export WORKON_HOME=~/Envs
$ source /usr/local/bin/virtualenvwrapper.sh

要创建并激活一个virtualenv,请运行以下命令:

$ mkvirtualenv my-venv
$ workon my-venv

告诉你命令很简单!我们现在有一个virtualenv被调用my-venv,我们已经激活并正在开始工作。现在,我们安装的任何依赖项将安装在这里而不是全局安装。记住要在使用或者在这个项目上工作时激活virtualenv!

接下来,让我们为我们的应用创建一个目录。这是我们所有的文件将去的地方:

$ mkdir my-project
$ cd my-project

最后,我们来安装Flask:

$ pip install Flask

安装Flask还会安装其他一些依赖关系,当您运行以下命令时您将看到它们:

$ pip freeze
click==6.6
Flask==0.11.1
itsdangerous==0.24
Jinja2==2.8
MarkupSafe==0.23
Werkzeug==0.11.11

这些软件包做什么?Flask使用Click(命令行界面创建工具包)命令行界面,可以为应用程序添加自定义shell命令。ItsDangerous在使用加密签名发送数据时提供安全性。Jinja2是Python的强大模板引擎,而MarkupSafe是一个HTML字符串处理库。Werkzeug是WSGI的一个实用程序库,它是确保Web应用程序和Web服务器可以有效沟通的协议。

您可以将以上输出保存在文件中。这是一个很好的做法,因为任何想要处理或运行项目的人都需要知道安装的依赖关系。以下命令将在requirements.txt文件中保存依赖关系:

$ pip freeze > requirements.txt

用flask 写一个 “hello world!”

我认为任何初学者编程教程如果没有以经典的“Hello World!”开头,就会被忽略。所以这里是如何做到这一点在Flask:

在你喜欢的文本编辑器中创建以下文件hello_world.py :

# hello_world.py

from flask import Flask
app = Flask(__name__)

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

我们从导入Flask类开始,并创建一个实例。我们使用__name__参数来指示应用程序的模块或包,以便Flask知道在哪里可以找到其他文件,如模板。然后我们有一个简单的函数来显示字符串Hello World!。前面的装饰器只是告诉Flask哪个路径显示功能的结果。在这种情况下,我们指定了路由/,它是主URL。

让我们看看这个在行动,我们呢?在您的终端中,运行以下命令:

$ export FLASK_APP=hello_world.py
$ flask run
 * Serving Flask app "hello_world"
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

第一个命令告诉系统运行哪个应用程序。下一个启动服务器。http://127.0.0.1:5000/在浏览器中输入指定的URL()。瞧!有用!

flask

目录结构

到目前为止,我们只需要在我们的项目中的一个功能性文件:hello_world.py。一个真实世界的Web项目通常有更多的文件。维护良好的目录结构很重要,以便单独组织应用程序的不同组件。这些是Flask项目中的几个常见目录:

  1. /app:这是一个目录my-project。我们将所有的代码放在这里,并留下其他文件,如requirements.txt文件。
  2. /app/templates:这是我们的HTML文件将要去的地方。
  3. /app/static:这是静态文件,如CSS和JavaScript文件以及图像通常会去的地方。但是,由于我们不会使用任何静态文件,因此本教程不需要此文件夹。
mkdir app app/templates

您的项目目录应该如下所示:

├── my-project
       ├── app
       │   ├── templates
       ├── hello_world.py
       └── requirements.txt

现在hello_world.py似乎有点不合适了,不是吗?别担心,我们会在下一节中解决这个问题。

文件结构

对于“Hello World!” 例如,我们只有一个文件。为了建立我们的网站,我们需要更多的文件来提供各种功能。大多数Flask应用程序具有以下基本文件结构:

  1. run.py:这是应用程序的入口点。我们将运行此文件启动Flask服务器并启动我们的应用程序。
  2. config.py:此文件包含应用程序的配置变量,如数据库详细信息。
  3. app/init.py:这个文件初始化一个Python模块。没有它,Python将不会将app目录识别为模块。
  4. app/views.py:该文件包含我们应用程序的所有路由。这将告诉Flask在哪个路径上显示什么。
  5. app/models.py:这是模型的定义。模型是代码中数据库表的表示。但是,由于在本教程中我们不会使用数据库,因此我们不需要这个文件。

一些项目有更多的模块(例如,一个app/views包含许多视图文件的目录),但现在这样做。继续创建这些文件,并删除,hello_world.py因为我们不再需要它了:

$ touch run.py config.py
$ cd app
$ touch __init__.py views.py
$ rm hello_world.py

这是我们最新的目录结构:

├── my-project
       ├── app
       │   ├── __init__.py
       │   ├── templates
       │   └── views.py
       ├── config.py
       ├── requirements.txt
       └── run.py

现在我们用一些代码填写这些空文件!

配置

该config.py文件应该包含一行,如下所示:

# config.py

# Enable Flask's debugging features. Should be False in production
DEBUG = True

请注意,此配置文件非常简化,并不适用于更复杂的应用程序。对于更大的应用程序,您可以选择具有config.py用于测试,开发和生产的不同文件,并将它们放在config使用类和继承的目录中。您可能会有一些不应公开共享的变量,例如密码和密钥。这些可以放在一个instance/config.py文件中,不应该被推送到版本控制。

初始化

接下来,我们必须使用我们的所有配置初始化我们的应用程序。这是在app/init.py文件中完成的。请注意,如果我们设置instance_relative_config到True,我们可以使用app.config.from_object('config')加载config.py文件。

# app/__init__.py

from flask import Flask

# Initialize the app
app = Flask(__name__, instance_relative_config=True)

# Load the views
from app import views

# Load the config file
app.config.from_object('config')

运行, Flask!

我们现在要做的就是配置我们的run.py文件,以便我们可以启动Flask服务器。

# run.py

from app import app

if __name__ == '__main__':
    app.run()

要flask run像以前一样使用命令,我们需要将FLASK_APP环境变量设置为 run.py:

$ export FLASK_APP=run.py
$ flask run

我们会收到一个404页面,因为我们没有为我们的应用程序写任何观点。我们会尽快修复。

视图

从“Hello World!” 例如,您已经了解了视图的工作原理。我们使用@app.route装饰器来指定我们想要查看视图的路径。我们已经看到如何编写返回一个字符串的视图。看看还有什么我们可以做的观点。

# views.py

from flask import render_template

from app import app

@app.route('/')
def index():
    return render_template("index.html")

@app.route('/about')
def about():
    return render_template("about.html")

Flask提供了一种方法,render_template 我们可以使用它来指定在特定视图中加载哪个HTML文件。当index.html和about.html文件不存在时,我们浏览到这些路径。flask 会给我们一个Template Not Found错误,

继续; 运行应用程序并查看:

index

about

模板

Flask允许我们使用各种模板语言,但Jinja2是迄今为止最流行的一种。从我们安装的依赖关系中记住吗?Jinja提供的语法允许我们添加一些功能到我们的HTML文件,如if-else块和for循环,并在我们的模板中使用变量。Jinja还让我们实现模板继承,这意味着我们可以拥有其他模板继承的基础模板。酷,对吧?

我们开始创建以下三个HTML文件:

$ cd app/templates
$ touch base.html index.html about.html

我们将从base.html文件开始,使用此示例Bootstrap模板的稍微修改版本:

<!-- base.html -->

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>{% block title %}{% endblock %}</title>
    <!-- Bootstrap core CSS -->
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <!-- Custom styles for this template -->
    <link href="https://getbootstrap.com/examples/jumbotron-narrow/jumbotron-narrow.css" rel="stylesheet">
  </head>
  <body>
    <div class="container">
      <div class="header clearfix">
        <nav>
          <ul class="nav nav-pills pull-right">
            <li role="presentation"><a href="/">Home</a></li>
            <li role="presentation"><a href="/about">About</a></li>
            <li role="presentation"><a href="http://flask.pocoo.org" target="_blank">More About Flask</a></li>
          </ul>
        </nav>
      </div>
      {% block body %}
      {% endblock %}
      <footer class="footer">
        <p>© 2016 Your Name Here</p>
      </footer>
    </div> <!-- /container -->
  </body>
</html>

你注意到{% block %}和{% endblock %}标签?我们还将在从基本模板继承的模板中使用它们:

<!-- index.html-->

{% extends "base.html" %}
{% block title %}Home{% endblock %}
{% block body %}
<div class="jumbotron">
  <h1>Flask Is Awesome</h1>
  <p class="lead">And I'm glad to be learning so much about it!</p>
</div>
{% endblock %}
<!-- about.html-->

{% extends "base.html" %}
{% block title %}About{% endblock %}
{% block body %}
<div class="jumbotron">
  <h1>The About Page</h1>
  <p class="lead">You can learn more about my website here.</p>
</div>
{% endblock %}

我们使用{% extends %}标签从基本模板继承。我们将动态内容插入{% block %}标签内。其他一切都从基本模板加载,所以我们不必重写所有页面通用的东西,例如导航栏和页脚。

让我们刷新我们的浏览器,看看我们现在有什么:

index

about

结论

恭喜您做到这一点,让您的第一个Flask网站开始运行!我希望这个对Flask的介绍,激起了你对探索更多的兴趣。您现在可以开始构建更复杂的应用程序的基础。有关更多信息,请查看官方文档

之前使用过其他Python框架吗?你觉得Flask站在哪里?让我们在下面的评论中谈谈。

https://scotch.io/tutorials/getting-started-with-flask-a-python-microframework