刚开始开发Web的时候,没太在意隔离虚拟环境,用了系统的那一套,Python2.7版本是系统自带的,虽说明年就结束了,但是现在开发都会有一套3.x以上的环境,即使你开发不注意,你部署的时候总归是要隔离出来的。
1.方便隔离,不同环境编写测试
2.方便迁移,pip freeze
到出包文件依赖,随后提交管理和迁移都很方便
前提是你有两套Python
mikejingdeMacBook-Pro:~ MKJ$ which python
/usr/bin/python
mikejingdeMacBook-Pro:~ MKJ$ which python3
/usr/local/bin/python3
Python将所有三方包托管到一个公共仓库,任何人都能从这个公共仓库下载并安装所有的三方包。Python将三方包公共仓库命名为PyPI以表示Python Package Index的缩写(被一些人戏称为"cheese shop")。从PyPI上安装三方包非常简单,Python专门提供了一个名为pip的工具来解决这个问题(Python2.7中不含pip工具,需要单独安装)
mikejingdeMacBook-Pro:~ MKJ$ pip list
-bash: pip: command not found
mikejingdeMacBook-Pro:~ MKJ$ pip3 list
Package Version
---------- -------
pip 18.1
setuptools 40.5.0
wheel 0.32.2
可以看到Python2.7不会自带pip,3的话就会自带上面三个包。
为了解决维护不同应用程序对应不同版本的问题,Python使用了虚拟环境的概念。 虚拟环境是Python解释器的完整副本。在虚拟环境中安装三方包时只会作用到虚拟环境,全局Python解释器不受影响。 那么,就为每个应用程序安装各自的虚拟环境吧。
首先我们看下是否在各自环境下有安装virtualenv
bogon:~ MKJ$ pip list
bogon:~ MKJ$ pip3 list
Package Version
---------- -------
pip 18.1
setuptools 40.5.0
virtualenv 16.6.1
wheel 0.32.2
bogon:~ MKJ$
没有的话
pip install virtualenv
1.创建虚拟环境目录
mkdir flask_project
cd flask_project
2.到底是副本出Python2还是Python3虚拟环境
你想创建哪套虚拟环境可以根据 -p
指定,首先可以用which python
,which python3
拿到执行文件目录
virtualenv venv # 该方法默认用系统2.7创建出虚拟环境
virtualenv -p /usr/local/bin/python3 venv # 指定Python3创建出虚拟环境
3.激活/关闭
# 激活
source venv/bin/activate
# 或者
# . venv/bin/activate
# 激活后此时你的终端前缀就变化了
# deactivate 是关闭环境
4.以Django为例创建一个Hello world
退出后每次进去venv
文件夹目录,然后 . /venv/bin/activate
后启动虚拟环境,随后安装
pip install django
,以下是虚拟环境下包,和全局的2.7或者3.x的不会有任何交叉,独立的
(venv) mikejingdeMacBook-Pro:django-project MKJ$ pip list
Package Version
---------- -------
Django 2.2.2
pip 19.1.1
pytz 2019.1
setuptools 41.0.1
sqlparse 0.3.0
wheel 0.33.4
这里这是简单的写个Django的Hello World,具体细节和为什么就不在这里说了,以后有空再写博客出来介绍
5.启动项目
django-admin startproject mysite
6 .创建app
python manage.py startapp blogs
7 .进入app模块创建urls.py
from django.urls import path
from . import views
app_name = "blogs"
urlpatterns = [
path('', views.index, name= 'index')
]
8 .编写views.py
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse('Hello World')
9 .blogs同级目录下的mysite中编写urls路由
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('blogs/', include('blogs.urls'))
]
10 .回到manage.py
目录下启动服务
python manage.py runserver
11.打开127.0.0.1:8000/blogs
就能看到我们上面写的第一个 Django编写的Hello world
Python版本低于3.4,默认是不支持一下方式创建虚拟环境
1.创建目录
mkdir flask-project
cd flask-project
2.安装虚拟环境
python3 -m venv venv
使用这个命令来让Python运行venv包,它会创建一个名为venv的虚拟环境。 命令中的第一个“venv”是Python虚拟环境包的名称,第二个是要用于这个特定环境的虚拟环境名称。 如果你觉得这样很混乱,可以用你自定义的虚拟环境名字替换第二个venv。我习惯在项目目录中创建了名为venv的虚拟环境,所以无论何时cd到一个项目中,都会找到相应的虚拟环境。
3.激活虚拟环境安装Flask
. venv/bin/activate # 启动
pip install flask # 安装flask
4.创建Flask应用
应用程序是存在于包中的。 在Python中,包含__init__.py文件的子目录被视为一个可导入的包。 当你导入一个包时,init.py会执行并定义这个包暴露给外界的属性。
mkdir app # 创建应用文件夹
cd app
# 创建 __init__.py
from flask import Flask
app = Flask(__name__)
from app import routes
# 创建 routes.py
from app import app
@app.route('/')
@app.route('/index')
def index():
return "Hello, World!"
其一,这里有两个实体名为app。 app包由app目录和__init__.py脚本来定义构成,并在from app import routes语句中被引用。 app变量被定义为__init__.py脚本中的Flask类的一个实例,以至于它成为app包的属性。
其二,routes模块是在底部导入的,而不是在脚本的顶部。 最下面的导入是解决循环导入的问题,这是Flask应用程序的常见问题。 你将会看到routes模块需要导入在这个脚本中定义的app变量,因此将routes的导入放在底部可以避免由于这两个文件之间的相互引用而导致的错误。
那么在routes模块中有些什么? 路由是应用程序实现的不同URL。 在Flask中,应用程序路由的处理逻辑被编写为Python函数,称为视图函数。 视图函数被映射到一个或多个路由URL,以便Flask知道当客户端请求给定的URL时执行什么逻辑。
函数上面的两个奇怪的@app.route行是装饰器,这是Python语言的一个独特功能。 装饰器会修改跟在其后的函数。 装饰器的常见模式是使用它们将函数注册为某些事件的回调函数。 在这种情况下,@app.route修饰器在作为参数给出的URL和函数之间创建一个关联。 在这个例子中,有两个装饰器,它们将URL /和/index索引关联到这个函数。 这意味着,当Web浏览器请求这两个URL中的任何一个时,Flask将调用该函数并将其返回值作为响应传递回浏览器。这样做是为了在运行这个应用程序的时候会稍微有一点点意义。
5 .创建脚本
回到flask-project
,创建一个manage.py的文件,加入
from app import app
Flask应用程序实例被称为app,是app包的成员。from app import app语句从app包导入其成员app变量。
flask-project/
venv/
app/
__init__.py
routes.py
manage.py
6 .设置Flask环境变量
export FLASK_APP=manage.py
7 .启动
(venv) mikejingdeMacBook-Pro:flask_project MKJ$ flask run
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
8 .环境变量设置
上面的环境变量是临时的,你如果喜欢可以每次设置,如果永久的话需要安装如下
从 1.0 版本开始,Flask 允许你设置只会在运行flask命令时自动注册生效的环境变量,要实现这点,你需要安装 python-dotenv:
(venv) $ pip install python-dotenv
此时,在项目的根目录下新建一个名为 .flaskenv 的文件,其内容是:
FLASK_APP=manage.py
Pytharm --- Preference --- Project.xxx --- Project Interpreter
就是我们工程虚拟环境的配置项
参考文档
Flask文档