Flask学习(一)基础简介
1. 虚拟环境使用
相同的库在不同的项目中用到的版本不一致,为了维护方便,就可以通过虚拟环境来解决这种问题。
2. 创建虚拟环境
-
创建 项目文件夹Flask,并在同目录下创建envs文件夹。
-
添加envs文件的环境变量,环境变量名固定为 “WORKON_HOME”,添加此环境变量是为了生成虚拟环境的envs文件夹。
-
Win + R打开运行窗口,输入“cmd”回车,打开命令提示符,进入项目文件夹Flask,安装pipenv(以上述创建的文件夹为例)
>h:
>cd Flask
// 安装 pipenv 包
pip install pipenv
- 创建虚拟环境
// 生成虚拟环境指令,并进入创建的虚拟环境
pipenv shell
// 创建成功后显示为以下格式
(Flask-ST9PKd0K) H:\Flask>
// 在此路径下安装的包都在创建的虚拟环境中
(Flask-ST9PKd0K) H:\Flask>pip install Flask -i https://pypi.douban.com/simple
- PyCharm软件中,虚拟环境的设置:File->settings->Project Interpreter->Add->Existing environment选择刚刚创建的虚拟环境,应用保存即可。
3.Flask简介
Flask是一款非常流行的Python Web框架,出生于2010年,作者Arimin Ronacher。
Flask 特点:
- 微框架、简洁、只做他需要做的,给开发者提供了很大的扩展性;
- Flask和相应的插件写的会很好,用起来很方便;
- 开发效率非常高;
4. Pipfile文件简介
[[source]]
name = "pypi"
url = "https://pypi.org/simple" // 指定国内pip源,不然下载会很慢
verify_ssl = true
[dev-packages] // 开发环境
[packages] // 生产环境
django = "*" // *表示最新版本
[requires] // python版本
python_version = "3.6"
5.简单的一个Flask程序
from flask import Flask // 从flask框架中导入Flask类
app = Flask(__name__) // 传入__name__初始化一个Flask实例
@app.route('/') // app.route装饰器,映射url和执行函数。以下代码是将根url映射到了hello_world函数上
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(host='0.0.0.0',port=9000) // 运行项目,host=0.0.0.0可以让其他电脑也可以访问到该网站,port指定访问的端口。
6.设置debug模式
默认情况下flask不会开启debug模式,开启debug模式后,flask会在每次保存代码时自动的重新载入代码,如果代码有错误会在终端进行提示
开启debug模式的方式
- 直接在应用对象上设置
app.debug=True
app.run()
- 在config属性中设置
app.config.update(DEBUG=True)
app.run()
app.config.update({'DEBUG':'True'})
app.run()
- 在执行run方法的时候,传递参数进去
app.run(debug=True)
7.URL和视图
-
数据约束类型
string: 默认的数据类型,接受没有任何斜杠/的字符串
int : 整形// int:整型数据 @app.route('/page/<int:vid>') def article(vid): return '这是第{}页'.format(vid) // http://127.0.0.1:5000/page/5
string: 默认的数据类型,接受没有任何斜杠/的字符串。
// string:默认的数据类型,接受没有任何斜杠‘/’的字符 串。‘/’是作为参数的分割符,不能在后面添加‘/’。 @app.route('/content/<string:vid>/') // 严格结尾形式:后面加‘/’,这样运行时会在结尾自动添加‘/’,添加与不添加是两个不同的url。 def content(vid): return '文章的内容是{}'.format(vid) // http://127.0.0.1:5000/content/anhui/
float: 浮点型。
path: 和string类似,但是可以传递斜杠/。// path:和string类似,但可以传递斜杠‘/’ @app.route('/path/<path:vid>/') def path(vid): return '网络地址为{}'.format(vid) // http://127.0.0.1:5000/path/www.baidu.com/
uuid: uuid类型的字符串。
any: 可以指定多种路径// any:可以指定多种路径 @app.route('/<any(class,course,lesson):url_path>/') // 后面的url_path是固定写法 def information(url_path): return '当前访问内容为{}'.format(url_path) // http://127.0.0.1:5000/class/
“?=”构造路由方式
// 不制定子路径来传递参数,用‘?=’来传递参数,构造路由方式 @app.route('/address') def browser(): return request.args.get('id') // 如果是post方法,则可以通过request.form.get()来获取 // http://127.0.0.1:5000/address?id=baidu
-
构造URL
url_for()函数接收两个及以上的参数,接收函数名作为第一个参数,接受对应URL规则的命名参数,如果还出现其他的参数,则会添加到URL的后面作为查询参数。
通过构建URL的方式而选择直接在代码中拼URL的原因:
如果修改了url,但没有修改该url对应的函数名,就不用去替换url了;
url_for()函数会自动转义一些特殊字符和unicode字符串from flask import Flask, url_for app = Flask(__name__) @app.route('/') def hello_world(): // 使用url_for()通过url映射的函数名,去获得对应的url print(url_for('article', vid=1, title='python', pag=9, value=10.5)) // /txt/1/?title=python&pag=9&value=10.5 return 'hello world!' @app.route('/txt/<vid>/') def article(vid): // 通过‘hello_world’函数,获得该函数对应的url print(url_for('hello_world', next='/image')) // /?next=%2Fimage return '文章内容是{}'.format(vid) if __name__ == '__main__': app.run(debug=True)