vlambda博客
学习文章列表

Flask 项目实战|从零开发 “StackOverflow” 问答网站


StackOverflow 是全球最大的 IT 技术问答网站之一,在程序员界无人不知无人不晓,堪称“面向搜索引擎编程”神器。下图就是 StackOverflow 网站首页图:

是不是有种似曾相识的感觉?其实国内很多技术问答网站都是仿照 StackOverflow 来做的,那么问题来了, 开发一个 StackOverflow 这样的网站需要哪些工作呢?
首先我们来看看 StackOverflow 有哪些主要功能:
1、提问功能;
2、回答功能;
3、点赞功能;
4、用户管理功能;
围绕上面的 4 大功能,开发方面就涉及到:
1、开发语言的选择;
2、框架的选择;
3、数据库的设计;
4、接口开发;
5、部署;
……
今天就给大家带来一门开发「仿 StackOverflow 问答网站」的课程,包含具体开发思路、过程详解、代码等。项目使用了 Python 的 Flask Web 框架,带你实现属于自己的“问答网站”,实现提问、回答、评论、点赞等完备功能,并有完整源码可供下载。

效果显示

  • 网站首页

Flask 项目实战|从零开发 “StackOverflow” 问答网站
  • 问题详情页

Flask 项目实战|从零开发 “StackOverflow” 问答网站

课程地址:

https://www.shiyanlou.com/courses/1617
下面是课程的第一节内容:

欢迎来到 Flask 的世界

Flask 是一个使用 Python 开发的微型开发框架,基于 Werkzeug WSGI 工具箱和 Jinja2 模板引擎。Flask 也被称为 “microframework” ,因为它具有极简的核心,然而却可以通过扩展的方式增加其它功能。Flask 默认不支持数据库连接,不支持用户登录认证等功能。但是,我们可以通过各种扩展获得对这些功能的支持,比如数据库 ORM、表单验证、文件上传、开放式身份验证技术。这使得 Flask 成为具有高度扩展性和灵活性的 Python Web 框架。

为什么要学习 Flask ?

  1. 正如上面所说, Flask 是一个 Web “微”框架,我们使用 Flask 可以快速的搭建网站。在互联网时代,一个好的 idea 不能尽快展现在人们的面前,确实是令开发者很苦恼的事情。

  2. 容易学习。学完了 Python 基础之后想要接触 Web 开发,Flask 非常易于学习。同时,稍后你能看到示例代码所展示的那样,这是一个十分简单的框架。你的大脑很自然地就适应它了。使用 Flask ,可以更快地开发。

  3. Flask 有非常活跃、生机勃勃的社区:很多人会推荐你从 Flask 入手, Flask 是最好的现代 web 开发的 Python 框架之一。

“微” 是什么意思?

“微” 并不代表整个应用只能塞在一个 Python 文件内,尽管塞在单一文件内也是小事一桩。“微”也不代表 Flask 功能不强。微框架中的“微”字表示 Flask 的目标是保持核心简单但是可扩展。Flask 不会替你做决定,比如选用何种数据库。类似的决定,如使用何种模板引擎,是非常容易改变的。Flask 可以变成你任何想要的东西,不会变成任何你不想要的东西,一切由你做主。
缺省情况下, Flask 不包含数据库抽象层、表单验证或者其他已有的库可以处理的东西。然而, Flask 通过扩展为你的应用支持这些功能,就如同这些功能是 Flask 原生的一样。有无数的扩展可以支持数据库整合、表单验证、上传处理和各种开放验证等等。Flask 可能是“微小”的,但绝不简单,可以满足各种生产需要。

环境准备

在本训练营所提供的实验环境中,已经安装了 Python3.5 以及包管理工具 pip 。首先打开终端,执行如下语句切换到  /home/shiyanlou/Code 目录下,升级 pip3 到最新版:
  
    
    
  
$ cd ~/Code
$ sudo pip3 install -U pip
操作截图如下:
Flask 项目实战|从零开发 “StackOverflow” 问答网站

使用 virtualenv 创建虚拟环境

目前 Python 中创建隔离开发环境的工具有多种选择,其中 virtualenv 是最优秀的一个。所谓隔离是指 virtualenv 为每个 Python 项目创建虚拟环境,并保证该程序只能访问该虚拟环境下的包,解决了“项目 A 依赖于版本 1.x ,而项目 B 需要版本 2.x ”的两难问题,从而保持全局 Python 环境的干净整洁。另外使用 virtualenv 还有个好处,那就是在安装 Python 第三方库的时候不需要管理员权限。

安装 virtualenv

安装 virtualenv 的途径有很多,因为实验环境中已经安装了 pip 包管理工具,所以使用如下命令即可安装,这也是最常用的方式:
  
    
    
  
# 此命令无需在实验环境中执行
$ sudo pip3 install virtualenv
而我们的实验环境中已经安装了 virtualenv ,需要执行如下命令升级它到最新版:
  
    
    
  
$ sudo pip3 install -U virtualenv
其中  -U 选项等同于  --upgrade ,采用简写的选项可以少敲几下键盘。
补充:想了解更多关于 virtualenv 的信息可以参考 Python 指南——虚拟环境。
注意最新的版本是 20.x.x ,其中 20 是指当前年份的后两位。2020 年的版本号是 20.x.x ,2021 年的版本号是 21.x.x 。

使用 virtualenv

