一、虚拟环境
使用虚拟环境的目的:
到目前为止,我们所有的第三方包安装都是直接通过pip install xx的方式进行安装的,这样会将那个包安装到系统级的python环境中。但是有这样一个问题,比如我所用的Django是1.10.x的版本的,它无法兼容Django 0.9版本的,就导致在维护以前开发的项目时会出现一些问题。这时候我们可以通过虚拟环境来使自己的电脑同时拥有两套环境。
pipenv
windows安装pipenv
pip install pipenv
linux安装
pip install pipenv
配置环境变量
在创建虚拟环境前,为了方便之后对虚拟环境的管理,我们需要在环境变量中添加一个系统环境变量WORKON_HOME
这个环境变量能使之后创建的虚拟环境的安装包都进入它所指向的文件夹中。
创建并进入/退出/删除虚拟环境
pipenv shell #进入虚拟环境
exit #退出虚拟环境
pipenv --rm #删除整个环境 不会删除pipfile
小结:
在安装虚拟环境并试图创建并建立的时候,我遇到了一个路径错误的问题,主要原因是我曾经使用过anaconda,在注册表中一直保留着这个路径,在pipenv创建环境时自动使用了这个路径,由于我已将anaconda软件卸载,所以一直显示路径不合法。
解决方法:在注册表中找到相关信息并删除。
二、Flask简介
第一个flask程序
from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello_world():
return 'hellow world!'
if __name__=='__main__':
app.run()
点击运行,在浏览器中输入127.0.0.1:5000就可以看到hellow world!的字样。
进入debug模式
1. 设置debug模式
- app.run(debug=True)
- app.debug=True
- app.config.update(DEBUG=True)
- app.config[‘DEBUG’]=True
2. 配置文件 - 写死的方式:app.config(DEBUG=True)
- app.config.update(DEBUG=True SECRECT_KEY=xxxx)
- 创建一个config.py文件
import config
app.config.from_object(config)
app.config.from_object(‘config’)
app.config.from_pyfile(‘config.py’,silent=True
需要注意的是,只能在开发环境下开启DEBUG模式,因为DEBUG模式会带来非常大的安全隐患。
另外,在开启了DEBUG模式后,当程序有异常而进入错误堆栈模式,你第一次点击某个堆栈想查看变量值的时候,页面会弹出一个对话框,让你输入PIN值,这个PIN值在你启动的时候就会出现,比如在刚刚启动的项目中的PIN值为294-745-044,你输入这个值后,Werkzeug会把这个PIN值作为cookie的一部分保存起来,并在8小时候过期,8小时以内不需要再输入PIN值。这样做的目的是为了更加的安全,让调试模式下的攻击者更难攻击到本站。
三、URL与视图
URL与函数的映射
从之前的helloworld.py文件中,我们已经看到,一个URL要与执行函数进行映射,使用的是@app.route装饰器。@app.route装饰器中,可以指定URL的规则来进行更加详细的映射,比如现在要映射一个文章详情的URL,文章详情的URL是/article/id/,id有可能为1、2、3…,那么可以通过以下方式:
@app.route('/article/<id>/')
def article(id):
return "%s article detail" %id
尖括号是固定写法,语法为converter:variable;variable默认的数据类型是字符串。如果需要指定类型,则要携程converter:variable,其中converter是类型名称,可以有以下几种:
- string: 默认的数据类型,接受没有任何斜杠/的字符串。
- int: 整形
- float: 浮点型。
- path: 和string类似,但是可以传递斜杠/。
- uuid: uuid类型的字符串。
- any:可以指定多种路径。
@app.route('/<any(list,tuple):url_path>/')
def item(url_path):
return url_path
如果不想定制子路径来传递参数,也可以通过传统的?=的形式来传递参数,例如:/article?id=xxx,这种情况下,可以通过request.args.get(‘id’)来获取id的值。如果是post方法,则可以通过request.form.get(‘id’)来进行获取。