Flask实战:如何从零开发“知乎”

Flask实战:如何从零开发“知乎”

作为当下十分火热的问答社区,知乎聚集了大量问题者和答题者。

但不少朋友在逛知乎的同时,也不禁想要开发一个像“知乎”这样的问答社区,既能够问题答题,也能拥有用户评论、点赞、收藏、浏览量等诸多完善的功能。

今天给大家安利个教程,手把手帮助有一定web基础的同学开发出属于自己的简易“知乎”,并有完整源码可供下载。

废话不多说,先看看教程最终实现的社区效果:



社区主页





搜索功能





(完整源码可查看《Flask实现一个问答社区》获取。)

一、教程简介

本教程的目标是使用 Python 的轻量级 Web 框架 Flask 和经典模块化前端框架 layui 实现一个社区项目。实现功能包括:用户注册、登录、邮件激活、发帖、回帖、点赞、回复、采纳、删帖、结帖以及 flask-admin 后台管理等功能。

二、Flask简介

Flask 最初是作为愚人节的玩笑诞生的,后来在很短的时间内大受好评,迅速在 Python Web 开发者中流行开来。如今,Flask 已经成为轻量级 Web 框架的代言人。

Flask 提供的是一个最小化的 Web 框架,对于多年开发经验的老手,可以在此基础上自定义任何你想要添加的功能;而对于初学者,同样可以利用社区中丰富的资源扩展快速上手。在这次学习过程中,大家会慢慢感受到 Flask 这一特性的魅力。

三、开发环境和配置

1.实验简介

本章介绍 virtualenv 搭建开发环境,以及项目的一些基本配置。

本章主要介绍使用 virtualenv 新建环境,创建项目的配置文件并添加配置,最后使用 Flask Script 扩展运行项目返回一个 Hello,World 页面。

知识点

  • virtualenv 的使用
  • Flask 应用基本结构
  • Flask Scrip
  • t 扩展

项目结构

本章项目的文件结构为:


$ tree PyFly

PyFly
|-- fly_bbs
    |-- __init__.py
    |-- config.py
    |-- controllers
        |-- __init__.py
|-- manage.py

2.环境准备

我们使用 Python3.5 和 Flask1.1.1 来实现项目,实验环境已经安装了 Python3.5 。

我们用 pip 包管理工具来安装我们的 Flask 框架和相应扩展。在实验楼的线上环境中已经安装了 pip 。

3.virtualenv简介

通常在开发 Python 应用程序的时候,系统中会存在一个或多个 Python 解释器版本,例如实验环境中就有 Python2.7 和 Python3.5 这两个。

如果我们要使用 Python3.5 同时开发多个应用程序,那这些应用程序都会共用一个 Python,就是安装系统的Python3.5 。如果两个项目使用不同版本的依赖包,就会出现冲突。

这种情况下,每个应用需要各自拥有一套“独立”的 Python 运行环境。virtualenv 就是用来为一个应用创建一套“隔离”的 Python 运行环境。

实验环境中已经安装了 virtualenv ,在终端命令行执行如下命令可以查看:


shiyanlou:Code/ $ pip3 freeze | grep -i virtualenv  
virtualenv==16.7.5
virtualenv-clone==0.5.3

如果在你自己的本地环境下安装此包,可执行此命令使用 pip 包管理工具安装:


$ sudo pip3 install virtualenv

在实验环境中,pip 是 Python 2.7 的包管理工具,pip3 是 Python3.5 的包管理工具,要注意区分。

使用 virtualenv 的沙盒环境来进行开发,不仅可以使我们避免不同项目不同版本的麻烦,同时它还支持使用 pip freeze > requirements.txt 把自己沙盒环境中的所有依赖包信息导出到一个 requirements.txt 文件中。这样当你切换的一个新环境的时候,不需要一个一个的去下载项目需要的依赖,只需要新环境开启后,在终端输入 pip install -r requirements.txt,pip 就会自动从网上下载并安装所有包。

4.开始使用 virtualenv

首先,我们从终端进入到 /home/shiyanlou/Code 目录下,新建一个虚拟环境:


shiyanlou:~/ $ cd Code  
shiyanlou:Code/ $ virtualenv -p python3 venv  
Running virtualenv with interpreter /usr/bin/python3
Already using interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /home/shiyanlou/Code/venv/bin/python3
Also creating executable in /home/shiyanlou/Code/venv/bin/python
Installing setuptools, pip, wheel...
done.