接下来可以为我们的 Web 项目创建虚拟环境了,命令很简单:
  
    
    
  
$ virtualenv -p python3 venv
其中  -p python 意为基于实验环境中的 Python3.5 创建虚拟环境,新建环境中的默认 Python 解释器就是 Python3.5 ;最后一个参数  venv 表示虚拟环境的目录名,虚拟环境创建后会自动在当前目录下生成一个环境目录,目录的名字就是 venv 。
操作截图如下:
Flask 项目实战|从零开发 “StackOverflow” 问答网站
此时执行如下命令即可进入虚拟环境:
  
    
    
  
$ source venv/bin/activate
进入虚拟环境后,可以直接使用  python 命令,它指向 Python3.5 ;可以直接使用 pip 命令,它指向虚拟环境的包管理工具。
如下图所示,进入虚拟环境后,在命令行提示符前面会有白颜色的括号,括号内是虚拟环境的目录名:
Flask 项目实战|从零开发 “StackOverflow” 问答网站
现在可以安装我们的 Web 项目所需要的 Flask 工具包了,注意在虚拟环境中执行 python 和 pip 命令不要加 sudo :
  
    
    
  
$ pip install flask
操作截图如下:
Flask 项目实战|从零开发 “StackOverflow” 问答网站
使用  pip freeze 命令可以查看当前已经安装的所有第三方库及其版本。如上图所示,除了 Flask 最新的 1.1.1 版本已经被安装,一并安装的还有一些依赖包。
在虚拟环境中安装了第三方库之后,要再次执行如下命令重新进入虚拟环境,以使得新安装的工具包生效:
  
    
    
  
$ source venv/bin/activate

创建项目的目录结构

项目最终完成后的目录结构如下图所示:
Flask 项目实战|从零开发 “StackOverflow” 问答网站
首先,我们在  /home/shiyanlou/Code 目录下创建多级目录作为项目的主目录结构:
  
    
    
  
$ mkdir -p stackoverflow/stackoverflow
进入  /home/shiyanlou/Code/stackoverflow 目录,创建  manage.py 文件,该文件用于编写创建 Flask 应用的代码:
  
    
    
  
$ cd stackoverflow
$ touch manage.py
切换到  /home/shiyanlou/Code/stackoverflow/stackoverflow 目录下,创建一些必要的文件和目录:
  
    
    
  
$ cd stackoverflow
$ touch app.py models.py configs.py __init__.py
$ mkdir handlers templates
操作截图如下:
Flask 项目实战|从零开发 “StackOverflow” 问答网站
其中  /home/shiyanlou/Code/stackoverflow 为文件主目录,对其中的文件和目录做一些说明:
  • stackoverflow/__init__.py 为非必须文件。在需要的时候,可以向其中引入一些变量,以使得上级目录中的 manage.py 等文件可以将 stackoverflow 作为模块引入其中的变量。

  • stackoverflow/app.py 为项目的核心文件,定义创建应用的函数以及注册插件、蓝图等代码写在这里。

  • stackoverflow/configs.py 为配置文件,对于不同的场景,需要提供不同的配置条件。常见的场景有测试、开发、生产等。

  • stackoverflow/models.py 为编写映射类的文件。

  • stackoverflow/handlers 为蓝图目录,将项目分为多个部分:首页、注册、登录/登出为一部分;问答相关的路由为一部分等等。

  • stackoverflow/templates 为前端模板文件目录,用于存放 HTML 文件。

  • stackoverflow/static 为静态文件目录,该目录暂未创建。

一个最基本的项目

本节实验我们使用 Flask Web 框架只写出一个最基本的网站首页,并显示 “Hello World” 字样即可。
首先使用 Vim 编辑器打开  stackoverflow/app.py 文件,将以下代码写入其中:
  
    
    
  
from flask import Flask
app = Flask ( __name__ )
@app.route ( '/' )
def index ():
return 'Hello World'
if __name__ == '__main__' :
app . run ( host = '0.0.0.0' , port = 8080 )
使用 Flask 框架,短短几行代码写到一个文件里,就可以启动一个 Web 应用了。
对代码进行一些简单的说明:
  • 第 1 行引入 Flask 类,该类的实例即为 Web 应用,其有一个 run 方法,可以启动 Web 项目。

  • 第 2 行 app = Flask(__name__) 创建 Flask 类的实例并赋值给变量 app ,其中的参数 __name__ 可以写成任何字符串,通常默认都会写成 __name__ ,即文件名 app 。

  • 第 3 至 5 行定义的是路由函数 index 。应用启动后,当浏览器访问网站主页时,服务器会调用该函数来处理请求并返回带有 'Hello World' 字符串的响应对象。

  • 最后一行,调用应用的 run 方法启动应用。实验楼在 WebIDE 环境中提供了一个 “Web 服务” 功能,可以直接进入到实验环境中 8080 端口运行的网站。所以我们在 app.run 方法中需要提供 '0.0.0.0' 作为 host 参数的值以便任何局域网内的浏览器都可以请求该网址,并且将端口号设置为 8080 。

终端执行  python app.py 启动应用:
Flask 项目实战|从零开发 “StackOverflow” 问答网站
点击右侧工具栏中的 “Web 服务” 按钮:
浏览器会新建一个标签并访问我们的网站首页:
这就是一个最基本的 Web 网站的样式,在后面的实验中我们会基于此深入学习。

总结

本节实验内容较为简单,主要介绍了 Flask Web 框架的特点,以及实验环境的准备工作。在实验环境中更新 pip 和 virtualenv ,并使用后者创建了虚拟环境。在虚拟环境中编写了一个 Flask Web 应用,并成功启动。
下一节实验我们继续深入学习 Flask 的配置、映射类的编写等操作。

👇👇👇点击阅读原文,学习完整课程内容~