开始使用Flask,Python微框架
Flask是一个简单,易于使用的Python的微框架,可帮助构建可扩展和安全的Web应用程序。以下是Flask对于初学者很有好处的几个原因:
- 很容易设置
- 它得到了一个活跃的社区的支持
- 它有很好的记录
- 这是非常简单和简约的,不包括你不会使用的任何东西
- 同时,它的灵活性足够您可以添加扩展,如果您需要更多的功能
在本教程中,我们将介绍以下内容:
- 安装Flask及其先决条件
- Flask项目的推荐文件和目录结构
- Flask应用程序的配置和初始化
- 创建视图和模板
在本教程末尾,我们将使用Flask构建一个简单的静态网站。本教程中使用的代码可供您参考GitHub。
准备?我们来吧!
安装
- Python(本教程使用Python 2)
- virtualenv和virtualenvwrapper
- 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()。瞧!有用!
目录结构
到目前为止,我们只需要在我们的项目中的一个功能性文件:hello_world.py。一个真实世界的Web项目通常有更多的文件。维护良好的目录结构很重要,以便单独组织应用程序的不同组件。这些是Flask项目中的几个常见目录:
- /app:这是一个目录my-project。我们将所有的代码放在这里,并留下其他文件,如requirements.txt文件。
- /app/templates:这是我们的HTML文件将要去的地方。
- /app/static:这是静态文件,如CSS和JavaScript文件以及图像通常会去的地方。但是,由于我们不会使用任何静态文件,因此本教程不需要此文件夹。
mkdir app app/templates
您的项目目录应该如下所示:
├── my-project
├── app
│ ├── templates
├── hello_world.py
└── requirements.txt
现在hello_world.py似乎有点不合适了,不是吗?别担心,我们会在下一节中解决这个问题。
文件结构
对于“Hello World!” 例如,我们只有一个文件。为了建立我们的网站,我们需要更多的文件来提供各种功能。大多数Flask应用程序具有以下基本文件结构:
- run.py:这是应用程序的入口点。我们将运行此文件启动Flask服务器并启动我们的应用程序。
- config.py:此文件包含应用程序的配置变量,如数据库详细信息。
- app/init.py:这个文件初始化一个Python模块。没有它,Python将不会将app目录识别为模块。
- app/views.py:该文件包含我们应用程序的所有路由。这将告诉Flask在哪个路径上显示什么。
- 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错误,
继续; 运行应用程序并查看:
模板
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 %}标签内。其他一切都从基本模板加载,所以我们不必重写所有页面通用的东西,例如导航栏和页脚。
让我们刷新我们的浏览器,看看我们现在有什么:
结论
恭喜您做到这一点,让您的第一个Flask网站开始运行!我希望这个对Flask的介绍,激起了你对探索更多的兴趣。您现在可以开始构建更复杂的应用程序的基础。有关更多信息,请查看官方文档。
之前使用过其他Python框架吗?你觉得Flask站在哪里?让我们在下面的评论中谈谈。