这条命令会在 Code 文件夹中新建一个文件,pipenv 会把所有下载的包都装进 venv 这个文件。其中 -p 选项后面的参数用于指定 Python 解释器的版本,Python3 就指的是 Python3.5:


shiyanlou:Code/ $ python3 -V   
Python 3.5.2

最后一个参数 venv 是自定义的虚拟环境名字,现在可以看到 Code 目录下已经有了虚拟环境的相关目录结构:


shiyanlou:Code/ $ ll    
总用量 7K
drwxrwxr-x 5 shiyanlou shiyanlou 4.0K 12\u6708  7 15:06 venv

接下来,激活并进入虚拟环境,这是固定的命令:


shiyanlou:Code/ $ source venv/bin/activate 
(venv) shiyanlou:Code/ $

可以看到命令行提示符前面有 (venv) 字样。现在就进入到了虚拟环境,可以使用虚拟环境中的 Python 解释器和 pip 包管理工具。注意在虚拟环境里使用它们,无需在后面加 “3” ,python 和 pip ,不需要写成 python3 和 pip3 。

在虚拟环境中安装 flask 包:


(venv) shiyanlou:Code/ $ pip install flask  
Looking in indexes: http://mirrors.cloud.aliyuncs.com/pypi/simple/
Collecting flask
... ...

如果你在本地操作,要像上面的步骤所示,创建虚拟环境并安装所需依赖包。

此外还需大家注意,我们的实验环境不能保存,每次启动都是新的默认环境,所以大家一定要在实验完成后保存好代码,推荐使用 GitHub 来存储项目代码。

对于 GitHub 和 Git 操作不熟悉的同学,可以学习《 Git 与 GitHub 入门实践 》这门优秀的免费课程。

接下来开始我们的项目。

5.新建项目主目

在 Code 目录下新建一个子目录作为整个项目的主目录。就叫它 PyFly。再在 PyFly 里面新建一个 fly_bbs 文件存放我们的应用内容。然后创建配置文件 configs.py :


$ mkdir -p PyFly/fly_bbs 
$ cd PyFly 
$ touch fly_bbs/configs.py

在 configs.py 文件中添加如下所示代码:


import os

class DevConfig:
    '''开发环境配置'''

    MONGO_URI = 'mongodb://localhost:27017/pyfly'

class ProConfig(DevConfig):
    '''生产环境配置'''

configs = {
        'Dev': DevConfig,
        'Pro': ProConfig
}

6.创建视图函数

在 fly_bbs 目录下新建一个子目录 controllers ,用来放置我们项目的交互逻辑:


$ cd /home/shiyanlou/Code/PyFly/fly_bbs
$ mkdir controllers
$ touch controllers/__init__.py

这里先实现一个返回 Hello,World 页面的函数,在 controllers/init.py 文件里写入:


def config_route(app):
    @app.route('/')
    def home():
        return '<h1>Hello, World!</h1>'

7.创建初始化app的函数

在 fly_bbs 目录下新建 init.py 文件并写入创建应用的相关代码:


from flask import Flask
from .configs import configs
from .controllers import config_route

def create_app(config_name):
    app = Flask(__name__)
    # from_object 会从传入的对象中读取配置信息
    app.config.from_object(configs[config_name])
    # controllers 中的路由函数
    config_route(app)

    return app

8.使用Flask Script

为了更容易地进行后面内容的实现和学习,我们使用 flask-script 来运行我们的应用。

在终端虚拟环境下执行如下命令安装此包:


$ pip install flask-script

Flask Script 有一些自带的默认命令,可以用来运行应用,或者开启带应用上下文的命令行。

在 PyFly 目录新建 manager.py 文件,并写入如下代码:


from fly_bbs import create_app
from flask_script import Manager
import os

config_name = os.environ.get('FLASK_CONFIG') or 'Dev'

app = create_app(config_name)
# 把 app 传给 Manager 对象
manager = Manager(app)

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

9.运行应用

现在,你可以通过 python3 manager.py runserver 命令来运行开发环境服务器了。

运行成功,访问 127.0.0.1:5000/ 就可以看到我们的项目显示的 Hello,World 了。




10.本章总结

本节实验介绍了虚拟环境的作用以及如何使用 virtualenv 创建虚拟环境,在 Code 目录下创建了项目最初的目录结构,编写了配置文件 configs.py 并创建了一个视图函数以打开网站首页,并对 flask-script 进行了使用。

下一节实验我们学习数据库的使用和蓝图的创建。


获取完整教程和源码,可访问《Flask实现一个问答社区》获取。

发布于 2020-02-20

文章被以下专栏收录