Windows下使用Flask搭建虚拟环境并运行首个Web应用
本文详细讲解在Windows环境下,如何使用pipenv为Python 3.7.1项目搭建独立的虚拟环境,并在PyCharm中正确配置解释器。通过编写并运行第一个Flask应用程序,深入解析路由注册、视图函数、重定向机制以及HTTP响应头(Content-Type)对HTML和JSON返回值的控制方法,帮助开发者快速掌握Flask基础开发流程。
本教程的所有操作步骤均基于Windows操作系统,所使用的Python版本为3.7.1。
一、搭建虚拟环境
1.1 使用pipenv搭建虚拟环境
虽然也可以使用
virtualenv来创建虚拟环境,但由于该工具经常遇到安装失败的问题,本文推荐另一种更稳定的安装方式,并通过cmd命令行执行以下操作。
首先安装pipenv工具:pip install pipenv
接着创建用于存放项目的目录:mkdir app
切换至该目录:cd app
在目录中初始化并安装环境依赖:pipenv install
激活并进入虚拟环境:pipenv shell

6. 查看当前虚拟环境中已安装的Python包列表:pip list

1.2 为虚拟环境安装其他依赖包
为了使用Flask框架,执行以下命令进行安装:pipenv install flask。如果需要安装其他库(如requests、pymysql等),操作方式与此相同。
1.3 pipenv常用命令一览表
| 命令 | 功能 |
|---|---|
| pipenv install | 初始化虚拟环境 |
| pipennv | 进入虚拟环境 |
| pipenv install xxx (uninstall xxx) | 为虚拟环境安装(删除)包 |
| exit | 退出虚拟环境 |
| pipenv graph | 查看包之间的依赖关系 |
二、在开发工具中配置虚拟环境
本教程使用的开发工具为PyCharm社区版。
2.1 查找虚拟环境路径
执行命令以查看pipenv虚拟环境的具体安装路径,我的环境安装在如下位置。
2.2 在开发工具中配置虚拟环境
打开PyCharm的设置界面,找到Setting选项。

在设置中找到Python解释器(Python Interpreter),点击添加虚拟环境,并选择刚才查询到的路径即可完成配置。
三、编写第一个Flask程序
3.1 运行第一个Flask应用程序
仅需三行核心代码即可实现最简单的Flask应用。
#!/usr/bin/python
# -*- coding: utf-8 -*-
#file: app.py
#@author: Gorit
#@contact: gorit@qq.com
#@time: 2020/2/26 9:08
from flask import Flask
app = Flask(__name__) # 实例化 flask , __name__ 会作为 app 核心的一个标识,这个可以为任意的字符串
@app.route('/hello') # 使用路由,给 hello 函数定义一个路由,然后游览器通过http 请求得到相对应的数据
def hello(): # hello 是视图函数,也是 mvc 中的 controller
return "Hello World"
app.run()
随后在虚拟环境中执行python app.py,即可在浏览器访问http://127.0.0.1:5000启动Flask应用。但直接访问会发现页面空白,这是因为代码中定义了特定路由,因此需要将访问路径修改为http://127.0.0.1:5000/hello,此时即可在网页中看到“Hello World”字符串。
3.2 Flask中的路由重定向机制
沿用上述代码,我们进行微小调整。
from flask import Flask
app = Flask(__name__)
@app.route('/hello/') # 我们在路由这里多加入一个斜杠
def hello():
return "Hello World"
app.run()
正常启动程序后,

若将路径修改为:127.0.0.1:5000/hello,按回车后页面会出现短暂跳转,随后显示正常状态。

打开浏览器F12开发者工具,切换到Network(网络)选项卡,可以发现这里产生了两个网络请求。

查阅相关资料可知,当输入/hello时,Python Flask会自动执行永久重定向处理。
3.3 另一种路由注册方式
我们使用app.route("/hello")作为访问界面,但通过Ctrl加鼠标左键点击route,可以查看其源码。实际上,route是作为装饰器被使用的。

重点在于下方的实现方式,路由的核心功能实际上是通过设置add_url_rule(..)路由规则来实现的。

因此,我们也可以采用另一种方法设置路由,这种方式同样易于使用:第一个参数设置路径,第二个参数指定视图函数,即hello()。
from flask import Flask
app = Flask(__name__)
# @app.route('/hello/')
def hello():
return "Hello World"
app.add_url_rule('/hello',view_func=hello)
if __name__ == '__main__':
app.run()
第二种使用场景通常多见于基于类的视图,即采用面向对象的方式编写Flask应用程序。
3.4 修改Flask运行参数
app.run()方法包含三个关键参数,我们可以逐一调整。
- 开启Debug模式(这样Flask会自动重启服务器,无需手动重启)。
- 指定启动端口(默认端口为5000,可手动修改)。
- 改变主机绑定(默认是127.0.0.1,若需部署到服务器,可将host改为0.0.0.0,并关闭防火墙,以便外网访问)。
from flask import Flask
app = Flask(__name__)
@app.route('/hello')
def hello():
return "Hello World"
if __name__ == '__main__':
app.run(host="localhost", debug=True,port=9999)
随后运行http://localhost:9999/hello。
即可看到应用内容。
3.5 如何正确显示HTML标签?
尝试将hello视图函数中返回的内容改为HTML标签,观察效果。
from flask import Flask
app = Flask(__name__)
@app.route('/hello/')
def hello():
return "<html></html>"
if __name__ == '__main__':
app.run()
实际上,页面不会显示任何渲染后的HTML,这是请求头(Headers)的问题。
Flask请求头的内容包括:
- 状态码(status code)
- Content-Type HTTP头部信息
由于请求头中的Content-Type已指定默认值,HTML标签无法像纯字符串那样直接显示。此时需要手动修改请求头信息,操作如下。
from flask import Flask,make_response
app = Flask(__name__)
@app.route('/hello')
def hello():
# 手动创建 response
headers = {
"content-type": "text/html", # plain 当成普通的字符串,plain 改后才能 html 就可以正常的显示 html 标签的内容
}
return '<html><body><font color="red">你好,世界</font></body></html>', 200, headers
if __name__ == '__main__':
app.run()
OK,这样即可正常显示HTML标签中的内容,但字体可能不正确,这涉及编码格式问题。

其他类型的Content-Type设置:
- content-type: “text/plain” 将返回数据视为普通字符串。
- “content-type”:“application/json” 用于API开发,指定返回JSON格式数据。
3.6 重定向的高级应用
我们可以在headers中加入location参数,当用户加载指定路径时,自动跳转到其他页面。
from flask import Flask,make_response
app = Flask(__name__)
app.config.from_object('config')
@app.route('/hello')
def hello():
headers = {
"content-type": "text/plain", # plain 当成普通的字符串
# "content-type":"application/json" 使用 api, 指定返回 json 格式的数据
"location": "https://www.bing.com"
}
# 同样实现 跳转效果,控制响应状态码
return '<html></html>', 301, headers
if __name__ == '__main__':
app.run()
到此,关于Flask搭建虚拟环境并运行第一个Flask程序的介绍结束。更多相关Flask环境搭建内容,请搜索本站往期文章或继续浏览后续相关文章,希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









